os_task.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,089 行 · 第 1/4 页
TXT
1,089 行
00021c e3500001 CMP r0,#1 ;183
000220 1a000005 BNE |L1.572|
000224 ebfffffe BL OS_Sched
000228 ea000003 B |L1.572|
|L1.556|
00022c ef000002 SVC #0x2 ;187
000230 e3a00000 MOV r0,#0 ;188
000234 e7860104 STR r0,[r6,r4,LSL #2] ;188
000238 ef000003 SVC #0x3 ;189
|L1.572|
00023c e1a00005 MOV r0,r5 ;191
000240 eaffffd3 B |L1.404|
|L1.580|
000244 ef000003 SVC #0x3 ;193
000248 e3a00028 MOV r0,#0x28 ;194
00024c eaffffd0 B |L1.404|
;;;196 #endif
ENDP
OSTaskCreateExt PROC
;;;271 INT16U opt)
;;;272 {
000250 e92d4ffe PUSH {r1-r11,lr}
000254 e59d5040 LDR r5,[sp,#0x40]
000258 e59d7038 LDR r7,[sp,#0x38]
00025c e59d8030 LDR r8,[sp,#0x30]
000260 e1a09000 MOV r9,r0
000264 e1a0a001 MOV r10,r1
000268 e1a0b002 MOV r11,r2
00026c e1a04003 MOV r4,r3
;;;273 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;274 OS_CPU_SR cpu_sr;
;;;275 #endif
;;;276 OS_STK *psp;
;;;277 INT8U err;
;;;278
;;;279
;;;280 #if OS_ARG_CHK_EN > 0
;;;281 if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
000270 e354000c CMP r4,#0xc
000274 9a000002 BLS |L1.644|
;;;282 return (OS_PRIO_INVALID);
000278 e3a0002a MOV r0,#0x2a
|L1.636|
00027c e8bd4ffe POP {r1-r11,lr}
;;;283 }
;;;284 #endif
;;;285 OS_ENTER_CRITICAL();
;;;286 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
;;;287 OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
;;;288 /* ... the same thing until task is created. */
;;;289 OS_EXIT_CRITICAL();
;;;290
;;;291 if (((opt & OS_TASK_OPT_STK_CHK) != 0x0000) || /* See if stack checking has been enabled */
;;;292 ((opt & OS_TASK_OPT_STK_CLR) != 0x0000)) { /* See if stack needs to be cleared */
;;;293 #if OS_STK_GROWTH == 1
;;;294 (void)memset(pbos, 0, stk_size * sizeof(OS_STK));
;;;295 #else
;;;296 (void)memset(ptos, 0, stk_size * sizeof(OS_STK));
;;;297 #endif
;;;298 }
;;;299
;;;300 psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, opt); /* Initialize the task's stack */
;;;301 err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
;;;302 if (err == OS_NO_ERR) {
;;;303 OS_ENTER_CRITICAL();
;;;304 OSTaskCtr++; /* Increment the #tasks counter */
;;;305 OS_EXIT_CRITICAL();
;;;306 if (OSRunning == TRUE) { /* Find HPT if multitasking has started */
;;;307 OS_Sched();
;;;308 }
;;;309 } else {
;;;310 OS_ENTER_CRITICAL();
;;;311 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */
;;;312 OS_EXIT_CRITICAL();
;;;313 }
;;;314 return (err);
;;;315 }
;;;316 OS_EXIT_CRITICAL();
;;;317 return (OS_PRIO_EXIST);
;;;318 }
000280 e12fff1e BX lr
|L1.644|
000284 ef000002 SVC #0x2 ;285
000288 e59f65b8 LDR r6,|L1.2120|
00028c e7960104 LDR r0,[r6,r4,LSL #2] ;286
000290 e3500000 CMP r0,#0 ;286
000294 1a00002b BNE |L1.840|
000298 e3a00001 MOV r0,#1 ;287
00029c e7860104 STR r0,[r6,r4,LSL #2] ;287
0002a0 ef000003 SVC #0x3 ;289
0002a4 e2050001 AND r0,r5,#1 ;291
0002a8 e2051002 AND r1,r5,#2 ;291
0002ac e1900001 ORRS r0,r0,r1 ;291
0002b0 0a000002 BEQ |L1.704|
0002b4 e59d0034 LDR r0,[sp,#0x34] ;294
0002b8 e1a01107 LSL r1,r7,#2 ;294
0002bc ebfffffe BL __aeabi_memclr4
|L1.704|
0002c0 e1a03005 MOV r3,r5 ;300
0002c4 e1a0200b MOV r2,r11 ;300
0002c8 e1a0100a MOV r1,r10 ;300
0002cc e1a00009 MOV r0,r9 ;300
0002d0 ebfffffe BL OSTaskStkInit
0002d4 e59d203c LDR r2,[sp,#0x3c] ;301
0002d8 e1a01000 MOV r1,r0 ;301
0002dc e98d0024 STMIB sp,{r2,r5} ;301
0002e0 e59d2034 LDR r2,[sp,#0x34] ;301
0002e4 e1a03008 MOV r3,r8 ;301
0002e8 e1a00004 MOV r0,r4 ;301
0002ec e58d7000 STR r7,[sp,#0] ;301
0002f0 ebfffffe BL OS_TCBInit
0002f4 e1a05000 MOV r5,r0 ;301
0002f8 e3550000 CMP r5,#0 ;302
0002fc 1a00000b BNE |L1.816|
000300 ef000002 SVC #0x2 ;303
000304 e59f1550 LDR r1,|L1.2140|
000308 e5d10000 LDRB r0,[r1,#0] ;304 ; OSTaskCtr
00030c e2800001 ADD r0,r0,#1 ;304
000310 e5c10000 STRB r0,[r1,#0] ;304 ; OSTaskCtr
000314 ef000003 SVC #0x3 ;305
000318 e59f0540 LDR r0,|L1.2144|
00031c e5d00000 LDRB r0,[r0,#0] ;306 ; OSRunning
000320 e3500001 CMP r0,#1 ;306
000324 1a000005 BNE |L1.832|
000328 ebfffffe BL OS_Sched
00032c ea000003 B |L1.832|
|L1.816|
000330 ef000002 SVC #0x2 ;310
000334 e3a00000 MOV r0,#0 ;311
000338 e7860104 STR r0,[r6,r4,LSL #2] ;311
00033c ef000003 SVC #0x3 ;312
|L1.832|
000340 e1a00005 MOV r0,r5 ;314
000344 eaffffcc B |L1.636|
|L1.840|
000348 ef000003 SVC #0x3 ;316
00034c e3a00028 MOV r0,#0x28 ;317
000350 eaffffc9 B |L1.636|
;;;319 #endif
ENDP
OSTaskDel PROC
;;;357 INT8U OSTaskDel (INT8U prio)
;;;358 {
000354 e92d41f0 PUSH {r4-r8,lr}
000358 e1a05000 MOV r5,r0
;;;359 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;360 OS_CPU_SR cpu_sr;
;;;361 #endif
;;;362
;;;363 #if OS_EVENT_EN > 0
;;;364 OS_EVENT *pevent;
;;;365 #endif
;;;366 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;367 OS_FLAG_NODE *pnode;
;;;368 #endif
;;;369 OS_TCB *ptcb;
;;;370 BOOLEAN self;
;;;371
;;;372
;;;373
;;;374 if (OSIntNesting > 0) { /* See if trying to delete from ISR */
00035c e59f0500 LDR r0,|L1.2148|
000360 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000364 e3500000 CMP r0,#0
000368 0a000002 BEQ |L1.888|
;;;375 return (OS_TASK_DEL_ISR);
00036c e3a0003f MOV r0,#0x3f
|L1.880|
000370 e8bd41f0 POP {r4-r8,lr}
;;;376 }
;;;377 #if OS_ARG_CHK_EN > 0
;;;378 if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */
;;;379 return (OS_TASK_DEL_IDLE);
;;;380 }
;;;381 if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
;;;382 return (OS_PRIO_INVALID);
;;;383 }
;;;384 #endif
;;;385 OS_ENTER_CRITICAL();
;;;386 if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
;;;387 prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
;;;388 }
;;;389 ptcb = OSTCBPrioTbl[prio];
;;;390 if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */
;;;391 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) { /* Make task not ready */
;;;392 OSRdyGrp &= ~ptcb->OSTCBBitY;
;;;393 }
;;;394 #if OS_EVENT_EN > 0
;;;395 pevent = ptcb->OSTCBEventPtr;
;;;396 if (pevent != (OS_EVENT *)0) { /* If task is waiting on event */
;;;397 if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
;;;398 pevent->OSEventGrp &= ~ptcb->OSTCBBitY; /* ... event ctrl block */
;;;399 }
;;;400 }
;;;401 #endif
;;;402 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;403 pnode = ptcb->OSTCBFlagNode;
;;;404 if (pnode != (OS_FLAG_NODE *)0) { /* If task is waiting on event flag */
;;;405 OS_FlagUnlink(pnode); /* Remove from wait list */
;;;406 }
;;;407 #endif
;;;408 ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
;;;409 ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed */
;;;410 if (OSLockNesting < 255) {
;;;411 OSLockNesting++;
;;;412 }
;;;413 OS_EXIT_CRITICAL(); /* Enabling INT. ignores next instruc. */
;;;414 OS_Dummy(); /* ... Dummy ensures that INTs will be */
;;;415 OS_ENTER_CRITICAL(); /* ... disabled HERE! */
;;;416 if (OSLockNesting > 0) {
;;;417 OSLockNesting--;
;;;418 }
;;;419 OSTaskDelHook(ptcb); /* Call user defined hook */
;;;420 OSTaskCtr--; /* One less task being managed */
;;;421 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Clear old priority entry */
;;;422 if (ptcb->OSTCBPrev == (OS_TCB *)0) { /* Remove from TCB chain */
;;;423 ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
;;;424 OSTCBList = ptcb->OSTCBNext;
;;;425 } else {
;;;426 ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
;;;427 ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
;;;428 }
;;;429 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
;;;430 OSTCBFreeList = ptcb;
;;;431 OS_EXIT_CRITICAL();
;;;432 OS_Sched(); /* Find new highest priority task */
;;;433 return (OS_NO_ERR);
;;;434 }
;;;435 OS_EXIT_CRITICAL();
;;;436 return (OS_TASK_DEL_ERR);
;;;437 }
000374 e12fff1e BX lr
|L1.888|
000378 e355000c CMP r5,#0xc ;378
00037c 1a000001 BNE |L1.904|
000380 e3a0003d MOV r0,#0x3d ;379
000384 eafffff9 B |L1.880|
|L1.904|
000388 3a000003 BCC |L1.924|
00038c e35500ff CMP r5,#0xff ;381
000390 0a000001 BEQ |L1.924|
000394 e3a0002a MOV r0,#0x2a ;382
000398 eafffff4 B |L1.880|
|L1.924|
00039c ef000002 SVC #0x2 ;385
0003a0 e35500ff CMP r5,#0xff ;386
0003a4 1a000002 BNE |L1.948|
0003a8 e59f04a0 LDR r0,|L1.2128|
0003ac e5900000 LDR r0,[r0,#0] ;387 ; OSTCBCur
0003b0 e5d0502d LDRB r5,[r0,#0x2d] ;387
|L1.948|
0003b4 e59f648c LDR r6,|L1.2120|
0003b8 e7964105 LDR r4,[r6,r5,LSL #2] ;389
0003bc e3540000 CMP r4,#0 ;390
0003c0 0a00004b BEQ |L1.1268|
0003c4 e5d4002f LDRB r0,[r4,#0x2f] ;391
0003c8 e59f2484 LDR r2,|L1.2132|
0003cc e5d43030 LDRB r3,[r4,#0x30] ;391
0003d0 e7d21000 LDRB r1,[r2,r0] ;391
0003d4 e1d11003 BICS r1,r1,r3 ;391
0003d8 e7c21000 STRB r1,[r2,r0] ;391
0003dc 1a000004 BNE |L1.1012|
0003e0 e59f0470 LDR r0,|L1.2136|
0003e4 e5d41031 LDRB r1,[r4,#0x31] ;392
0003e8 e5d02000 LDRB r2,[r0,#0] ;392 ; OSRdyGrp
0003ec e1c21001 BIC r1,r2,r1 ;392
0003f0 e5c01000 STRB r1,[r0,#0] ;392 ; OSRdyGrp
|L1.1012|
0003f4 e594001c LDR r0,[r4,#0x1c] ;395
0003f8 e3500000 CMP r0,#0 ;396
0003fc 0a00000a BEQ |L1.1068|
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?