📄 rtx_config.txt
字号:
;;;400
;;;401 /* Initialize general part of TCB */
;;;402 p_TCB->cb_type = TCB;
000280 e3a00000 MOV r0,#0
000284 e5c40000 STRB r0,[r4,#0]
;;;403 p_TCB->state = READY;
000288 e3a00001 MOV r0,#1
00028c e5c40001 STRB r0,[r4,#1]
;;;404 p_TCB->prio = priority;
000290 e5c45002 STRB r5,[r4,#2]
;;;405 p_TCB->p_lnk = NULL;
000294 e3a00000 MOV r0,#0
000298 e5840004 STR r0,[r4,#4]
;;;406 p_TCB->p_rlnk = NULL;
00029c e5840008 STR r0,[r4,#8]
;;;407 p_TCB->p_dlnk = NULL;
0002a0 e584000c STR r0,[r4,#0xc]
;;;408 p_TCB->p_blnk = NULL;
0002a4 e5840010 STR r0,[r4,#0x10]
;;;409 p_TCB->delta_time = 0;
0002a8 e1c401b4 STRH r0,[r4,#0x14]
;;;410 p_TCB->interval_time = 0;
0002ac e1c401b6 STRH r0,[r4,#0x16]
;;;411 p_TCB->events = 0;
0002b0 e1c401b8 STRH r0,[r4,#0x18]
;;;412 p_TCB->waits = 0;
0002b4 e1c401ba STRH r0,[r4,#0x1a]
;;;413
;;;414 /* Initialize ARM specific part of TCB */
;;;415 p_TCB->full_ctx = full_context;
0002b8 e5c47021 STRB r7,[r4,#0x21]
;;;416
;;;417 /* Prepare a complete interrupt frame for first task start */
;;;418 if (p_TCB->priv_stack != 0) {
0002bc e1d402b2 LDRH r0,[r4,#0x22]
0002c0 e3500000 CMP r0,#0
0002c4 0a000004 BEQ |L1.732|
;;;419 /* User has provided a memory space for the stack. */
;;;420 stk = &p_TCB->stack[p_TCB->priv_stack>>2];
0002c8 e5940028 LDR r0,[r4,#0x28]
0002cc e1d412b2 LDRH r1,[r4,#0x22]
0002d0 e1a01141 ASR r1,r1,#2
0002d4 e0808101 ADD r8,r0,r1,LSL #2
0002d8 ea000004 B |L1.752|
;;;421 }
;;;422 else {
;;;423 /* Allocate the memory space for the stack. */
;;;424 p_TCB->stack = _alloc_box (m_stk);
|L1.732|
0002dc e59f01fc LDR r0,|L1.1248|
0002e0 ef000001 SVC 0x1 ; formerly SWI
0002e4 e5840028 STR r0,[r4,#0x28]
;;;425 /* Write to the top of stack. */
;;;426 stk = &p_TCB->stack[OS_STKSIZE];
0002e8 e5940028 LDR r0,[r4,#0x28]
0002ec e28080c8 ADD r8,r0,#0xc8
;;;427 }
;;;428
;;;429 /* Initial PC and default CPSR */
;;;430 *--stk = (U32)task_body;
|L1.752|
0002f0 e2480004 SUB r0,r8,#4
0002f4 e1a08000 MOV r8,r0
0002f8 e5806000 STR r6,[r0,#0]
;;;431 i = INITIAL_CPSR;
0002fc e3a09141 MOV r9,#0x40000010
;;;432
;;;433 /* If a task in THUMB mode, set T-bit. */
;;;434 if ((U32)task_body & 1) {
000300 e3160001 TST r6,#1
000304 0a000000 BEQ |L1.780|
;;;435 i |= 0x00000020;
000308 e3899020 ORR r9,r9,#0x20
;;;436 }
;;;437 *--stk = i;
|L1.780|
00030c e2480004 SUB r0,r8,#4
000310 e1a08000 MOV r8,r0
000314 e5809000 STR r9,[r0,#0]
;;;438
;;;439 /* Write initial registers. */
;;;440 for (i = full_context ? 13 : 8; i; i--) {
000318 e3570000 CMP r7,#0
00031c 0a000001 BEQ |L1.808|
000320 e3a0000d MOV r0,#0xd
000324 ea000000 B |L1.812|
|L1.808|
000328 e3a00008 MOV r0,#8
|L1.812|
00032c e1a09000 MOV r9,r0
000330 ea000004 B |L1.840|
;;;441 *--stk = 0;
|L1.820|
000334 e3a00000 MOV r0,#0
000338 e2481004 SUB r1,r8,#4
00033c e1a08001 MOV r8,r1
000340 e5810000 STR r0,[r1,#0]
000344 e2499001 SUB r9,r9,#1 ;440
|L1.840|
000348 e3590000 CMP r9,#0 ;440
00034c 1afffff8 BNE |L1.820| ;440
;;;442 }
;;;443
;;;444 /* For "full_context" assign a void pointer to R0. */
;;;445 if (full_context) {
000350 e3570000 CMP r7,#0
000354 0a000003 BEQ |L1.872|
;;;446 *--stk = (U32)p_TCB->p_msg;
000358 e2481004 SUB r1,r8,#4
00035c e1a08001 MOV r8,r1
000360 e594001c LDR r0,[r4,#0x1c]
000364 e5810000 STR r0,[r1,#0]
;;;447 }
;;;448
;;;449 /* Initial Task stack pointer. */
;;;450 p_TCB->tsk_stack = (U32)stk;
|L1.872|
000368 e5848024 STR r8,[r4,#0x24]
;;;451
;;;452 /* Task entry point. */
;;;453 p_TCB->ptask = task_body;
00036c e584602c STR r6,[r4,#0x2c]
;;;454
;;;455 #if (OS_STKCHECK == 1)
;;;456 /* Set a magic word for checking of stack overflow. */
;;;457 p_TCB->stack[0] = MAGIC_WORD;
000370 e59f0170 LDR r0,|L1.1256|
000374 e5941028 LDR r1,[r4,#0x28]
000378 e5810000 STR r0,[r1,#0]
;;;458 #endif
;;;459 } /* end of os_init_context */
00037c e8bd47f0 POP {r4-r10,lr}
000380 e12fff1e BX lr
ENDP
__SWI_0 PROC
;;;464 void __swi(0) os_switch_tasks (P_TCB p_new);
;;;465 void __SWI_0 (P_TCB p_new) {
000384 e92d4010 PUSH {r4,lr}
000388 e1a04000 MOV r4,r0
;;;466 /* Switch to next task (identified by "p_new"). Saving old and restoring */
;;;467 /* new context is written in assembly (module: Swi_RTX.s) */
;;;468
;;;469 #if (OS_STKCHECK == 1)
;;;470 if (tstclrb (&os_del_flag) == __FALSE) {
00038c e59f0150 LDR r0,|L1.1252|
000390 ebfffffe BL tstclrb
000394 e3500000 CMP r0,#0
000398 1a00000f BNE |L1.988|
;;;471 /* Do not check if task has deleted itself. */
;;;472 if ((os_runtask->tsk_stack < (U32)os_runtask->stack) ||
00039c e59f0110 LDR r0,|L1.1204|
0003a0 e5900000 LDR r0,[r0,#0] ; os_runtask
0003a4 e5900024 LDR r0,[r0,#0x24]
0003a8 e59f1104 LDR r1,|L1.1204|
0003ac e5911000 LDR r1,[r1,#0] ; os_runtask
0003b0 e5911028 LDR r1,[r1,#0x28]
0003b4 e1500001 CMP r0,r1
0003b8 3a000006 BCC |L1.984|
;;;473 (os_runtask->stack[0] != MAGIC_WORD )) {
0003bc e59f00f0 LDR r0,|L1.1204|
0003c0 e5900000 LDR r0,[r0,#0] ; os_runtask
0003c4 e5900028 LDR r0,[r0,#0x28]
0003c8 e5900000 LDR r0,[r0,#0]
0003cc e59f1114 LDR r1,|L1.1256|
0003d0 e1500001 CMP r0,r1
0003d4 0a000000 BEQ |L1.988|
;;;474 os_stk_overflow ();
|L1.984|
0003d8 ebfffffe BL os_stk_overflow
;;;475 }
;;;476 }
;;;477 #endif
;;;478 os_runtask->full_ctx = __FALSE;
|L1.988|
0003dc e3a00000 MOV r0,#0
0003e0 e59f10cc LDR r1,|L1.1204|
0003e4 e5911000 LDR r1,[r1,#0] ; os_runtask
0003e8 e5c10021 STRB r0,[r1,#0x21]
;;;479 os_runtask = p_new;
0003ec e59f00c0 LDR r0,|L1.1204|
0003f0 e5804000 STR r4,[r0,#0] ; os_runtask
;;;480 p_new->state = RUNNING;
0003f4 e3a00002 MOV r0,#2
0003f8 e5c40001 STRB r0,[r4,#1]
;;;481 #if (OS_ROBIN == 1)
;;;482 if (p_new->full_ctx == __TRUE) {
0003fc e5d40021 LDRB r0,[r4,#0x21]
000400 e3500001 CMP r0,#1
000404 1a000001 BNE |L1.1040|
;;;483 os_tsk_robin = p_new;
000408 e59f00dc LDR r0,|L1.1260|
00040c e5804000 STR r4,[r0,#0] ; os_tsk_robin
;;;484 }
;;;485 #endif
;;;486 /* Tsk_Unlock */
;;;487 OS_UNLOCK();
|L1.1040|
000410 e3a00000 MOV r0,#0
000414 e5100800 LDR r0,[r0,#-0x800]
000418 e3800001 ORR r0,r0,#1
00041c e3a01000 MOV r1,#0
000420 e5010800 STR r0,[r1,#-0x800]
;;;488 } /* end of os_switch_tasks */
000424 e8bd4010 POP {r4,lr}
000428 e12fff1e BX lr
ENDP
os_chk_robin PROC
;;;492
;;;493 void os_chk_robin (void) {
00042c e92d4010 PUSH {r4,lr}
;;;494 /* Check if Round Robin timeout expired and switch to the next ready task.*/
;;;495 /* This function is called from the "os_clock_demon()" task scheduler. */
;;;496 #if (OS_ROBIN == 1)
;;;497 P_TCB p_new;
;;;498
;;;499 if (os_rdy.p_lnk != os_tsk_robin) {
000430 e59f00b8 LDR r0,|L1.1264|
000434 e5900004 LDR r0,[r0,#4] ; os_rdy
000438 e59f10ac LDR r1,|L1.1260|
00043c e5911000 LDR r1,[r1,#0] ; os_tsk_robin
000440 e1500001 CMP r0,r1
000444 0a000007 BEQ |L1.1128|
;;;500 os_robin_time = os_time + OS_ROBINTOUT;
000448 e59f00a4 LDR r0,|L1.1268|
00044c e1d000b0 LDRH r0,[r0,#0] ; os_time
000450 e2800005 ADD r0,r0,#5
000454 e3c00801 BIC r0,r0,#0x10000
000458 e59f1070 LDR r1,|L1.1232|
00045c e1c100b0 STRH r0,[r1,#0] ; os_robin_time
;;;501 return;
;;;502 }
;;;503 if (os_robin_time == os_time) {
;;;504 /* Round Robin timeout has expired. */
;;;505 os_robin_time += OS_ROBINTOUT;
;;;506 p_new = os_get_first (&os_rdy);
;;;507 os_put_prio ((P_XCB)&os_rdy, p_new);
;;;508 }
;;;509 #endif
;;;510 } /* end of os_chk_robin */
|L1.1120|
000460 e8bd4010 POP {r4,lr}
000464 e12fff1e BX lr
|L1.1128|
000468 e59f0060 LDR r0,|L1.1232| ;503
00046c e1d000b0 LDRH r0,[r0,#0] ;503 ; os_robin_time
000470 e59f107c LDR r1,|L1.1268| ;503
000474 e1d110b0 LDRH r1,[r1,#0] ;503 ; os_time
000478 e1500001 CMP r0,r1 ;503
00047c 1a00000b BNE |L1.1200| ;503
000480 e59f0048 LDR r0,|L1.1232| ;505
000484 e1d000b0 LDRH r0,[r0,#0] ;505 ; os_robin_time
000488 e2800005 ADD r0,r0,#5 ;505
00048c e3c00801 BIC r0,r0,#0x10000 ;505
000490 e59f1038 LDR r1,|L1.1232| ;505
000494 e1c100b0 STRH r0,[r1,#0] ;505 ; os_robin_time
000498 e59f0050 LDR r0,|L1.1264| ;506
00049c ebfffffe BL os_get_first ;506
0004a0 e1a04000 MOV r4,r0 ;506
0004a4 e1a01004 MOV r1,r4 ;507
0004a8 e59f0040 LDR r0,|L1.1264| ;507
0004ac ebfffffe BL os_put_prio ;507
|L1.1200|
0004b0 eaffffea B |L1.1120|
|L1.1204|
0004b4 00000000 DCD os_runtask
|L1.1208|
0004b8 00000000 DCD ||.data||
|L1.1212|
0004bc e0009000 DCD 0xe0009000
|L1.1216|
0004c0 00000000 DCD os_clock_TCB
|L1.1220|
0004c4 000004ab DCD 0x000004ab
|L1.1224|
0004c8 00008010 DCD 0x00008010
|L1.1228|
0004cc 00000000 DCD os_clock_interrupt
|L1.1232|
0004d0 00000004 DCD ||.data|| + 4
|L1.1236|
0004d4 00000000 DCD os_active_TCB
|L1.1240|
0004d8 00000000 DCD ||.bss.5||
|L1.1244|
0004dc 800000c8 DCD 0x800000c8
|L1.1248|
0004e0 00000130 DCD ||.bss.5|| + 304
|L1.1252|
0004e4 0000000c DCD ||.data|| + 12
|L1.1256|
0004e8 e25a2ea5 DCD 0xe25a2ea5
|L1.1260|
0004ec 00000008 DCD ||.data|| + 8
|L1.1264|
0004f0 00000000 DCD os_rdy
|L1.1268|
0004f4 00000000 DCD os_time
ENDP
AREA ||.data||, DATA, ALIGN=2
||task_id@os_stk_overflow_0||
DCD 0x00000000
os_robin_time
DCB 0x00,0x00
DCB 0x00,0x00
os_tsk_robin
DCD 0x00000000
os_del_flag
DCB 0x00
AREA ||.constdata.1||, DATA, READONLY, ALIGN=2
os_maxtaskrun
DCW 0x0006
DCB 0x00,0x00
os_stackinfo
DCD 0x010000c8
os_clockrate
DCD 0x00002710
os_timernum
DCD 0x00000000
os_rrobin
DCD 0x00010005
AREA ||.bss.5||, NOINIT, ALIGN=3
m_tcb
% 304
m_stk
% 1616
os_active_TCB
% 24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -