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

📄 os_cpu_a.lst

📁 这是针对凌阳SPCE061A芯片的一个uCOS系统的移植包
💻 LST
字号:
Sunplus u'nSP Assembler - Ver. 1.14.3.1
              Listing File Has Been Relocated
                            	.include  hardware.inc
                     <      	.DEFINE	P_IOA_Data   		0x7000         // Write Data into data register and read from IOA pad
                     <      	.DEFINE P_IOA_Buffer        0x7001         // Write Data into buffer register and read from buffer register
                     <      	.DEFINE P_IOA_Dir           0x7002         // Direction vector for IOA
                     <      	.DEFINE P_IOA_Attrib        0x7003         // Attribute vector for IOA
                     <      	.DEFINE P_IOA_Latch         0x7004         // Latch PortA data for key change wake-up
                     <      	
                     <      	.DEFINE P_IOB_Data         	0x7005         // Write Data into the data register and read from IOB pad
                     <      	.DEFINE P_IOB_Buffer        0x7006         // Write Data into buffer register and read from buffer register
                     <      	.DEFINE P_IOB_Dir           0x7007         // Direction vector for IOB
                     <      	.DEFINE P_IOB_Attrib        0x7008         // Attribute vector for IOB
                     <      	
                     <      	.DEFINE P_FeedBack          0x7009         // Clock form external R,C
                     <      	.DEFINE P_TimerA_Data       0x700A         // Data port for TimerA 
                     <      	.DEFINE P_TimerA_Ctrl       0x700B         // Control Port for TimerA
                     <      	.DEFINE P_TimerB_Data       0x700C         // Data port for TimerB
                     <      	.DEFINE P_TimerB_Ctrl       0x700D         // Control Port for TimerB
                     <      	.DEFINE P_TimeBase_Setup    0x700E         // TimerBase Freq. Set
                     <      	.DEFINE P_TimeBase_Clear	0x700F 		   // Reset Timerbase counter
                     <      	.DEFINE P_INT_Ctrl          0x7010         // Control port for interrupt source
                     <      	.DEFINE P_INT_Ctrl_New      0x702D;
                     <      	.DEFINE P_INT_Clear         0x7011         // Clear interrupt source
                     <      	.DEFINE P_Watchdog_Clear    0x7012         // Watchdog Reset
                     <      	.DEFINE P_SystemClock       0x7013         // Change system clock frequency(include go to standby mode)
                     <      	
                     <      	//... PA6442 New version MC52A (For EC-03)....
                     <      	.DEFINE P_ADC 	        	0x7014         	// Data Port for AD
                     <      	.DEFINE P_ADC_Ctrl          0x7015         	// Control Port for AD control
                     <      	.DEFINE P_ADC_Status        0x7015         	// AD Port Status
                     <      	.DEFINE P_DAC2              0x7016         	// Data Port for DAC2
                     <      	.DEFINE P_PWM               0x7016         	// Data Port for PWM
                     <      	.DEFINE P_DAC1	        	0x7017         	// Data Port for DAC1
                     <      	.DEFINE P_DAC_Ctrl			0x702A 			// Control Port for two DAC and audio output mode
                     <      	//............................................
                     <      	
                     <      	.DEFINE P_IR_Ctrl			0x7018 			// Control Port for IR
                     <      	.DEFINE P_LVD_Ctrl          0x7019         	// Control Port for LVD
                     <      	.DEFINE P_SIO_Data			0x701A 			// Data port for serial IO
                     <      	.DEFINE P_SIO_Addr_Low		0x701B 			// Address Port low
                     <      	.DEFINE P_SIO_Addr_Mid		0x701C 			// Address Port middle
                     <      	.DEFINE P_SIO_Addr_High	 	0x701D 			// Address Port high
                     <      	.DEFINE P_SIO_Ctrl			0x701E 			// Control Port
                     <      	.DEFINE P_SIO_Start			0x701F 			// Start port for serial interface
                     <      	.DEFINE P_SIO_Stop			0x7020 			// Stop port for serial interface
                     <      	
                     <      	.DEFINE P_UART_Command1		 0x7021 		// Command1 Port for UART
                     <      	.DEFINE P_UART_Command2		 0x7022 		// Command2 Port for UART
                     <      	.DEFINE P_UART_Data			 0x7023  		// Data Port for UART
                     <      	.DEFINE	P_UART_BaudScalarLow 0x7024 		// Set Baud Rate scalar low
                     <      	.DEFINE	P_UART_BaudScalarHigh 0x7025 		// Set Baud Rate scalar high
                     <      	
                     <      	
                     <      	//... Definitions for P_INT_Ctrl ..............
                     <      	.DEFINE C_IRQ6_TMB2             0x0001         	// Timer B IRQ6
                     <      	.DEFINE C_IRQ6_TMB1             0x0002         	// Timer A IRQ6
                     <      	.DEFINE C_IRQ5_2Hz              0x0004         	// 2Hz IRQ5
                     <      	.DEFINE C_IRQ5_4Hz              0x0008         	// 4Hz IRQ5
                     <      	.DEFINE C_IRQ4_1KHz             0x0010         	// 1024Hz IRQ4
                     <      	.DEFINE C_IRQ4_2KHz             0x0020         	// 2048Hz IRQ4
                     <      	.DEFINE C_IRQ4_4KHz             0x0040         	// 4096Hz IRQ4
                     <      	.DEFINE C_IRQ3_KEY              0x0080         	// Key Change IRQ3
                     <      	.DEFINE C_IRQ3_EXT1             0x0100         	// Ext1 IRQ3
                     <      	.DEFINE C_IRQ3_EXT2             0x0200         	// Ext2 IRQ3
                     <      	.DEFINE C_IRQ2_TMB              0x0400         	// Timer B IRQ2
                     <      	.DEFINE C_FIQ_TMB               0x0800         	// Timer B FIQ
                     <      	.DEFINE C_IRQ1_TMA              0x1000         	// Timer A IRQ1
                     <      	.DEFINE C_FIQ_TMA               0x2000         	// Timer A FIQ
                     <      	.DEFINE C_IRQ0_PWM              0x4000         	// PWM IRQ0
                     <      	.DEFINE C_FIQ_PWM               0x8000         	// PWM FIQ
                            	.EXTERNAL _OSTaskSwHook;
                            	.EXTERNAL _OSIntEnter
                            	.EXTERNAL _OSTimeTick
                            	.EXTERNAL _OSIntExit
                            	.EXTERNAL _OSTCBCur
                            	.EXTERNAL _OSTCBHighRdy
                            	.EXTERNAL _OSRunning
                            	.EXTERNAL _OSPrioHighRdy
                            	.EXTERNAL _OSPrioCur
                            	.EXTERNAL _OSIntNesting
                            	.EXTERNAL _InterruptC
                            	
0000A113                    	.CODE 
                            	.PUBLIC _OSStartHighRdy
                            	_OSStartHighRdy:
0000A113 40 F0 C2 A0        			CALL  _OSTaskSwHook
                            			
0000A115 41 92              			R1=0x0001            //将系统运行标志置1,表示系统开始运行,可以进行任务调度
0000A116 19 D3 0B 01        			[_OSRunning]=R1
                            			
0000A118 11 93 8F 01        			R1=[_OSTCBCur]       //取得当前可以运行的任务的TCB块首地址
0000A11A C1 90              			SP=[R1]              //在TCB块的首地址(第一项)中存放的是该任务的堆栈地址
0000A11B 88 90              			POP R1 FROM [SP]
0000A11C 19 D3 EE 03        			[_InterruptC]=R1      //弹出该任务的中断开关次数标志
0000A11E A8 90              			POP R1,R5 FROM [SP]
0000A11F 98 9A              			RETI
                            	
                            	
                            	.PUBLIC _OSCtxSw
                            	_OSCtxSw:
0000A120 A8 DA              			PUSH R1,R5 TO [SP]            //调用子程序时会自动将PC,SR压入栈中,不需要再保存 
0000A121 11 93 EE 03        			R1=[_InterruptC]
0000A123 88 D2              			PUSH R1 TO [SP]               //压入该任务的中断开关次数标志 
                            			
                            			//保存即将挂起任务的堆栈地址
0000A124 12 95 8F 01        			R2=[_OSTCBCur]                //取得当前任务(即将挂起的任务)的TCB首地址      
0000A126 C2 D0              			[R2]=SP                       //在TCB的第一项(首地址)中保存堆栈地址
0000A127 40 F0 C2 A0        			CALL _OSTaskSwHook
                            			
                            			//OSUCBCur=OSTCBHighRdy
0000A129 09 93 8F 01        			R1=_OSTCBCur                  //取得 OSTCBCur的地址
0000A12B 12 95 91 01        			R2=[_OSTCBHighRdy]            //取得 OSTCBHighRdy所指向的TCB的首地址
0000A12D C1 D4              			[R1]=R2                       //将优先级最高的就绪态任务的TCB的首地址赋予 OSTCBCur
                            			
                            			//OSPrioCur=OSPrioHighRdy
0000A12E 11 93 05 01        			R1=[_OSPrioHighRdy]            
0000A130 19 D3 04 01        			[_OSPrioCur]=R1
                            			
                            			//切换至新的任务堆栈
0000A132 11 93 91 01        			R1=[_OSTCBHighRdy]            //取得将要运行的任务的TCB块的首地址(其中放置了该任务的堆栈地址)
0000A134 C1 90              			SP=[R1]
0000A135 88 90              			POP R1 FROM [SP]
0000A136 19 D3 EE 03        			[_InterruptC]=R1               //弹出将要运行的任务的中断开关次数
0000A138 40 42              			CMP R1,0                      //查看是否需要开中断
0000A139 01 4E              			JNE KAI                       //如果任务原先是关中断下被挂起,则直接返回
0000A13A 41 F1              			INT IRQ                       //否则开中断返回
0000A13B A8 90              	KAI:	POP R1,R5 FROM [SP]           
0000A13C 98 9A              			RETI
                            	
                            			
                            	.PUBLIC _OSIntCtxSw
                            	_OSIntCtxSw:                          //将发生任务切换,将要挂起的任务的所有的寄存器包括堆栈地址已经保存
0000A13D 40 F0 C2 A0        			CALL _OSTaskSwHook
                            	
                            			//OSUCBCur=OSTCBHighRdy
0000A13F 09 93 8F 01        			R1=_OSTCBCur                   
0000A141 12 95 91 01        			R2=[_OSTCBHighRdy]
0000A143 C1 D4              			[R1]=R2
                            			
                            			//OSPrioCur=OSPrioHighRdy
0000A144 11 93 05 01        			R1=[_OSPrioHighRdy]            
0000A146 19 D3 04 01        			[_OSPrioCur]=R1
                            			
                            			//切换至新的任务堆栈
0000A148 11 93 91 01        			R1=[_OSTCBHighRdy]             
0000A14A C1 90              			SP=[R1]
                            			
0000A14B 88 90              			POP R1 FROM [SP]             //弹出将要运行任务的中断开关次数标志
0000A14C 19 D3 EE 03        			[_InterruptC]=R1
0000A14E 40 42              			CMP R1,0                      //查看是否需要关中断
0000A14F 01 5E              			JE KAI1                       //如果任务原先是关中断下被挂起
0000A150 48 F1              			IRQ OFF                       //则关中断返回
0000A151 A8 90              	KAI1:	POP R1,R5 FROM [SP]
0000A152 98 9A              			RETI
                            	
                            	
                            	.PUBLIC _InitSystem
                            	_InitSystem:
0000A153 40 F1              			INT OFF
0000A154 A8 DA              			PUSH R1,R5 to [SP]
0000A155 09 93 FF FF        			R1 = 0xFFFF 				//设定IOB口为同相输出口;
0000A157 19 D3 08 70        			[P_IOB_Attrib] = R1 
0000A159 19 D3 07 70        			[P_IOB_Dir] = R1 
0000A15B 19 D3 05 70        			[P_IOB_Data] = R1 
                            			
                            			//R1=0xFFFF
0000A15D 19 D3 0E 70        			[P_TimeBase_Setup]=R1       //设置64Hz TMB1
                            			
0000A15F 42 92              			R1 = 0x0002			        //开中断IRQ6_TMB1,64Hz
0000A160 19 D3 10 70        			[P_INT_Ctrl] = R1 
0000A162 19 D3 2D 70        			[P_INT_Ctrl_New] = R1
                            			
0000A164 41 F1              			INT	IRQ                     //开中断并返回
0000A165 A8 90              			POP R1,R5 from [SP] 		
0000A166 90 9A              			RETF
                            	
                            	.public _display
                            	_display:
0000A167 A8 DA              			PUSH R1,R5 to [SP]
0000A168 08 03 08 00        			R1=SP+8
0000A16A C1 92              			R1=[R1]
0000A16B 19 D3 05 70        			[P_IOB_Data]=R1
0000A16D A8 90              			POP R1,R5 from [SP]
0000A16E 90 9A              			RETF		
                            				
00008125                    	.TEXT
                            	.PUBLIC _IRQ6
                            	_IRQ6:
00008125 A8 DA              			PUSH R1,R5 TO [SP]
00008126 42 92              			R1=0x0002
00008127 19 D3 11 70        			[P_INT_Clear]=R1   //清中断标志
                            			
00008129 40 F0 45 81        			CALL _Clear_Dog    //清看门狗
                            	    	
0000812B 11 93 02 01        			R1=[_OSIntNesting]   //中断嵌套标志加1
0000812D 41 02              			R1+=1
0000812E 19 D3 02 01        			[_OSIntNesting]=R1
                            			
00008130 41 42              			CMP R1,1            
00008131 06 4E              			JNE TCB             //如果没有发生嵌套中断
00008132 11 93 EE 03        			R1=[_InterruptC]     //保存中断开关次数标志
00008134 88 D2              			PUSH R1 TO [SP]
00008135 12 95 8F 01        			R2=[_OSTCBCur]      //则保存当前堆栈地址
00008137 C2 D0              			[R2]=SP
                            			
00008138 40 F0 C4 83        	TCB:	CALL _OSTimeTick
0000813A 40 F0 B0 82        			CALL _OSIntExit
                            			
0000813C 11 93 02 01        			R1=[_OSIntNesting]
0000813E 40 42              			CMP R1,0
0000813F 03 4E              			JNE TCB1            //不等于0则表示为中断嵌套返回
00008140 88 90              			POP R1 FROM [SP]    //如果能执行到此,则说明不需要进行任务切换,也就无需进行开关中断处理
00008141 19 D3 EE 03        			[_InterruptC]=R1    //但需要弹出中断计数器以调整堆栈指针到正确位置
00008143 A8 90              	TCB1:	POP  R1,R5 FROM [SP]
00008144 98 9A              			RETI
                            	
                            	
                            	.PUBLIC _Clear_Dog
                            	_Clear_Dog:
00008145 41 92              	 		R1 = 0x0001;
00008146 19 D3 12 70        	    	[P_Watchdog_Clear] = R1    //清看门狗
00008148 90 9A              	    	RETF		
0 error(s), 0 warning(s).












⌨️ 快捷键说明

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