nu-lb-nuc140 RTX 流程 分析(五)
t_phaseA = os_tsk_create (phaseA, 1); /* start task phaseA */
#define os_tsk_create(tsk,prio) _os_tsk_create((U32)rt_tsk_create,tsk,prio,NULL,NULL)
extern OS_TID _os_tsk_create (U32 p, void (*task)(void), U32 prio_stksz,
void *stk, void *argv) __SVC_0;
r12 中保存的是p 函数的地址 ----- rt_tsk_create
r0 中保存的是task 函数的地址 ----- phaseA
r1 中保存的是 prio_stksz的值 ----- 1
r2 中保存的是stk
r3中保存的是argv
R0是作为函数的返回值,写到PSP栈中。
PSP 的内容只是 修改了 R0的值,其他的没有修改。
SVC 0 之后 ,会把r0 ,r1,r2,r3,r12,返回地址依次存入PSP堆栈中
SVC 0 返回的时候,
运行完毕之后,
t_phaseA = 0x00000002
dispatch 调度;
p_BM->free = 0x2000 0210
p_BM->end = 0x2000 0A10
p_BM->blk_size = 0x0000 0100
next_block = 0x2000 0210 – task1 — idle
next_block = 0x2000 0310 – task2 — init
next_block = 0x2000 0410 – task3 — phaseA
next_block = 0x2000 0510 – task4
next_block = 0x2000 0610 – task5
next_block = 0x2000 0710 – task6
next_block = 0x2000 0810 – task7
next_block = 0x2000 0910
next_block = 0x2000 0A10
123
end = 0x2000 01C8
blk_size = 0x38 = 56
box_size = 404 = 0x194
P_BM->free = 0x2000 0078
P_BM->end = 0x2000 0200
P_BM->blk_size = 0x0000 0038
block1 = 0x2000 0078
block2 = 0x2000 00B0
block3 = 0x2000 00E8
block4 = 0x2000 0120
block5 = 0x2000 0158
block6 = 0x2000 0190
block7 =0x2000 01C8
t_phaseA = 0x00000002
#define os_evt_set(evt_flags,task_id) _os_evt_set((U32)rt_evt_set,evt_flags,task_id)
extern void _os_evt_set (U32 p, U16 event_flags, OS_TID task_id) __SVC_0;
p = rt_evt_set
event_flags = 0x0001
task_id = t_phaseA
_os_evt_set(rt_evt_set,0x0001,t_phaseA)
r0 = evt_flags
r1 = t_phaseA
r12 = rt_evt_set 的地址
BLX 解析
入栈 和出栈 ,以及R0 和R1 作为参数
os_tsk_delete_self
#define os_tsk_delete_self() { _os_tsk_delete((U32)rt_tsk_delete, 0); for(;?; }
extern OS_RESULT _os_tsk_delete (U32 p, OS_TID task_id) __SVC_0;
r0 = 0
r12 = rt_tsk_delete