📄 os_cpu_c.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oos_cpu_c.o --device=DARMP --apcs=interwork -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
;;;96 return (stk);
0000e0 e8bd4010 POP {r4,lr}
;;;97 }
0000e4 e12fff1e BX lr
ENDP
SWI_Exception PROC
;;;128 void SWI_Exception(int SWI_Num, int *Regs)
;;;129 {
0000e8 e52de004 PUSH {lr}
;;;130 OS_TCB *ptcb;
;;;131 unsigned int temp; //以前的keil for 2.5 或 ADS1.2下,这个是不用这样子定义的
;;;132 //直接用R0即可,,
;;;133
;;;134 switch(SWI_Num)
0000ec e3500081 CMP r0,#0x81
0000f0 0a000027 BEQ |L1.404|
0000f4 ca000006 BGT |L1.276|
0000f8 e3500002 CMP r0,#2
0000fc 0a000009 BEQ |L1.296|
000100 e3500003 CMP r0,#3
000104 0a000011 BEQ |L1.336|
000108 e3500080 CMP r0,#0x80
00010c 1a000044 BNE |L1.548|
000110 ea000019 B |L1.380|
|L1.276|
000114 e3500082 CMP r0,#0x82
000118 0a000023 BEQ |L1.428|
00011c e3500083 CMP r0,#0x83
000120 1a00003f BNE |L1.548|
000124 ea00002f B |L1.488|
;;;135 {
;;;136 //case 0x00: /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件 */
;;;137 // break;
;;;138 //case 0x01: /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;139 // break;
;;;140 case 0x02: /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
|L1.296|
000128 e1a00000 MOV r0,r0
;;;141 __asm
;;;142 {
;;;143 MRS temp, SPSR
00012c e14f3000 MRS r3,SPSR
;;;144 ORR temp, temp, #NoInt
000130 e3833080 ORR r3,r3,#0x80
;;;145 MSR SPSR_c, temp
000134 e161f003 MSR SPSR_c,r3
;;;146 }
;;;147 OsEnterSum++;
000138 e59fc138 LDR r12,|L1.632|
00013c e59cc000 LDR r12,[r12,#0] ; OsEnterSum
000140 e28cc001 ADD r12,r12,#1
000144 e59fe12c LDR lr,|L1.632|
000148 e58ec000 STR r12,[lr,#0] ; OsEnterSum
;;;148 break;
00014c ea000036 B |L1.556|
;;;149 case 0x03: /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
|L1.336|
000150 e1a00000 MOV r0,r0
;;;150 if (--OsEnterSum == 0)
000154 e59fc11c LDR r12,|L1.632|
000158 e59cc000 LDR r12,[r12,#0] ; OsEnterSum
00015c e25cc001 SUBS r12,r12,#1
000160 e59fe110 LDR lr,|L1.632|
000164 e58ec000 STR r12,[lr,#0] ; OsEnterSum
000168 1a000002 BNE |L1.376|
;;;151 {
;;;152 __asm
;;;153 {
;;;154 MRS temp, SPSR
00016c e14f3000 MRS r3,SPSR
;;;155 BIC temp, temp, #NoInt
000170 e3c33080 BIC r3,r3,#0x80
;;;156 MSR SPSR_c, temp
000174 e161f003 MSR SPSR_c,r3
;;;157 }
;;;158 }
;;;159 break;
|L1.376|
000178 ea00002b B |L1.556|
;;;160 #if OS_SELF_EN > 0
;;;161 case 0x40:
;;;162 /* 返回指定系统服务函数的地址 */
;;;163 /* 函数地址存于数组_OSFunctionAddr中*/
;;;164 /* 数组_OSFunctionAddr需要另外定义 */
;;;165 /* Regs[0] 为第一个参数,也是返回值 */
;;;166 /* Regs[1] 为第二个参数 */
;;;167 /* Regs[2] 为第三个参数 */
;;;168 /* Regs[3] 为第四个参数 */
;;;169 /* 仅有一个参数为系统服务函数的索引 */
;;;170 Regs[0] = _OSFunctionAddr[Regs[0]];
;;;171 break;
;;;172 case 0x41:
;;;173 /* 返回指定用户的服务函数的地址 */
;;;174 /* 函数地址存于数组_UsrFunctionAddr中*/
;;;175 /* 数组_UsrFunctionAddr需要另外定义 */
;;;176 /* Regs[0] 为第一个参数,也是返回值 */
;;;177 /* Regs[1] 为第二个参数 */
;;;178 /* Regs[2] 为第三个参数 */
;;;179 /* Regs[3] 为第四个参数 */
;;;180 /* 仅有一个参数为用户服务函数的索引 */
;;;181 Regs[0] = _UsrFunctionAddr[Regs[0]];
;;;182 break;
;;;183 case 0x42: /* 中断开始处理 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -