📄 os_task.txt
字号:
;;;164
;;;165 #if OS_ARG_CHK_EN > 0
;;;166 if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
0001e4 e357000c CMP r7,#0xc
0001e8 da000001 BLE |L1.500|
;;;167 return (OS_PRIO_INVALID);
0001ec e3a0002a MOV r0,#0x2a
;;;168 }
;;;169 #endif
;;;170 OS_ENTER_CRITICAL();
;;;171 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
;;;172 OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
;;;173 /* ... the same thing until task is created. */
;;;174 OS_EXIT_CRITICAL();
;;;175 psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); /* Initialize the task's stack */
;;;176 err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
;;;177 if (err == OS_NO_ERR) {
;;;178 OS_ENTER_CRITICAL();
;;;179 OSTaskCtr++; /* Increment the #tasks counter */
;;;180 OS_EXIT_CRITICAL();
;;;181 if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
;;;182 OS_Sched();
;;;183 }
;;;184 } else {
;;;185 OS_ENTER_CRITICAL();
;;;186 OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
;;;187 OS_EXIT_CRITICAL();
;;;188 }
;;;189 return (err);
;;;190 }
;;;191 OS_EXIT_CRITICAL();
;;;192 return (OS_PRIO_EXIST);
;;;193 }
|L1.496|
0001f0 e8bd83fe POP {r1-r9,pc}
|L1.500|
0001f4 ef000002 SVC 0x2 ; formerly SWI ;170
0001f8 e59f055c LDR r0,|L1.1884| ;171
0001fc e7900107 LDR r0,[r0,r7,LSL #2] ;171
000200 e3500000 CMP r0,#0 ;171
000204 1a000028 BNE |L1.684| ;171
000208 e3a00001 MOV r0,#1 ;172
00020c e59f1548 LDR r1,|L1.1884| ;172
000210 e7810107 STR r0,[r1,r7,LSL #2] ;172
000214 ef000003 SVC 0x3 ; formerly SWI ;174
000218 e3a03000 MOV r3,#0 ;175
00021c e1a02006 MOV r2,r6 ;175
000220 e1a01005 MOV r1,r5 ;175
000224 e1a00004 MOV r0,r4 ;175
000228 ebfffffe BL OSTaskStkInit ;175
00022c e1a09000 MOV r9,r0 ;175
000230 e3a03000 MOV r3,#0 ;176
000234 e58d3000 STR r3,[sp,#0] ;176
000238 e58d3004 STR r3,[sp,#4] ;176
00023c e58d3008 STR r3,[sp,#8] ;176
000240 e1a02003 MOV r2,r3 ;176
000244 e1a01009 MOV r1,r9 ;176
000248 e1a00007 MOV r0,r7 ;176
00024c ebfffffe BL OS_TCBInit ;176
000250 e1a08000 MOV r8,r0 ;176
000254 e3580000 CMP r8,#0 ;177
000258 1a00000c BNE |L1.656| ;177
00025c ef000002 SVC 0x2 ; formerly SWI ;178
000260 e59f0508 LDR r0,|L1.1904| ;179
000264 e5d00000 LDRB r0,[r0,#0] ;179 ; OSTaskCtr
000268 e2800001 ADD r0,r0,#1 ;179
00026c e59f14fc LDR r1,|L1.1904| ;179
000270 e5c10000 STRB r0,[r1,#0] ;179 ; OSTaskCtr
000274 ef000003 SVC 0x3 ; formerly SWI ;180
000278 e59f04f4 LDR r0,|L1.1908| ;181
00027c e5d00000 LDRB r0,[r0,#0] ;181 ; OSRunning
000280 e3500001 CMP r0,#1 ;181
000284 1a000006 BNE |L1.676| ;181
000288 ebfffffe BL OS_Sched ;182
00028c ea000004 B |L1.676| ;182
|L1.656|
000290 ef000002 SVC 0x2 ; formerly SWI ;185
000294 e3a00000 MOV r0,#0 ;186
000298 e59f14bc LDR r1,|L1.1884| ;186
00029c e7810107 STR r0,[r1,r7,LSL #2] ;186
0002a0 ef000003 SVC 0x3 ; formerly SWI ;187
|L1.676|
0002a4 e1a00008 MOV r0,r8 ;189
0002a8 eaffffd0 B |L1.496| ;189
|L1.684|
0002ac ef000003 SVC 0x3 ; formerly SWI ;191
0002b0 e3a00028 MOV r0,#0x28 ;192
0002b4 eaffffcd B |L1.496| ;192
ENDP
OSTaskDel PROC
;;;355 INT8U OSTaskDel (INT8U prio)
;;;356 {
0002b8 e92d41f0 PUSH {r4-r8,lr}
0002bc e1a04000 MOV r4,r0
;;;357 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;358 OS_CPU_SR cpu_sr;
;;;359 #endif
;;;360
;;;361 #if OS_EVENT_EN > 0
;;;362 OS_EVENT *pevent;
;;;363 #endif
;;;364 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;365 OS_FLAG_NODE *pnode;
;;;366 #endif
;;;367 OS_TCB *ptcb;
;;;368
;;;369
;;;370
;;;371 if (OSIntNesting > 0) { /* See if trying to delete from ISR */
0002c0 e59f04b0 LDR r0,|L1.1912|
0002c4 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
0002c8 e3500000 CMP r0,#0
0002cc da000001 BLE |L1.728|
;;;372 return (OS_TASK_DEL_ISR);
0002d0 e3a0003f MOV r0,#0x3f
;;;373 }
;;;374 #if OS_ARG_CHK_EN > 0
;;;375 if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */
;;;376 return (OS_TASK_DEL_IDLE);
;;;377 }
;;;378 if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
;;;379 return (OS_PRIO_INVALID);
;;;380 }
;;;381 #endif
;;;382 OS_ENTER_CRITICAL();
;;;383 if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
;;;384 prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
;;;385 }
;;;386 if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) { /* Task to delete must exist */
;;;387 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready */
;;;388 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;389 }
;;;390 #if OS_EVENT_EN > 0
;;;391 pevent = ptcb->OSTCBEventPtr;
;;;392 if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
;;;393 if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
;;;394 pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
;;;395 }
;;;396 }
;;;397 #endif
;;;398 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;399 pnode = ptcb->OSTCBFlagNode;
;;;400 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
;;;401 OS_FlagUnlink(pnode); /* Remove from wait list */
;;;402 }
;;;403 #endif
;;;404 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
;;;405 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
;;;406 if (OSLockNesting < 255) {
;;;407 OSLockNesting++;
;;;408 }
;;;409 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
;;;410 OS_Dummy(); /* ... Dummy ensures that INTs will be */
;;;411 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
;;;412 if (OSLockNesting > 0) {
;;;413 OSLockNesting--;
;;;414 }
;;;415 OSTaskDelHook(ptcb); /* Call user defined hook */
;;;416 OSTaskCtr--; /* One less task being managed */
;;;417 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
;;;418 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
;;;419 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;420 OSTCBList = ptcb->OSTCBNext;
;;;421 } else {
;;;422 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;423 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;424 }
;;;425 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
;;;426 OSTCBFreeList = ptcb;
;;;427 OS_EXIT_CRITICAL();
;;;428 OS_Sched(); /* Find new highest priority task */
;;;429 return (OS_NO_ERR);
;;;430 }
;;;431 OS_EXIT_CRITICAL();
;;;432 return (OS_TASK_DEL_ERR);
;;;433 }
|L1.724|
0002d4 e8bd81f0 POP {r4-r8,pc}
|L1.728|
0002d8 e354000c CMP r4,#0xc ;375
0002dc 1a000001 BNE |L1.744| ;375
0002e0 e3a0003d MOV r0,#0x3d ;376
0002e4 eafffffa B |L1.724| ;376
|L1.744|
0002e8 e354000c CMP r4,#0xc ;378
0002ec ba000003 BLT |L1.768| ;378
0002f0 e35400ff CMP r4,#0xff ;378
0002f4 0a000001 BEQ |L1.768| ;378
0002f8 e3a0002a MOV r0,#0x2a ;379
0002fc eafffff4 B |L1.724| ;379
|L1.768|
000300 ef000002 SVC 0x2 ; formerly SWI ;382
000304 e35400ff CMP r4,#0xff ;383
000308 1a000002 BNE |L1.792| ;383
00030c e59f0450 LDR r0,|L1.1892| ;384
000310 e5900000 LDR r0,[r0,#0] ;384 ; OSTCBCur
000314 e5d0401d LDRB r4,[r0,#0x1d] ;384
|L1.792|
000318 e59f043c LDR r0,|L1.1884| ;386
00031c e7907104 LDR r7,[r0,r4,LSL #2] ;386
000320 e3570000 CMP r7,#0 ;386
000324 0a00005f BEQ |L1.1192| ;386
000328 e5d7001f LDRB r0,[r7,#0x1f] ;387
00032c e59f1434 LDR r1,|L1.1896| ;387
000330 e7d10000 LDRB r0,[r1,r0] ;387
000334 e5d71020 LDRB r1,[r7,#0x20] ;387
000338 e1c00001 BIC r0,r0,r1 ;387
00033c e21000ff ANDS r0,r0,#0xff ;387
000340 e5d7101f LDRB r1,[r7,#0x1f] ;387
000344 e59f241c LDR r2,|L1.1896| ;387
000348 e7c20001 STRB r0,[r2,r1] ;387
00034c 1a000005 BNE |L1.872| ;387
000350 e5d70021 LDRB r0,[r7,#0x21] ;388
000354 e59f1410 LDR r1,|L1.1900| ;388
000358 e5d11000 LDRB r1,[r1,#0] ;388 ; OSRdyGrp
00035c e1c10000 BIC r0,r1,r0 ;388
000360 e59f1404 LDR r1,|L1.1900| ;388
000364 e5c10000 STRB r0,[r1,#0] ;388 ; OSRdyGrp
|L1.872|
000368 e597500c LDR r5,[r7,#0xc] ;391
00036c e3550000 CMP r5,#0 ;392
000370 0a00000d BEQ |L1.940| ;392
000374 e5d7001f LDRB r0,[r7,#0x1f] ;393
000378 e2851008 ADD r1,r5,#8 ;393
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -