- 本帖最后由 小住住 于 2020-6-8 17:43 编辑 *
```
在根据火哥得 RT-Thread 内核实现 第九章 空闲线程与阻塞延时时候,在启动定时器 后,总是进入Hardfaul ,一直找不到什么原因。
/ 启动系统调度器 /
void rt_system_scheduler_start(void)
{
register struct rt_thread *to_thread;
/* 手动指定第一个运行的线程 */
to_thread = rt_list_entry(rt_thread_priority_table[0].next,
struct rt_thread,
tlist);
rt_current_thread = to_thread;
/* 切换到新的线程,该函数在context_rvds.S中实现,在rthw.h声明,用于实现第一次任务切换。
当一个汇编函数在C文件中调用的时候,如果有形参,则执行的时候会将形参传人到CPU寄存器r0。 */
rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);
}```
哎,最后发现是 rt_thread_init(&rt_flag1_thread,
“rt_flag1_thread”,
flag1_thread_entry,
RT_NULL,
&rt_flag1_thread_stack[0],
sizeof(rt_flag1_thread_stack)); 时候 参数传递错误,少传了 线程得名字。导致 退出 pendsv 时候,找不到正确得线程入口地址。
; 恢复中断
MSR PRIMASK, r2
;CPSIE I
ORR lr, lr, #0x04 ; 确保异常返回使用的堆栈指针是PSP,即LR寄存器的位2要为1
BX lr ; 异常返回,这个时候任务堆栈中的剩下内容将会自动加载到xPSR,PC(任务入口地址),R14,R12,R3,R2,R1,R0(任务的形参)
; 同时PSP的值也将更新,即指向任务堆栈的栈顶。在ARMC3中,堆是由高地址向低地址生长的。
ENDP
主要还是自己的问题。