os_task.txt
来自「针对STM32F103的UCOS移植」· 文本 代码 · 共 1,263 行 · 第 1/5 页
TXT
1,263 行
;;;216 OS_Sched();
;;;217 }
;;;218 } else {
;;;219 OS_ENTER_CRITICAL();
;;;220 OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
;;;221 OS_EXIT_CRITICAL();
;;;222 }
;;;223 return (err);
;;;224 }
;;;225 OS_EXIT_CRITICAL();
;;;226 return (OS_ERR_PRIO_EXIST);
;;;227 }
000150 b004 ADD sp,sp,#0x10
000152 e8bd81f0 POP {r4-r8,pc}
|L1.342|
000156 f7fffffe BL OS_CPU_SR_Save
00015a 49b4 LDR r1,|L1.1068|
00015c 7809 LDRB r1,[r1,#0] ;204 ; OSIntNesting
00015e b129 CBZ r1,|L1.364|
000160 f7fffffe BL OS_CPU_SR_Restore
000164 203c MOVS r0,#0x3c ;206
000166 b004 ADD sp,sp,#0x10
000168 e8bd81f0 POP {r4-r8,pc}
|L1.364|
00016c 4eaa LDR r6,|L1.1048|
00016e f8561024 LDR r1,[r6,r4,LSL #2] ;208
000172 2900 CMP r1,#0 ;208
000174 d127 BNE |L1.454|
000176 2101 MOVS r1,#1 ;209
000178 f8461024 STR r1,[r6,r4,LSL #2] ;209
00017c f7fffffe BL OS_CPU_SR_Restore
000180 2300 MOVS r3,#0 ;212
000182 4642 MOV r2,r8 ;212
000184 4639 MOV r1,r7 ;212
000186 4628 MOV r0,r5 ;212
000188 f7fffffe BL OSTaskStkInit
00018c 2300 MOVS r3,#0 ;213
00018e 4601 MOV r1,r0 ;213
000190 9300 STR r3,[sp,#0] ;213
000192 9301 STR r3,[sp,#4] ;213
000194 461a MOV r2,r3 ;213
000196 4620 MOV r0,r4 ;213
000198 9302 STR r3,[sp,#8] ;213
00019a f7fffffe BL OS_TCBInit
00019e 4605 MOV r5,r0 ;213
0001a0 b935 CBNZ r5,|L1.432|
0001a2 48a1 LDR r0,|L1.1064|
0001a4 7800 LDRB r0,[r0,#0] ;215 ; OSRunning
0001a6 2801 CMP r0,#1 ;215
0001a8 d109 BNE |L1.446|
0001aa f7fffffe BL OS_Sched
0001ae e006 B |L1.446|
|L1.432|
0001b0 f7fffffe BL OS_CPU_SR_Save
0001b4 2100 MOVS r1,#0 ;220
0001b6 f8461024 STR r1,[r6,r4,LSL #2] ;220
0001ba f7fffffe BL OS_CPU_SR_Restore
|L1.446|
0001be 4628 MOV r0,r5 ;223
0001c0 b004 ADD sp,sp,#0x10
0001c2 e8bd81f0 POP {r4-r8,pc}
|L1.454|
0001c6 f7fffffe BL OS_CPU_SR_Restore
0001ca 2028 MOVS r0,#0x28 ;226
0001cc b004 ADD sp,sp,#0x10
0001ce e8bd81f0 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 f0120f01 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 f0120f02 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
;;;1058 *pbos++ = (OS_STK)0; /* Clear from bottom of stack and up! */
0001e6 f8402b04 STR r2,[r0],#4
0001ea 2900 CMP r1,#0 ;1056
0001ec d1fa BNE |L1.484|
|L1.494|
;;;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 e92d4fff PUSH {r0-r11,lr}
0001f4 b083 SUB sp,sp,#0xc
0001f6 ad10 ADD r5,sp,#0x40
0001f8 e89507a0 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
;;;322 }
;;;323 #endif
;;;324 OS_ENTER_CRITICAL();
;;;325 if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR */
;;;326 OS_EXIT_CRITICAL();
;;;327 return (OS_ERR_TASK_CREATE_ISR);
;;;328 }
;;;329 if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
;;;330 OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
;;;331 /* ... the same thing until task is created. */
;;;332 OS_EXIT_CRITICAL();
;;;333
;;;334 #if OS_TASK_STAT_STK_CHK_EN > 0
;;;335 OS_TaskStkClr(pbos, stk_size, opt); /* Clear the task stack (if needed) */
;;;336 #endif
;;;337
;;;338 psp = OSTaskStkInit(task, p_arg, ptos, opt); /* Initialize the task's stack */
;;;339 err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt);
;;;340 if (err == OS_ERR_NONE) {
;;;341 if (OSRunning == OS_TRUE) { /* Find HPT if multitasking has started */
;;;342 OS_Sched();
;;;343 }
;;;344 } else {
;;;345 OS_ENTER_CRITICAL();
;;;346 OSTCBPrioTbl[prio] = (OS_TCB *)0; /* Make this priority avail. to others */
;;;347 OS_EXIT_CRITICAL();
;;;348 }
;;;349 return (err);
;;;350 }
;;;351 OS_EXIT_CRITICAL();
;;;352 return (OS_ERR_PRIO_EXIST);
;;;353 }
000206 b007 ADD sp,sp,#0x1c
000208 e8bd8ff0 POP {r4-r11,pc}
|L1.524|
00020c f7fffffe BL OS_CPU_SR_Save
000210 4986 LDR r1,|L1.1068|
000212 7809 LDRB r1,[r1,#0] ;325 ; OSIntNesting
000214 b129 CBZ r1,|L1.546|
000216 f7fffffe BL OS_CPU_SR_Restore
00021a 203c MOVS r0,#0x3c ;327
00021c b007 ADD sp,sp,#0x1c
00021e e8bd8ff0 POP {r4-r11,pc}
|L1.546|
000222 4e7d LDR r6,|L1.1048|
000224 f8561024 LDR r1,[r6,r4,LSL #2] ;329
000228 2900 CMP r1,#0 ;329
00022a d12f BNE |L1.652|
00022c 2101 MOVS r1,#1 ;330
00022e f8461024 STR r1,[r6,r4,LSL #2] ;330
000232 f7fffffe BL OS_CPU_SR_Restore
000236 4652 MOV r2,r10 ;335
000238 4641 MOV r1,r8 ;335
00023a 4638 MOV r0,r7 ;335
00023c f7fffffe BL OS_TaskStkClr
000240 4653 MOV r3,r10 ;338
000242 4658 MOV r0,r11 ;338
000244 9a05 LDR r2,[sp,#0x14] ;338
000246 9904 LDR r1,[sp,#0x10] ;338
000248 f7fffffe BL OSTaskStkInit
00024c 4601 MOV r1,r0 ;339
00024e 462b MOV r3,r5 ;339
000250 463a MOV r2,r7 ;339
000252 4620 MOV r0,r4 ;339
000254 f8cda008 STR r10,[sp,#8] ;339
000258 f8cd9004 STR r9,[sp,#4] ;339
00025c f8cd8000 STR r8,[sp,#0] ;339
000260 f7fffffe BL OS_TCBInit
000264 4605 MOV r5,r0 ;339
000266 b935 CBNZ r5,|L1.630|
000268 486f LDR r0,|L1.1064|
00026a 7800 LDRB r0,[r0,#0] ;341 ; OSRunning
00026c 2801 CMP r0,#1 ;341
00026e d109 BNE |L1.644|
000270 f7fffffe BL OS_Sched
000274 e006 B |L1.644|
|L1.630|
000276 f7fffffe BL OS_CPU_SR_Save
00027a 2100 MOVS r1,#0 ;346
00027c f8461024 STR r1,[r6,r4,LSL #2] ;346
000280 f7fffffe BL OS_CPU_SR_Restore
|L1.644|
000284 4628 MOV r0,r5 ;349
000286 b007 ADD sp,sp,#0x1c
000288 e8bd8ff0 POP {r4-r11,pc}
|L1.652|
00028c f7fffffe BL OS_CPU_SR_Restore
000290 2028 MOVS r0,#0x28 ;352
000292 b007 ADD sp,sp,#0x1c
000294 e8bd8ff0 POP {r4-r11,pc}
;;;354 #endif
ENDP
OSTaskDel PROC
;;;393 INT8U OSTaskDel (INT8U prio)
;;;394 {
000298 e92d47f0 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
;;;411 }
;;;412 if (prio == OS_TASK_IDLE_PRIO) { /* Not allowed to delete idle task */
;;;413 return (OS_ERR_TASK_DEL_IDLE);
;;;414 }
;;;415 #if OS_ARG_CHK_EN > 0
;;;416 if (prio >= OS_LOWEST_PRIO) { /* Task priority valid ? */
;;;417 if (prio != OS_PRIO_SELF) {
;;;418 return (OS_ERR_PRIO_INVALID);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?