前言- 为了不再CTRL+C,CTRL+V,修改,我开始尝试手敲代码。
- RT-Thread线程可以静态初始化,也可以动态申请内存的方式创建
静态初始化线程- 静态初始化线程时,线程结构体与线程的栈,必须是【全局变量】
- 我当时没在意,静态初始化线程时,线程结构体使用函数内的局部变量,编译通过了,运行就死机。
- 死机原因hardfault,bus fault,不过,经过耐心的分析,很快发现初始化的线程结构体数据不正确,原来是局部变量引起的。
- 线程的结构体,会作为内核线程对象,链入到链表。链表的每个节点,必须是全局的。
- 局部变量,会在函数调用结束后释放,造成链表节点数据损坏,线程无法正确调度。
问题代码
- #include
- #ifndef PMS_THREAD_STACK_SIZE
- #define PMS_THREAD_STACK_SIZE 512
- #endif
- #ifndef PMS_THREAD_PRIORITY
- #define PMS_THREAD_PRIORITY 10
- #endif
- static rt_uint8_t pms_thread_stack[PMS_THREAD_STACK_SIZE];
- static struct rt_thread pms_thread;
- #ifndef DMS_THREAD_STACK_SIZE
- #define DMS_THREAD_STACK_SIZE 1024
- #endif
- #ifndef DMS_THREAD_PRIORITY
- #define DMS_THREAD_PRIORITY 9
- #endif
- static rt_uint8_t dms_thread_stack[DMS_THREAD_STACK_SIZE];
- void pms_thread_entry(void* parameter)
- {
- rt_kprintf("%s : enter!n", __func__);
- while (1)
- {
- rt_thread_mdelay(5000);
- rt_kprintf("%s : tick=%dn", __func__, rt_tick_get());
- }
- }
- void pms_thread_init(void)
- {
- struct rt_thread *tid;
- rt_err_t ret = RT_EOK;
- tid = &pms_thread;
- ret = rt_thread_init(tid, "pms", pms_thread_entry, RT_NULL,
- pms_thread_stack, sizeof(pms_thread_stack),
- PMS_THREAD_PRIORITY, 20);
- if (ret == RT_EOK)
- {
- rt_thread_startup(tid);
- rt_kprintf("%s : enter!n", __func__);
- }
- else
- {
- rt_kprintf("%s : error! ret=%d", __func__, ret);
- }
- }
- void dms_thread_entry(void* parameter)
- {
- rt_kprintf("%s : enter!n", __func__);
- while (1)
- {
- rt_thread_mdelay(6000);
- rt_kprintf("%s : tick=%dn", __func__, rt_tick_get());
- }
- }
- void dms_thread_init(void)
- {
- struct rt_thread *tid;
- tid = rt_thread_create("dms", dms_thread_entry, RT_NULL,
- DMS_THREAD_STACK_SIZE, DMS_THREAD_PRIORITY, 20);
- if (tid != RT_NULL)
- {
- rt_thread_startup(tid);
- rt_kprintf("%s : enter!n", __func__);
- }
- else
- {
- rt_kprintf("%s : error!n", __func__);
- }
- }
- MSH_CMD_EXPORT(pms_thread_init, pms thread init);
- MSH_CMD_EXPORT(dms_thread_init, dms thread create);
复制代码
跳坑总结- 遇到死机问题,不慌,软件调试,发现问题,分析问题,找到解决方法,可以使用排除法,缩小范围,快速定位问题。
- 注意静态初始化内核对象,需要使用全局变量,动态申请的内存,返回的是堆上的全局的指针。
- 静态初始化线程,需要全局的线程栈(全局数组),全局的线程结构体(非结构体指针)
|