📄 os_cpu_c.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 947] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\os_cpu_c.o --device=DARMP -O0 -IC:\Keil\ARM\INC\Philips ..\ARM\Os_cpu_c.c]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
OSTaskStkInit PROC
;;;69 OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
;;;70 {
000000 e92d4010 PUSH {r4,lr}
000004 e1a0c000 MOV r12,r0
;;;71 OS_STK *stk;
;;;72
;;;73 opt = opt; /* 'opt' 没有使用。作用是避免编译器警告 */
000008 e1a00000 MOV r0,r0
;;;74 stk = ptos; /* 获取堆栈指针 */
00000c e1a00002 MOV r0,r2
;;;75
;;;76 /* 建立任务环境,ADS1.2使用满递减堆栈 */
;;;77 *stk = (OS_STK) task; /* pc */
000010 e580c000 STR r12,[r0,#0]
;;;78 *--stk = (OS_STK) task; /* lr */
000014 e240e004 SUB lr,r0,#4
000018 e1a0000e MOV r0,lr
00001c e58ec000 STR r12,[lr,#0]
;;;79
;;;80 *--stk = 0; /* r12 */
000020 e3a0e000 MOV lr,#0
000024 e2404004 SUB r4,r0,#4
000028 e1a00004 MOV r0,r4
00002c e584e000 STR lr,[r4,#0]
;;;81 *--stk = 0; /* r11 */
000030 e2404004 SUB r4,r0,#4
000034 e1a00004 MOV r0,r4
000038 e584e000 STR lr,[r4,#0]
;;;82 *--stk = 0; /* r10 */
00003c e2404004 SUB r4,r0,#4
000040 e1a00004 MOV r0,r4
000044 e584e000 STR lr,[r4,#0]
;;;83 *--stk = 0; /* r9 */
000048 e2404004 SUB r4,r0,#4
00004c e1a00004 MOV r0,r4
000050 e584e000 STR lr,[r4,#0]
;;;84 *--stk = 0; /* r8 */
000054 e2404004 SUB r4,r0,#4
000058 e1a00004 MOV r0,r4
00005c e584e000 STR lr,[r4,#0]
;;;85 *--stk = 0; /* r7 */
000060 e2404004 SUB r4,r0,#4
000064 e1a00004 MOV r0,r4
000068 e584e000 STR lr,[r4,#0]
;;;86 *--stk = 0; /* r6 */
00006c e2404004 SUB r4,r0,#4
000070 e1a00004 MOV r0,r4
000074 e584e000 STR lr,[r4,#0]
;;;87 *--stk = 0; /* r5 */
000078 e2404004 SUB r4,r0,#4
00007c e1a00004 MOV r0,r4
000080 e584e000 STR lr,[r4,#0]
;;;88 *--stk = 0; /* r4 */
000084 e2404004 SUB r4,r0,#4
000088 e1a00004 MOV r0,r4
00008c e584e000 STR lr,[r4,#0]
;;;89 *--stk = 0; /* r3 */
000090 e2404004 SUB r4,r0,#4
000094 e1a00004 MOV r0,r4
000098 e584e000 STR lr,[r4,#0]
;;;90 *--stk = 0; /* r2 */
00009c e2404004 SUB r4,r0,#4
0000a0 e1a00004 MOV r0,r4
0000a4 e584e000 STR lr,[r4,#0]
;;;91 *--stk = 0; /* r1 */
0000a8 e2404004 SUB r4,r0,#4
0000ac e1a00004 MOV r0,r4
0000b0 e584e000 STR lr,[r4,#0]
;;;92 *--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */
0000b4 e240e004 SUB lr,r0,#4
0000b8 e1a0000e MOV r0,lr
0000bc e58e1000 STR r1,[lr,#0]
;;;93 *--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
0000c0 e3a0e010 MOV lr,#0x10
0000c4 e2404004 SUB r4,r0,#4
0000c8 e1a00004 MOV r0,r4
0000cc e584e000 STR lr,[r4,#0]
;;;94 *--stk = 0; /* 关中断计数器OsEnterSum; */
0000d0 e3a0e000 MOV lr,#0
0000d4 e2404004 SUB r4,r0,#4
0000d8 e1a00004 MOV r0,r4
0000dc e584e000 STR lr,[r4,#0]
;;;95 *--stk = 0; /* 主要是为出栈时凑够偶数个字*/
0000e0 e2404004 SUB r4,r0,#4
0000e4 e1a00004 MOV r0,r4
0000e8 e584e000 STR lr,[r4,#0]
;;;96
;;;97 return (stk);
;;;98 }
0000ec e8bd8010 POP {r4,pc}
ENDP
SWI_Exception PROC
;;;129 void SWI_Exception(int SWI_Num, int *Regs)
;;;130 {
0000f0 e52de004 PUSH {lr}
;;;131 OS_TCB *ptcb;
;;;132 OS_STK tmp;
;;;133 switch(SWI_Num)
0000f4 e3500081 CMP r0,#0x81
0000f8 0a000027 BEQ |L1.412|
0000fc ca000006 BGT |L1.284|
000100 e3500002 CMP r0,#2
000104 0a000009 BEQ |L1.304|
000108 e3500003 CMP r0,#3
00010c 0a000011 BEQ |L1.344|
000110 e3500080 CMP r0,#0x80
000114 1a000044 BNE |L1.556|
000118 ea000019 B |L1.388|
|L1.284|
00011c e3500082 CMP r0,#0x82
000120 0a000023 BEQ |L1.436|
000124 e3500083 CMP r0,#0x83
000128 1a00003f BNE |L1.556|
00012c ea00002f B |L1.496|
;;;134 {
;;;135 //case 0x00: /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件 */
;;;136 // break;
;;;137 //case 0x01: /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;138 // break;
;;;139 case 0x02: /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
|L1.304|
000130 e1a00000 MOV r0,r0
;;;140 __asm
;;;141 {
;;;142 MRS tmp, SPSR
000134 e14f3000 MRS r3,SPSR
;;;143 ORR tmp, tmp, #NoInt
000138 e3833080 ORR r3,r3,#0x80
;;;144 MSR SPSR_c, tmp
00013c e161f003 MSR SPSR_c,r3
;;;145 }
;;;146 OsEnterSum++;
000140 e59fc130 LDR r12,|L1.632|
000144 e59cc000 LDR r12,[r12,#0] ; OsEnterSum
000148 e28cc001 ADD r12,r12,#1
00014c e59fe124 LDR lr,|L1.632|
000150 e58ec000 STR r12,[lr,#0] ; OsEnterSum
;;;147 break;
000154 ea000036 B |L1.564|
;;;148 case 0x03: /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
|L1.344|
000158 e1a00000 MOV r0,r0
;;;149 if (--OsEnterSum == 0)
00015c e59fc114 LDR r12,|L1.632|
000160 e59cc000 LDR r12,[r12,#0] ; OsEnterSum
000164 e25cc001 SUBS r12,r12,#1
000168 e59fe108 LDR lr,|L1.632|
00016c e58ec000 STR r12,[lr,#0] ; OsEnterSum
000170 1a000002 BNE |L1.384|
;;;150 {
;;;151 __asm
;;;152 {
;;;153 MRS tmp, SPSR
000174 e14f3000 MRS r3,SPSR
;;;154 BIC tmp, tmp, #NoInt
000178 e3c33080 BIC r3,r3,#0x80
;;;155 MSR SPSR_c, tmp
00017c e161f003 MSR SPSR_c,r3
;;;156 }
;;;157 }
;;;158 break;
|L1.384|
000180 ea00002b B |L1.564|
;;;159 #if OS_SELF_EN > 0
;;;160 case 0x40:
;;;161 /* 返回指定系统服务函数的地址 */
;;;162 /* 函数地址存于数组_OSFunctionAddr中*/
;;;163 /* 数组_OSFunctionAddr需要另外定义 */
;;;164 /* Regs[0] 为第一个参数,也是返回值 */
;;;165 /* Regs[1] 为第二个参数 */
;;;166 /* Regs[2] 为第三个参数 */
;;;167 /* Regs[3] 为第四个参数 */
;;;168 /* 仅有一个参数为系统服务函数的索引 */
;;;169 Regs[0] = _OSFunctionAddr[Regs[0]];
;;;170 break;
;;;171 case 0x41:
;;;172 /* 返回指定用户的服务函数的地址 */
;;;173 /* 函数地址存于数组_UsrFunctionAddr中*/
;;;174 /* 数组_UsrFunctionAddr需要另外定义 */
;;;175 /* Regs[0] 为第一个参数,也是返回值 */
;;;176 /* Regs[1] 为第二个参数 */
;;;177 /* Regs[2] 为第三个参数 */
;;;178 /* Regs[3] 为第四个参数 */
;;;179 /* 仅有一个参数为用户服务函数的索引 */
;;;180 Regs[0] = _UsrFunctionAddr[Regs[0]];
;;;181 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -