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
本文详细解析了NU-LB-NUC140RTX系统中的任务创建过程,包括使用os_tsk_create函数创建任务的具体步骤,如参数设置、寄存器操作、内存分配等,并展示了任务调度、事件设置及任务删除的内部机制。
6248

被折叠的 条评论
为什么被折叠?



