⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.lst

📁 此代码是ucos-II在凌阳61单片机上的移植
💻 LST
📖 第 1 页 / 共 3 页
字号:
                            	// 堆栈结构:
                            	//   任务堆栈:                             系统堆栈:  OSStkStart -> |        | |
                            	//             ----------                                       SP ->    ----------
                            	//             |OSTCBCur|                                       /---->|        | |
                            	//             ----------                                       |      ----------
                            	//                 |                                            |
                            	//                 |                                            | 
                            	//                 \---->|OSTCBCur->OSTCBStkPtr|                |
                            	//                       -----------------------                |
                            	//                                 |                            |
                            	//                                 |           ----------       |
                            	//                                 |           |        | |<-----
                            	//                                 |           ----------
                            	//                                 \---------->|  长度  | 低地址
                            	//                                             ----------  
                            	//****************************************************************
                            	
00008FA9                    	.code
                            	_OSStartHighRdy:
00008FA9 40 F0 31 8F        		CALL _OSTaskSwHook
                            	OSCtxSw_in:	
                            		// OSTCBStrPtr -->R1
                            		// OSTCBStrPtr 是TCB结构的第一项,所以就是OSTCBCur指想的内存单元
                            		// R1为任务堆栈的头指针
00008FAB 11 93 52 00        		R1=[_OSTCBCur]
                            		// R2中为任务堆栈头地址存放的第一条内容,是堆栈的长度
00008FAD C1 92              		R1=[R1]
00008FAE C1 94              		R2=[R1]
                            		// R3为系统堆栈的高位地址+1
00008FAF 72 96              		R3=OSStkStart
                            	restore_stack:
00008FB0 41 02              		R1+=1
00008FB1 41 26              		R3-=1
00008FB2 C1 98              		R4=[R1]
00008FB3 C3 D8              		[R3]=R4
00008FB4 41 24              		R2-=1
00008FB5 46 4E              		JNZ restore_stack
                            		// 调整堆栈指针
00008FB6 41 26              		R3-=1
00008FB7 03 91              		SP=R3
                            		// OSRunning =TRUE
00008FB8 41 92              	 	R1=0x0001
00008FB9 19 D3 50 00        		[_OSRunning]=R1
                           1		POPALL
00008FBB 88 90             1		POP R1 from [sp]
00008FBC 88 92             1		POP R2 from [sp]
00008FBD 88 94             1		POP R3 from [sp]
00008FBE 88 96             1		POP R4 from [sp]
00008FBF 88 98             1		POP R5 from [sp]
00008FC0 42 F1              		INT FIQ
                            		
00008FC1 41 F1              		INT IRQ
00008FC2 98 9A              		RETI
                            	//***************************************************************
                            	_OSCtxSw:
                            		// 将所有寄存器压栈
                           1		PUSHALL
00008FC3 88 DA             1		PUSH R5 to [sp]
00008FC4 88 D8             1		PUSH R4	to [sp]
00008FC5 88 D6             1		PUSH R3 to [sp]
00008FC6 88 D4             1		PUSH R2 to [sp]
00008FC7 88 D2             1		PUSH R1 to [sp]
                            		
                            	OSIntCtxSw_in:
                            		// 求出系统堆栈的长度 ,并将其存入 R2
00008FC8 00 93              		R1=SP
00008FC9 72 94              		R2=OSStkStart
00008FCA 41 02              		R1+=1
00008FCB 01 25              		R2=R2-R1
                            		// R1 <-- OSTCBStkPtr
                            	    // R1 为任务堆栈的头指针
00008FCC 11 93 52 00        		R1=[_OSTCBCur]
                            		// 首先将系统堆栈长度保存在任务堆栈中
00008FCE C1 92              		R1=[R1]
00008FCF C1 D4              		[R1]=R2
                            		// 得到堆栈的起始地址
00008FD0 72 96              		R3=OSStkStart
                            		// 保存系统堆栈到任务堆栈
                            	save_stack:
00008FD1 41 26              		R3-=1
00008FD2 41 02              		R1+=1
00008FD3 C3 98              		R4=[R3]
00008FD4 C1 D8              		[R1]=R4
00008FD5 41 24              		R2-=1
00008FD6 46 4E              		JNZ save_stack
00008FD7 40 F0 31 8F        		CALL _OSTaskSwHook
                            		// OSTCBCur = OSTCBHighRdy
00008FD9 11 93 54 00        		R1=[_OSTCBHighRdy]
00008FDB 19 D3 52 00        		[_OSTCBCur]=R1
                            		// OSPrioCur = OSPrioHighRdy
00008FDD 11 93 4C 00        		R1=[_OSPrioHighRdy]
00008FDF 19 D3 4B 00        		[_OSPrioCur]=R1
00008FE1 77 EE              		JMP OSCtxSw_in
                            		
                            	//*********************************************************************
                            	//               仅需调整SP指针,然后进行任务切换
                            	//*********************************************************************
                            	
                            	_OSIntCtxSw:
00008FE2 00 93              		R1=SP
00008FE3 47 02              		R1+=0x0007    //多压栈的偏移量,由于不懂凌阳编译器的编译原理,该量是
                            		              // 郁闷了 n 久才调出来的,呜呜~~~ 
00008FE4 01 91              		SP=R1
                            	
00008FE5 5E EE              		JMP OSIntCtxSw_in
                            	
                            	//********************************************************************
                            	//               打开SPACE061A的时间基准信号中断
                            	//********************************************************************
                            	_OSTickISR:
00008FE6 41 92              		R1=0x0001
00008FE7 19 D3 10 70        		[P_INT_Ctrl]=R1
00008FE9 90 9A              		RETF
                            	
                            	
                            	//********************************************************************
                            	// 该中断采用SPACE061A的时间基准信号产生调度信号
                            	// 注意要 在程序开始前对该中断初始化
                            	//********************************************************************
00008111                    	.text
                            	.public _IRQ6
                            	_IRQ6:
00008111 00 EE              		nop 
                           1		PUSHALL
00008112 88 DA             1		PUSH R5 to [sp]
00008113 88 D8             1		PUSH R4	to [sp]
00008114 88 D6             1		PUSH R3 to [sp]
00008115 88 D4             1		PUSH R2 to [sp]
00008116 88 D2             1		PUSH R1 to [sp]
00008117 41 92              		R1=0x0001
00008118 11 C3 10 70        		test R1,[P_INT_Ctrl]
0000811A 09 5E              		JZ OUT
                            		
0000811B 41 92              		R1=0x0001
0000811C 19 D3 11 70        		[P_INT_Clear]=R1
                            		
0000811E 40 F0 A2 84        		CALL _OSIntEnter
00008120 40 F0 03 88        		CALL _OSTimeTick
00008122 40 F0 B1 84        		CALL _OSIntExit
                            	
                            	OUT:
00008124 41 92              	    R1=0x0001
00008125 19 D3 11 70        		[P_INT_Clear]=R1
                           1	  	POPALL
00008127 88 90             1		POP R1 from [sp]
00008128 88 92             1		POP R2 from [sp]
00008129 88 94             1		POP R3 from [sp]
0000812A 88 96             1		POP R4 from [sp]
0000812B 88 98             1		POP R5 from [sp]
0000812C 98 9A              		RETI
                            	//**********************************************************************
                            	//		                  用户函数写在下面
                            	//
                            	//**********************************************************************
                            	
                            	.public _SerialInit
                            	_SerialInit:
0000812D 09 93 80 04        		R1=0x0480
0000812F 19 D3 08 70        		[P_IOB_Attrib]=R1
00008131 09 93 00 04        		R1=0x0400
00008133 19 D3 07 70        		[P_IOB_Dir]=R1
                            		
00008135 40 92              		R1=0x0000
00008136 19 D3 24 70        		[P_UART_BaudScalarLow]=R1
00008138 45 92              		R1=0x0005
00008139 19 D3 25 70        		[P_UART_BaudScalarHigh]=R1
0000813B 40 92              	    R1=0x0000
0000813C 19 D3 21 70        	    [P_UART_Command1]=R1
0000813E 09 93 C0 00        	    R1=0x00c0
00008140 19 D3 22 70        	    [P_UART_Command2]=R1
00008142 90 9A              	    retf
                            	
                            	.public _Output
                            	_Output:
00008143 40 F1              	    INT OFF
                            	    
00008144 00 9B              		bp=sp
00008145 03 92              		R1=[bp+3]
00008146 04 94              		R2=[bp+4]
                            	TxRDY:
00008147 14 99 22 70        		R4=[P_UART_Command2]
00008149 0C B9 40 00        		r4&=0x0040
0000814B 45 5E              		JZ TxRDY
0000814C C1 96              		R3=[R1]
0000814D 1B D7 23 70        		[P_UART_Data]=R3
0000814F 41 02              		R1+=1
00008150 41 24              		R2-=1
00008151 4B 4E              		JNZ TxRDY
00008152 42 F1              		INT FIQ
00008153 41 F1              		INT IRQ
00008154 90 9A              		retf
                            		
0 error(s), 0 warning(s).

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -