os_task.txt
来自「uc/os在lpc2100系列的KEIL模板 uc/os在lpc2100系列的」· 文本 代码 · 共 1,089 行 · 第 1/4 页
TXT
1,089 行
000400 e5d4102f LDRB r1,[r4,#0x2f] ;397
000404 e5d43030 LDRB r3,[r4,#0x30] ;397
000408 e0811000 ADD r1,r1,r0 ;397
00040c e5d12008 LDRB r2,[r1,#8] ;397
000410 e1d22003 BICS r2,r2,r3 ;397
000414 e5c12008 STRB r2,[r1,#8] ;397
000418 1a000003 BNE |L1.1068|
00041c e5d01001 LDRB r1,[r0,#1] ;398
000420 e5d42031 LDRB r2,[r4,#0x31] ;398
000424 e1c11002 BIC r1,r1,r2 ;398
000428 e5c01001 STRB r1,[r0,#1] ;398
|L1.1068|
00042c e5940024 LDR r0,[r4,#0x24] ;403
000430 e3500000 CMP r0,#0 ;404
000434 0a000000 BEQ |L1.1084|
000438 ebfffffe BL OS_FlagUnlink
|L1.1084|
00043c e3a08000 MOV r8,#0 ;408
000440 e1c482ba STRH r8,[r4,#0x2a] ;408
000444 e5c4802c STRB r8,[r4,#0x2c] ;409
000448 e59f7418 LDR r7,|L1.2152|
00044c e5d70000 LDRB r0,[r7,#0] ;410 ; OSLockNesting
000450 e35000ff CMP r0,#0xff ;410
000454 2a000001 BCS |L1.1120|
000458 e2800001 ADD r0,r0,#1 ;411
00045c e5c70000 STRB r0,[r7,#0] ;411 ; OSLockNesting
|L1.1120|
000460 ef000003 SVC #0x3 ;413
000464 ebfffffe BL OS_Dummy
000468 ef000002 SVC #0x2 ;415
00046c e5d70000 LDRB r0,[r7,#0] ;416 ; OSLockNesting
000470 e3500000 CMP r0,#0 ;416
000474 0a000001 BEQ |L1.1152|
000478 e2400001 SUB r0,r0,#1 ;417
00047c e5c70000 STRB r0,[r7,#0] ;417 ; OSLockNesting
|L1.1152|
000480 e1a00004 MOV r0,r4 ;419
000484 ebfffffe BL OSTaskDelHook
000488 e59f13cc LDR r1,|L1.2140|
00048c e5d10000 LDRB r0,[r1,#0] ;420 ; OSTaskCtr
000490 e2400001 SUB r0,r0,#1 ;420
000494 e5c10000 STRB r0,[r1,#0] ;420 ; OSTaskCtr
000498 e7868105 STR r8,[r6,r5,LSL #2] ;421
00049c e5940018 LDR r0,[r4,#0x18] ;422
0004a0 e3500000 CMP r0,#0 ;422
0004a4 1a000005 BNE |L1.1216|
0004a8 e5940014 LDR r0,[r4,#0x14] ;423
0004ac e5808018 STR r8,[r0,#0x18] ;423
0004b0 e59f13b4 LDR r1,|L1.2156|
0004b4 e5940014 LDR r0,[r4,#0x14] ;424
0004b8 e5810000 STR r0,[r1,#0] ;424 ; OSTCBList
0004bc ea000004 B |L1.1236|
|L1.1216|
0004c0 e5941014 LDR r1,[r4,#0x14] ;426
0004c4 e5801014 STR r1,[r0,#0x14] ;426
0004c8 e5940018 LDR r0,[r4,#0x18] ;427
0004cc e5941014 LDR r1,[r4,#0x14] ;427
0004d0 e5810018 STR r0,[r1,#0x18] ;427
|L1.1236|
0004d4 e59f0394 LDR r0,|L1.2160|
0004d8 e5901000 LDR r1,[r0,#0] ;429 ; OSTCBFreeList
0004dc e5841014 STR r1,[r4,#0x14] ;429
0004e0 e5804000 STR r4,[r0,#0] ;430 ; OSTCBFreeList
0004e4 ef000003 SVC #0x3 ;431
0004e8 ebfffffe BL OS_Sched
0004ec e3a00000 MOV r0,#0 ;433
0004f0 eaffff9e B |L1.880|
|L1.1268|
0004f4 ef000003 SVC #0x3 ;435
0004f8 e3a0003c MOV r0,#0x3c ;436
0004fc eaffff9b B |L1.880|
;;;438 #endif
ENDP
OSTaskDelReq PROC
;;;486 INT8U OSTaskDelReq (INT8U prio)
;;;487 {
000500 e92d4010 PUSH {r4,lr}
000504 e1a04000 MOV r4,r0
;;;488 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;489 OS_CPU_SR cpu_sr;
;;;490 #endif
;;;491 BOOLEAN stat;
;;;492 INT8U err;
;;;493 OS_TCB *ptcb;
;;;494
;;;495
;;;496 #if OS_ARG_CHK_EN > 0
;;;497 if (prio == OS_IDLE_PRIO) { /* Not allowed to delete idle task */
000508 e354000c CMP r4,#0xc
00050c 1a000002 BNE |L1.1308|
;;;498 return (OS_TASK_DEL_IDLE);
000510 e3a0003d MOV r0,#0x3d
|L1.1300|
000514 e8bd4010 POP {r4,lr}
;;;499 }
;;;500 if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Task priority valid ? */
;;;501 return (OS_PRIO_INVALID);
;;;502 }
;;;503 #endif
;;;504 if (prio == OS_PRIO_SELF) { /* See if a task is requesting to ... */
;;;505 OS_ENTER_CRITICAL(); /* ... this task to delete itself */
;;;506 stat = OSTCBCur->OSTCBDelReq; /* Return request status to caller */
;;;507 OS_EXIT_CRITICAL();
;;;508 return (stat);
;;;509 }
;;;510 OS_ENTER_CRITICAL();
;;;511 ptcb = OSTCBPrioTbl[prio];
;;;512 if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */
;;;513 ptcb->OSTCBDelReq = OS_TASK_DEL_REQ; /* Set flag indicating task to be DEL. */
;;;514 err = OS_NO_ERR;
;;;515 } else {
;;;516 err = OS_TASK_NOT_EXIST; /* Task must be deleted */
;;;517 }
;;;518 OS_EXIT_CRITICAL();
;;;519 return (err);
;;;520 }
000518 e12fff1e BX lr
|L1.1308|
00051c 3a000003 BCC |L1.1328|
000520 e35400ff CMP r4,#0xff ;500
000524 0a000001 BEQ |L1.1328|
000528 e3a0002a MOV r0,#0x2a ;501
00052c eafffff8 B |L1.1300|
|L1.1328|
000530 e35400ff CMP r4,#0xff ;504
000534 1a000006 BNE |L1.1364|
000538 ef000002 SVC #0x2 ;505
00053c e59f030c LDR r0,|L1.2128|
000540 e5900000 LDR r0,[r0,#0] ;506 ; OSTCBCur
000544 e5d04032 LDRB r4,[r0,#0x32] ;506
000548 ef000003 SVC #0x3 ;507
00054c e1a00004 MOV r0,r4 ;508
000550 eaffffef B |L1.1300|
|L1.1364|
000554 ef000002 SVC #0x2 ;510
000558 e59f02e8 LDR r0,|L1.2120|
00055c e7900104 LDR r0,[r0,r4,LSL #2] ;511
000560 e3500000 CMP r0,#0 ;512
000564 0a000003 BEQ |L1.1400|
000568 e3a0103e MOV r1,#0x3e ;513
00056c e5c01032 STRB r1,[r0,#0x32] ;513
000570 e3a04000 MOV r4,#0 ;514
000574 ea000000 B |L1.1404|
|L1.1400|
000578 e3a0400b MOV r4,#0xb ;516
|L1.1404|
00057c ef000003 SVC #0x3 ;518
000580 e1a00004 MOV r0,r4 ;519
000584 eaffffe2 B |L1.1300|
;;;521 #endif
ENDP
OSTaskResume PROC
;;;541 INT8U OSTaskResume (INT8U prio)
;;;542 {
000588 e92d4010 PUSH {r4,lr}
00058c e1a04000 MOV r4,r0
;;;543 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;544 OS_CPU_SR cpu_sr;
;;;545 #endif
;;;546 OS_TCB *ptcb;
;;;547
;;;548
;;;549 #if OS_ARG_CHK_EN > 0
;;;550 if (prio >= OS_LOWEST_PRIO) { /* Make sure task priority is valid */
000590 e354000c CMP r4,#0xc
000594 3a000002 BCC |L1.1444|
;;;551 return (OS_PRIO_INVALID);
000598 e3a0002a MOV r0,#0x2a
|L1.1436|
00059c e8bd4010 POP {r4,lr}
;;;552 }
;;;553 #endif
;;;554 OS_ENTER_CRITICAL();
;;;555 ptcb = OSTCBPrioTbl[prio];
;;;556 if (ptcb == (OS_TCB *)0) { /* Task to suspend must exist */
;;;557 OS_EXIT_CRITICAL();
;;;558 return (OS_TASK_RESUME_PRIO);
;;;559 }
;;;560 if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended */
;;;561 if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) && /* Remove suspension */
;;;562 (ptcb->OSTCBDly == 0)) { /* Must not be delayed */
;;;563 OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
;;;564 OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;;;565 OS_EXIT_CRITICAL();
;;;566 OS_Sched();
;;;567 } else {
;;;568 OS_EXIT_CRITICAL();
;;;569 }
;;;570 return (OS_NO_ERR);
;;;571 }
;;;572 OS_EXIT_CRITICAL();
;;;573 return (OS_TASK_NOT_SUSPENDED);
;;;574 }
0005a0 e12fff1e BX lr
|L1.1444|
0005a4 ef000002 SVC #0x2 ;554
0005a8 e59f0298 LDR r0,|L1.2120|
0005ac e7900104 LDR r0,[r0,r4,LSL #2] ;555
0005b0 e3500000 CMP r0,#0 ;556
0005b4 1a000002 BNE |L1.1476|
0005b8 ef000003 SVC #0x3 ;557
0005bc e3a00064 MOV r0,#0x64 ;558
0005c0 eafffff5 B |L1.1436|
|L1.1476|
0005c4 e5d0102c LDRB r1,[r0,#0x2c] ;560
0005c8 e3110008 TST r1,#8 ;560
0005cc 0a000016 BEQ |L1.1580|
0005d0 e3d11008 BICS r1,r1,#8 ;561
0005d4 e5c0102c STRB r1,[r0,#0x2c] ;561
0005d8 1a000010 BNE |L1.1568|
0005dc e1d012ba LDRH r1,[r0,#0x2a] ;562
0005e0 e3510000 CMP r1,#0 ;562
0005e4 1a00000d BNE |L1.1568|
0005e8 e59f1268 LDR r1,|L1.2136|
0005ec e5d02031 LDRB r2,[r0,#0x31] ;563
0005f0 e5d13000 LDRB r3,[r1,#0] ;563 ; OSRdyGrp
0005f4 e1822003 ORR r2,r2,r3 ;563
0005f8 e5c12000 STRB r2,[r1,#0] ;563 ; OSRdyGrp
0005fc e5d0102f LDRB r1,[r0,#0x2f] ;564
000600 e59f224c LDR r2,|L1.2132|
000604 e5d00030 LDRB r0,[r0,#0x30] ;564
000608 e7d23001 LDRB r3,[r2,r1] ;564
00060c e1800003 ORR r0,r0,r3 ;564
000610 e7c20001 STRB r0,[r2,r1] ;564
000614 ef000003 SVC #0x3 ;565
000618 ebfffffe BL OS_Sched
00061c ea000000 B |L1.1572|
|L1.1568|
000620 ef000003 SVC #0x3 ;568
|L1.1572|
000624 e3a00000 MOV r0,#0 ;570
000628 eaffffdb B |L1.1436|
|L1.1580|
00062c ef000003 SVC #0x3 ;572
000630 e3a00065 MOV r0,#0x65 ;573
000634 eaffffd8 B |L1.1436|
;;;575 #endif
ENDP
OSTaskStkChk PROC
;;;596 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
;;;597 {
000638 e92d41f0 PUSH {r4-r8,lr}
00063c e1a04000 MOV r4,r0
000640 e1a06001 MOV r6,r1
;;;598 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;599 OS_CPU_SR cpu_sr;
;;;600 #endif
;;;601 OS_TCB *ptcb;
;;;602 OS_STK *pchk;
;;;603 INT32U free;
;;;604 INT32U size;
;;;605
;;;606
;;;607 #if OS_ARG_CHK_EN > 0
;;;608 if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { /* Make sure task priority is valid */
000644 e354000c CMP r4,#0xc
000648 9a000004 BLS |L1.1632|
00064c e35400ff CMP r4,#0xff
000650 0a000002 BEQ |L1.1632|
;;;609 return (OS_PRIO_INVALID);
000654 e3a0002a MOV r0,#0x2a
|L1.1624|
000658 e8bd41f0 POP {r4-r8,lr}
;;;610 }
;;;611 #endif
;;;612 pdata->OSFree = 0; /* Assume failure, set to 0 size */
;;;613 pdata->OSUsed = 0;
;;;614 OS_ENTER_CRITICAL();
;;;615 if (prio == OS_PRIO_SELF) { /* See if check for SELF */
;;;616 prio = OSTCBCur->OSTCBPrio;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?