📄 os_core.txt
字号:
;;;192 #endif
;;;193 #endif
;;;194
;;;195 /* ------------------------------- CREATION OF 'STATISTIC' TASK ---------------------------------- */
;;;196 #if OS_TASK_STAT_EN > 0
;;;197 #if OS_TASK_CREATE_EXT_EN > 0
;;;198 #if OS_STK_GROWTH == 1
;;;199 (void)OSTaskCreateExt(OS_TaskStat,
;;;200 (void *)0, /* No args passed to OS_TaskStat()*/
;;;201 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;202 OS_STAT_PRIO, /* One higher than the idle task */
;;;203 OS_TASK_STAT_ID,
;;;204 &OSTaskStatStk[0], /* Set Bottom-Of-Stack */
;;;205 OS_TASK_STAT_STK_SIZE,
;;;206 (void *)0, /* No TCB extension */
;;;207 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;208 #else
;;;209 (void)OSTaskCreateExt(OS_TaskStat,
;;;210 (void *)0, /* No args passed to OS_TaskStat()*/
;;;211 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;212 OS_STAT_PRIO, /* One higher than the idle task */
;;;213 OS_TASK_STAT_ID,
;;;214 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Bottom-Of-Stack */
;;;215 OS_TASK_STAT_STK_SIZE,
;;;216 (void *)0, /* No TCB extension */
;;;217 OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
;;;218 #endif
;;;219 #else
;;;220 #if OS_STK_GROWTH == 1
;;;221 (void)OSTaskCreate(OS_TaskStat,
;;;222 (void *)0, /* No args passed to OS_TaskStat()*/
;;;223 &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
;;;224 OS_STAT_PRIO); /* One higher than the idle task */
;;;225 #else
;;;226 (void)OSTaskCreate(OS_TaskStat,
;;;227 (void *)0, /* No args passed to OS_TaskStat()*/
;;;228 &OSTaskStatStk[0], /* Set Top-Of-Stack */
;;;229 OS_STAT_PRIO); /* One higher than the idle task */
;;;230 #endif
;;;231 #endif
;;;232 #endif
;;;233
;;;234 #if OS_VERSION >= 204
;;;235 OSInitHookEnd(); /* Call port specific init. code */
0001a0 ebfffffe BL OSInitHookEnd
;;;236 #endif
;;;237 }
0001a4 e8bd87f0 POP {r4-r10,pc}
ENDP
OSIntEnter PROC
;;;262 void OSIntEnter (void)
;;;263 {
0001a8 e92d4010 PUSH {r4,lr}
;;;264 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;265 OS_CPU_SR cpu_sr;
;;;266 #endif
;;;267
;;;268
;;;269 OS_ENTER_CRITICAL();
0001ac ef000002 SVC 0x2 ; formerly SWI
;;;270 if (OSIntNesting < 255) {
0001b0 e59f070c LDR r0,|L1.2244|
0001b4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001b8 e35000ff CMP r0,#0xff
0001bc aa000004 BGE |L1.468|
;;;271 OSIntNesting++; /* Increment ISR nesting level */
0001c0 e59f06fc LDR r0,|L1.2244|
0001c4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001c8 e2800001 ADD r0,r0,#1
0001cc e59f16f0 LDR r1,|L1.2244|
0001d0 e5c10000 STRB r0,[r1,#0] ; OSIntNesting
;;;272 }
;;;273 OS_EXIT_CRITICAL();
|L1.468|
0001d4 ef000003 SVC 0x3 ; formerly SWI
;;;274 }
0001d8 e8bd8010 POP {r4,pc}
ENDP
OSIntExit PROC
;;;295 void OSIntExit (void)
;;;296 {
0001dc e92d4010 PUSH {r4,lr}
;;;297 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;298 OS_CPU_SR cpu_sr;
;;;299 #endif
;;;300
;;;301
;;;302 OS_ENTER_CRITICAL();
0001e0 ef000002 SVC 0x2 ; formerly SWI
;;;303 if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
0001e4 e59f06d8 LDR r0,|L1.2244|
0001e8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001ec e3500000 CMP r0,#0
0001f0 da000004 BLE |L1.520|
;;;304 OSIntNesting--;
0001f4 e59f06c8 LDR r0,|L1.2244|
0001f8 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0001fc e2400001 SUB r0,r0,#1
000200 e59f16bc LDR r1,|L1.2244|
000204 e5c10000 STRB r0,[r1,#0] ; OSIntNesting
;;;305 }
;;;306 if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */
|L1.520|
000208 e59f06b4 LDR r0,|L1.2244|
00020c e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000210 e3500000 CMP r0,#0
000214 1a000025 BNE |L1.688|
000218 e59f06a8 LDR r0,|L1.2248|
00021c e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
000220 e3500000 CMP r0,#0
000224 1a000021 BNE |L1.688|
;;;307 OSIntExitY = OSUnMapTbl[OSRdyGrp]; /* ... and not locked. */
000228 e59f06dc LDR r0,|L1.2316|
00022c e59f16a4 LDR r1,|L1.2264|
000230 e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000234 e7d00001 LDRB r0,[r0,r1]
000238 e59f16d0 LDR r1,|L1.2320|
00023c e5c10000 STRB r0,[r1,#0] ; OSIntExitY
;;;308 OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
000240 e59f0694 LDR r0,|L1.2268|
000244 e5d11000 LDRB r1,[r1,#0] ; OSIntExitY
000248 e7d00001 LDRB r0,[r0,r1]
00024c e59f16b8 LDR r1,|L1.2316|
000250 e7d10000 LDRB r0,[r1,r0]
000254 e59f16b4 LDR r1,|L1.2320|
000258 e5d11000 LDRB r1,[r1,#0] ; OSIntExitY
00025c e0800181 ADD r0,r0,r1,LSL #3
000260 e59f167c LDR r1,|L1.2276|
000264 e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;309 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
000268 e2810000 ADD r0,r1,#0
00026c e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000270 e59f1668 LDR r1,|L1.2272|
000274 e5d11000 LDRB r1,[r1,#0] ; OSPrioCur
000278 e1500001 CMP r0,r1
00027c 0a00000b BEQ |L1.688|
;;;310 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000280 e59f066c LDR r0,|L1.2292|
000284 e59f1658 LDR r1,|L1.2276|
000288 e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
00028c e7900101 LDR r0,[r0,r1,LSL #2]
000290 e59f1650 LDR r1,|L1.2280|
000294 e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;311 OSCtxSwCtr++; /* Keep track of the number of context switches */
000298 e59f0634 LDR r0,|L1.2260|
00029c e5900000 LDR r0,[r0,#0] ; OSCtxSwCtr
0002a0 e2800001 ADD r0,r0,#1
0002a4 e59f1628 LDR r1,|L1.2260|
0002a8 e5810000 STR r0,[r1,#0] ; OSCtxSwCtr
;;;312 OSIntCtxSw(); /* Perform interrupt level context switch */
;;;313 }
;;;314 }
;;;315 OS_EXIT_CRITICAL();
;;;316 }
|L1.684|
0002ac e8bd8010 POP {r4,pc}
|L1.688|
0002b0 ef000003 SVC 0x3 ; formerly SWI ;315
0002b4 eafffffc B |L1.684|
ENDP
OSSchedLock PROC
;;;335 void OSSchedLock (void)
;;;336 {
0002b8 e92d4010 PUSH {r4,lr}
;;;337 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;338 OS_CPU_SR cpu_sr;
;;;339 #endif
;;;340
;;;341
;;;342 if (OSRunning == TRUE) { /* Make sure multitasking is running */
0002bc e59f060c LDR r0,|L1.2256|
0002c0 e5d00000 LDRB r0,[r0,#0] ; OSRunning
0002c4 e3500001 CMP r0,#1
0002c8 1a00000a BNE |L1.760|
;;;343 OS_ENTER_CRITICAL();
0002cc ef000002 SVC 0x2 ; formerly SWI
;;;344 if (OSLockNesting < 255) { /* Prevent OSLockNesting from wrapping back to 0 */
0002d0 e59f05f0 LDR r0,|L1.2248|
0002d4 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0002d8 e35000ff CMP r0,#0xff
0002dc aa000004 BGE |L1.756|
;;;345 OSLockNesting++; /* Increment lock nesting level */
0002e0 e59f05e0 LDR r0,|L1.2248|
0002e4 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
0002e8 e2800001 ADD r0,r0,#1
0002ec e59f15d4 LDR r1,|L1.2248|
0002f0 e5c10000 STRB r0,[r1,#0] ; OSLockNesting
;;;346 }
;;;347 OS_EXIT_CRITICAL();
|L1.756|
0002f4 ef000003 SVC 0x3 ; formerly SWI
;;;348 }
;;;349 }
|L1.760|
0002f8 e8bd8010 POP {r4,pc}
ENDP
OS_Sched PROC
;;;735 void OS_Sched (void)
;;;736 {
0002fc e92d4010 PUSH {r4,lr}
;;;737 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;738 OS_CPU_SR cpu_sr;
;;;739 #endif
;;;740 INT8U y;
;;;741
;;;742
;;;743 OS_ENTER_CRITICAL();
000300 ef000002 SVC 0x2 ; formerly SWI
;;;744 if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
000304 e59f05b8 LDR r0,|L1.2244|
000308 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
00030c e3500000 CMP r0,#0
000310 1a000020 BNE |L1.920|
000314 e59f05ac LDR r0,|L1.2248|
000318 e5d00000 LDRB r0,[r0,#0] ; OSLockNesting
00031c e3500000 CMP r0,#0
000320 1a00001c BNE |L1.920|
;;;745 y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
000324 e59f05e0 LDR r0,|L1.2316|
000328 e59f15a8 LDR r1,|L1.2264|
00032c e5d11000 LDRB r1,[r1,#0] ; OSRdyGrp
000330 e7d04001 LDRB r4,[r0,r1]
;;;746 OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
000334 e59f05a0 LDR r0,|L1.2268|
000338 e7d00004 LDRB r0,[r0,r4]
00033c e59f15c8 LDR r1,|L1.2316|
000340 e7d10000 LDRB r0,[r1,r0]
000344 e0800184 ADD r0,r0,r4,LSL #3
000348 e59f1594 LDR r1,|L1.2276|
00034c e5c10000 STRB r0,[r1,#0] ; OSPrioHighRdy
;;;747 if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
000350 e2810000 ADD r0,r1,#0
000354 e5d00000 LDRB r0,[r0,#0] ; OSPrioHighRdy
000358 e59f1580 LDR r1,|L1.2272|
00035c e5d11000 LDRB r1,[r1,#0] ; OSPrioCur
000360 e1500001 CMP r0,r1
000364 0a00000b BEQ |L1.920|
;;;748 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
000368 e59f0584 LDR r0,|L1.2292|
00036c e59f1570 LDR r1,|L1.2276|
000370 e5d11000 LDRB r1,[r1,#0] ; OSPrioHighRdy
000374 e7900101 LDR r0,[r0,r1,LSL #2]
000378 e59f1568 LDR r1,|L1.2280|
00037c e5810000 STR r0,[r1,#0] ; OSTCBHighRdy
;;;749 OSCtxSwCtr++; /* Increment context switch counter */
000380 e59f054c LDR r0,|L1.2260|
000384 e5900000 LDR r0,[r0,#0] ; OSCtxSwCtr
000388 e2800001 ADD r0,r0,#1
00038c e59f1540 LDR r1,|L1.2260|
000390 e5810000 STR r0,[r1,#0] ; OSCtxSwCtr
;;;750 OS_TASK_SW(); /* Perform a context switch */
000394 ef000000 SVC 0x0 ; formerly SWI
;;;751 }
;;;752 }
;;;753 OS_EXIT_CRITICAL();
|L1.920|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -