📄 os_cpu_a.lst
字号:
// 堆栈结构:
// 任务堆栈: 系统堆栈: 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 + -