os_cpu_c.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 322 行 · 第 1/2 页
TXT
322 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 934] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\rvmdk\os_cpu_c.o --depend=.\rvmdk\os_cpu_c.d --device=DARMP --apcs=interwork -O1 -I. -I..\BSP -I..\..\..\..\uCOS-II\Ports\ARM\Generic\RealView -I..\..\..\..\uCOS-II\Source -I..\..\..\..\uC-CPU -I..\..\..\..\uC-CPU\ARM\RealView -I..\..\..\..\uC-LIB -I..\..\..\..\uC-TCPIP\IF -I..\..\..\..\uC-TCPIP\IF\Ether -I..\..\..\..\uC-TCPIP\NIC\ETHER\LPC2378 -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY -I..\..\..\..\uC-TCPIP\NIC\ETHER\PHY\DP83848 -I..\..\..\..\uC-TCPIP\OS\uCOS-II -I..\..\..\..\uC-TCPIP\Source -I..\..\..\..\uC-LCD\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\RS-232\Source -I..\..\..\..\uC-Probe\Target\Communication\Generic\TCPIP\Source -I..\..\..\..\uC-Probe\Target\Plugins\uCOS-II -Ie:\Keil_ARM\ARM\INC\Philips -D__IN_CHIP --omf_browse=.\rvmdk\os_cpu_c.crf ..\arm\Os_cpu_c.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
OSTaskStkInit PROC
;;;76 /* 建立任务环境,ADS1.2使用满递减堆栈 */
;;;77 *stk = (OS_STK) task; /* pc */
000000 e5820000 STR r0,[r2,#0]
;;;78 *--stk = (OS_STK) task; /* lr */
000004 e2423004 SUB r3,r2,#4
000008 e5020004 STR r0,[r2,#-4]
;;;79
;;;80 *--stk = 0; /* r12 */
00000c e3a02000 MOV r2,#0
000010 e2430004 SUB r0,r3,#4
000014 e5032004 STR r2,[r3,#-4]
;;;81 *--stk = 0; /* r11 */
000018 e5002004 STR r2,[r0,#-4]
;;;82 *--stk = 0; /* r10 */
00001c e5002008 STR r2,[r0,#-8]
;;;83 *--stk = 0; /* r9 */
000020 e500200c STR r2,[r0,#-0xc]
;;;84 *--stk = 0; /* r8 */
000024 e5002010 STR r2,[r0,#-0x10]
;;;85 *--stk = 0; /* r7 */
000028 e5002014 STR r2,[r0,#-0x14]
;;;86 *--stk = 0; /* r6 */
00002c e5002018 STR r2,[r0,#-0x18]
;;;87 *--stk = 0; /* r5 */
000030 e500201c STR r2,[r0,#-0x1c]
;;;88 *--stk = 0; /* r4 */
000034 e5002020 STR r2,[r0,#-0x20]
;;;89 *--stk = 0; /* r3 */
000038 e5002024 STR r2,[r0,#-0x24]
;;;90 *--stk = 0; /* r2 */
00003c e5002028 STR r2,[r0,#-0x28]
;;;91 *--stk = 0; /* r1 */
000040 e500202c STR r2,[r0,#-0x2c]
;;;92 *--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */
000044 e5001030 STR r1,[r0,#-0x30]
;;;93 *--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
000048 e3a01010 MOV r1,#0x10
00004c e5001034 STR r1,[r0,#-0x34]
;;;94 *--stk = 0; /* 关中断计数器OsEnterSum; */
000050 e5202038 STR r2,[r0,#-0x38]!
;;;95
;;;96 return (stk);
;;;97 }
000054 e12fff1e BX lr
;;;98
ENDP
SWI_Exception PROC
;;;131
;;;132 switch(SWI_Num)
000058 e3500081 CMP r0,#0x81
00005c 0a00002e BEQ |L1.284|
000060 ca00000c BGT |L1.152|
000064 e59f2124 LDR r2,|L1.400|
000068 e3500002 CMP r0,#2
00006c e5921000 LDR r1,[r2,#0]
000070 0a000018 BEQ |L1.216|
000074 e3500003 CMP r0,#3
000078 0a00001c BEQ |L1.240|
00007c e3500080 CMP r0,#0x80
000080 1a000003 BNE |L1.148|
;;;133 {
;;;134 //case 0x00: /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件 */
;;;135 // break;
;;;136 //case 0x01: /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
;;;137 // break;
;;;138 case 0x02: /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
;;;139 __asm
;;;140 {
;;;141 MRS R0, SPSR
;;;142 ORR R0, R0, #NoInt
;;;143 MSR SPSR_c, R0
;;;144 }
;;;145 OsEnterSum++;
;;;146 break;
;;;147 case 0x03: /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
;;;148 if(OsEnterSum>0)OsEnterSum--; //这样处理是为了可以直接调用OS_EXIT_CRITICAL()进行允许中断,也为了防止未成对使用出错
;;;149 if (OsEnterSum == 0)
;;;150 {
;;;151 __asm
;;;152 {
;;;153 MRS R0, SPSR
;;;154 BIC R0, R0, #NoInt
;;;155 MSR SPSR_c, R0
;;;156 }
;;;157 }
;;;158 break;
;;;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;
;;;182 case 0x42: /* 中断开始处理 */
;;;183 OSIntNesting++;
;;;184 break;
;;;185 case 0x43: /* 判断中断是否需要切换 */
;;;186 if (OSTCBHighRdy == OSTCBCur)
;;;187 {
;;;188 Regs[0] = 0;
;;;189 }
;;;190 else
;;;191 {
;;;192 Regs[0] = 1;
;;;193 }
;;;194 break;
;;;195 #endif
;;;196 case 0x80: /* 任务切换到系统模式 */
;;;197 __asm
;;;198 {
;;;199 MRS R0, SPSR
000084 e14f0000 MRS r0,SPSR
;;;200 BIC R0, R0, #0x1f
000088 e3c0001f BIC r0,r0,#0x1f
;;;201 ORR R0, R0, #SYS32Mode
00008c e380001f ORR r0,r0,#0x1f
;;;202 MSR SPSR_c, R0
000090 e161f000 MSR SPSR_c,r0
|L1.148|
;;;203 }
;;;204 break;
;;;205 case 0x81: /* 任务切换到用户模式 */
;;;206 __asm
;;;207 {
;;;208 MRS R0, SPSR
;;;209 BIC R0, R0, #0x1f
;;;210 ORR R0, R0, #USR32Mode
;;;211 MSR SPSR_c, R0
;;;212 }
;;;213 break;
;;;214 case 0x82: /* 任务是ARM代码 */
;;;215 if (Regs[0] <= OS_LOWEST_PRIO)
;;;216 {
;;;217 ptcb = OSTCBPrioTbl[Regs[0]];
;;;218 if (ptcb != NULL)
;;;219 {
;;;220 ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?