📄 os_cpu_a.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 + -