📄 os_task.txt
字号:
;;;213 err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
00018c 2300 MOVS r3,#0
00018e 4601 MOV r1,r0
000190 9300 STR r3,[sp,#0]
000192 9301 STR r3,[sp,#4]
000194 461a MOV r2,r3
000196 4620 MOV r0,r4
000198 9302 STR r3,[sp,#8]
00019a f7fff7ff BL OS_TCBInit
00019e 4605 MOV r5,r0
;;;214 if (err == OS_ERR_NONE) {
0001a0 b935 CBNZ r5,|L1.432|
;;;215 if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */
0001a2 48a1 LDR r0,|L1.1064|
0001a4 7800 LDRB r0,[r0,#0] ; OSRunning
0001a6 2801 CMP r0,#1
0001a8 d109 BNE |L1.446|
;;;216 OS_Sched();
0001aa f7fff7ff BL OS_Sched
0001ae e006 B |L1.446|
|L1.432|
;;;217 }
;;;218 } else {
;;;219 OS_ENTER_CRITICAL();
0001b0 f7fff7ff BL OS_CPU_SR_Save
;;;220 OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
0001b4 2100 MOVS r1,#0
0001b6 f846f846 STR r1,[r6,r4,LSL #2]
;;;221 OS_EXIT_CRITICAL();
0001ba f7fff7ff BL OS_CPU_SR_Restore
|L1.446|
;;;222 }
;;;223 return (err);
0001be 4628 MOV r0,r5
0001c0 b004 ADD sp,sp,#0x10
0001c2 e8bde8bd POP {r4-r8,pc}
|L1.454|
;;;224 }
;;;225 OS_EXIT_CRITICAL();
0001c6 f7fff7ff BL OS_CPU_SR_Restore
;;;226 return (OS_ERR_PRIO_EXIST);
0001ca 2028 MOVS r0,#0x28
;;;227 }
0001cc b004 ADD sp,sp,#0x10
0001ce e8bde8bd POP {r4-r8,pc}
;;;228 #endif
ENDP
OS_TaskStkClr PROC
;;;1052 {
;;;1053 if ((opt & OS_TASK_OPT_STK_CHK) != 0x0000) { /* See if stack checking has been enabled */
0001d2 f012f012 TST r2,#1
0001d6 d00a BEQ |L1.494|
;;;1054 if ((opt & OS_TASK_OPT_STK_CLR) != 0x0000) { /* See if stack needs to be cleared */
0001d8 f012f012 TST r2,#2
0001dc d007 BEQ |L1.494|
;;;1055 #if OS_STK_GROWTH == 1
;;;1056 while (size > 0) { /* Stack grows from HIGH to LOW memory */
0001de 2900 CMP r1,#0
0001e0 d005 BEQ |L1.494|
0001e2 2200 MOVS r2,#0
|L1.484|
;;;1057 size--;
0001e4 1e49 SUBS r1,r1,#1
0001e6 f840f840 STR r2,[r0],#4
0001ea 2900 CMP r1,#0
0001ec d1fa BNE |L1.484|
|L1.494|
;;;1058 *pbos++ = (OS_STK)0; /* Clear from bottom of stack and up! */
;;;1059 }
;;;1060 #else
;;;1061 while (size > 0) { /* Stack grows from LOW to HIGH memory */
;;;1062 size--;
;;;1063 *pbos-- = (OS_STK)0; /* Clear from bottom of stack and down */
;;;1064 }
;;;1065 #endif
;;;1066 }
;;;1067 }
;;;1068 }
0001ee 4770 BX lr
;;;1069
ENDP
OSTaskCreateExt PROC
;;;309 INT16U opt)
;;;310 {
0001f0 e92de92d PUSH {r0-r11,lr}
0001f4 b083 SUB sp,sp,#0xc
0001f6 ad10 ADD r5,sp,#0x40
0001f8 e895e895 LDM r5,{r5,r7-r10}
0001fc 4683 MOV r11,r0
0001fe 461c MOV r4,r3
;;;311 OS_STK *psp;
;;;312 INT8U err;
;;;313 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;314 OS_CPU_SR cpu_sr = 0;
;;;315 #endif
;;;316
;;;317
;;;318
;;;319 #if OS_ARG_CHK_EN > 0
;;;320 if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
000200 2c1f CMP r4,#0x1f
000202 d903 BLS |L1.524|
;;;321 return (OS_ERR_PRIO_INVALID);
000204 202a MOVS r0,#0x2a
000206 b007 ADD sp,sp,#0x1c
000208 e8bde8bd POP {r4-r11,pc}
|L1.524|
;;;322 }
;;;323 #endif
;;;324 OS_ENTER_CRITICAL();
00020c f7fff7ff BL OS_CPU_SR_Save
;;;325 if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR */
000210 4986 LDR r1,|L1.1068|
000212 7809 LDRB r1,[r1,#0] ; OSIntNesting
000214 b129 CBZ r1,|L1.546|
;;;326 OS_EXIT_CRITICAL();
000216 f7fff7ff BL OS_CPU_SR_Restore
;;;327 return (OS_ERR_TASK_CREATE_ISR);
00021a 203c MOVS r0,#0x3c
00021c b007 ADD sp,sp,#0x1c
00021e e8bde8bd POP {r4-r11,pc}
|L1.546|
;;;328 }
;;;329 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
000222 4e7d LDR r6,|L1.1048|
000224 f856f856 LDR r1,[r6,r4,LSL #2]
000228 2900 CMP r1,#0
00022a d12f BNE |L1.652|
;;;330 OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
00022c 2101 MOVS r1,#1
00022e f846f846 STR r1,[r6,r4,LSL #2]
;;;331 /* ... the same thing until task is created. */
;;;332 OS_EXIT_CRITICAL();
000232 f7fff7ff BL OS_CPU_SR_Restore
;;;333
;;;334 #if OS_TASK_STAT_STK_CHK_EN > 0
;;;335 OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
000236 4652 MOV r2,r10
000238 4641 MOV r1,r8
00023a 4638 MOV r0,r7
00023c f7fff7ff BL OS_TaskStkClr
;;;336 #endif
;;;337
;;;338 psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */
000240 4653 MOV r3,r10
000242 4658 MOV r0,r11
000244 9a05 LDR r2,[sp,#0x14]
000246 9904 LDR r1,[sp,#0x10]
000248 f7fff7ff BL OSTaskStkInit
;;;339 err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
00024c 4601 MOV r1,r0
00024e 462b MOV r3,r5
000250 463a MOV r2,r7
000252 4620 MOV r0,r4
000254 f8cdf8cd STR r10,[sp,#8]
000258 f8cdf8cd STR r9,[sp,#4]
00025c f8cdf8cd STR r8,[sp,#0]
000260 f7fff7ff BL OS_TCBInit
000264 4605 MOV r5,r0
;;;340 if (err == OS_ERR_NONE) {
000266 b935 CBNZ r5,|L1.630|
;;;341 if (OSRunning == OS_TRUE) { /* Find HPT if multitasking has started */
000268 486f LDR r0,|L1.1064|
00026a 7800 LDRB r0,[r0,#0] ; OSRunning
00026c 2801 CMP r0,#1
00026e d109 BNE |L1.644|
;;;342 OS_Sched();
000270 f7fff7ff BL OS_Sched
000274 e006 B |L1.644|
|L1.630|
;;;343 }
;;;344 } else {
;;;345 OS_ENTER_CRITICAL();
000276 f7fff7ff BL OS_CPU_SR_Save
;;;346 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */
00027a 2100 MOVS r1,#0
00027c f846f846 STR r1,[r6,r4,LSL #2]
;;;347 OS_EXIT_CRITICAL();
000280 f7fff7ff BL OS_CPU_SR_Restore
|L1.644|
;;;348 }
;;;349 return (err);
000284 4628 MOV r0,r5
000286 b007 ADD sp,sp,#0x1c
000288 e8bde8bd POP {r4-r11,pc}
|L1.652|
;;;350 }
;;;351 OS_EXIT_CRITICAL();
00028c f7fff7ff BL OS_CPU_SR_Restore
;;;352 return (OS_ERR_PRIO_EXIST);
000290 2028 MOVS r0,#0x28
;;;353 }
000292 b007 ADD sp,sp,#0x1c
000294 e8bde8bd POP {r4-r11,pc}
;;;354 #endif
ENDP
OSTaskDel PROC
;;;393 INT8U OSTaskDel (INT8U prio)
;;;394 {
000298 e92de92d PUSH {r4-r10,lr}
00029c 4605 MOV r5,r0
;;;395 #if OS_EVENT_EN
;;;396 OS_EVENT *pevent;
;;;397 #endif
;;;398 #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
;;;399 OS_FLAG_NODE *pnode;
;;;400 #endif
;;;401 OS_TCB *ptcb;
;;;402 INT8U y;
;;;403 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;404 OS_CPU_SR cpu_sr = 0;
;;;405 #endif
;;;406
;;;407
;;;408
;;;409 if (OSIntNesting > 0) { /* See if trying to delete from ISR */
00029e 4863 LDR r0,|L1.1068|
0002a0 7800 LDRB r0,[r0,#0] ; OSIntNesting
0002a2 b110 CBZ r0,|L1.682|
;;;410 return (OS_ERR_TASK_DEL_ISR);
0002a4 2040 MOVS r0,#0x40
0002a6 e8bde8bd POP {r4-r10,pc}
|L1.682|
;;;411 }
;;;412 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
0002aa 2d1f CMP r5,#0x1f
0002ac d102 BNE |L1.692|
;;;413 return (OS_ERR_TASK_DEL_IDLE);
0002ae 203e MOVS r0,#0x3e
0002b0 e8bde8bd POP {r4-r10,pc}
|L1.692|
;;;414 }
;;;415 #if OS_ARG_CHK_EN > 0
;;;416 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
0002b4 d304 BCC |L1.704|
;;;417 if (prio != OS_PRIO_SELF) {
0002b6 2dff CMP r5,#0xff
0002b8 d002 BEQ |L1.704|
;;;418 return (OS_ERR_PRIO_INVALID);
0002ba 202a MOVS r0,#0x2a
0002bc e8bde8bd POP {r4-r10,pc}
|L1.704|
;;;419 }
;;;420 }
;;;421 #endif
;;;422
;;;423 OS_ENTER_CRITICAL();
0002c0 f7fff7ff BL OS_CPU_SR_Save
0002c4 4607 MOV r7,r0
;;;424 if (prio == OS_PRIO_SELF) { /* See if requesting to delete self */
0002c6 2dff CMP r5,#0xff
0002c8 d103 BNE |L1.722|
;;;425 prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */
0002ca 4854 LDR r0,|L1.1052|
0002cc 6800 LDR r0,[r0,#0] ; OSTCBCur
0002ce f890f890 LDRB r5,[r0,#0x2e]
|L1.722|
;;;426 }
;;;427 ptcb = OSTCBPrioTbl[prio];
0002d2 4e51 LDR r6,|L1.1048|
0002d4 f856f856 LDR r4,[r6,r5,LSL #2]
;;;428 if (ptcb == (OS_TCB *)0) { /* Task to delete must exist */
0002d8 b92c CBNZ r4,|L1.742|
;;;429 OS_EXIT_CRITICAL();
0002da 4638 MOV r0,r7
0002dc f7fff7ff BL OS_CPU_SR_Restore
;;;430 return (OS_ERR_TASK_NOT_EXIST);
0002e0 2043 MOVS r0,#0x43
0002e2 e8bde8bd POP {r4-r10,pc}
|L1.742|
;;;431 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -