嵌入式技术william hill官网
直播中

mintsy

9年用户 1492经验值
擅长:MEMS/传感技术
私信 关注
[问答]

返回获取当前线程句柄为空(RT_NULL)是怎么回事

main()函数中,完成各类外设初始化后,执行rt_thread_mdelay(500);进入异常。

跟踪原因:

执行到rt_err_t rt_thread_sleep(rt_tick_t tick)这个函数时,
在取当前线程句柄时,返回为空

thread = rt_thread_self();
RT_ASSERT(thread != RT_NULL);

在函数rt_thread_self(void)中,返回变量rt_current_thread,这个值为0,应该是未赋值。
求赐教!
谢谢!

回帖(6)

陈丽

2022-9-27 10:07:51
返回空说明此时调度器没有启动,你延时函数放的位置有问题,太早了。
举报

王萍

2022-9-27 10:08:03
main本身就是一个线程,假如delay后也不应该有影响,你说的异常具体是什么呢,有没有日志或者具体现象?
最好把异常的日志和main函数中的代码贴出来看看,方便大家分析。
举报

王萍

2022-9-27 10:08:08
你这一堆初始化放main函数里干啥呢。进入main函数后都已经开始任务调度了。这里又调用HAL_init和SystemClock_Config()重置外围和时钟配置,肯定是有问题的呀。
举报

mintsy

2022-9-27 10:08:22
这是生成的项目里面就包含的这个函数,我直接拿来用的。我觉得用RTT Studio生成的BSP是基于ST的CubeMX的,和RTT的函数有重叠。风格与数据结构、处理流程都有不少差异,要有机整合在一起,还真不容易。
举报

王萍

2022-9-27 10:08:32
studio生成的BSP并不是说基于Cubemx的,而是结合cubemx进行开发的。studio仅用到了cubemx生成的stm32fxxx_hal_conf.h和stm32fxxx_hal_msp.c文件,这是对芯片的时钟和底层进行配置,studio会调用其中的配置函数。像MX_GPIO_Init();这些初始化函数,是不调用的,RT各设备驱动会进行相应的初始化操作,因此这些初始化不需要添加进来。studio结合cubemx进行开发还是很方便快捷的。
举报

mintsy

2022-9-27 10:08:57
确实,main()函数中,不需要再按照CubeMx的初始化流程再做一遍,
按照RTT的流程,在rtthread_startup()函数中已经有对board的各种接口的初始化。
1.jpg
其中rt_hw_board_init()函数(文件 drv_common.c中)已经是改写成STM32对应的函数。
宏定义 RT_USING_PIN 在rtconfig.h文件中也已经定义。
继续调用 rt_hw_pin_init(void) (drv_gpio.c文件中),这个函数中,根据配置打开各个端口,并注册硬件pin设备。 rt_device_pin_register(“pin”, &_stm32_pin_ops, RT_NULL);
这个函数注册pin设备时,传递了_stm32_pin_ops 结构地址,这个是在这个文件中定义的局部变量。

再下层函数将这个ops地址付给 _hw_pin.ops.

一切看起来都非常OK。

但是,main()函数里,执行 rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
也就是调用
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
_hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}
发现_hw_pin.ops 是空(RT_NULL)

我觉得最大可能性,前面初始化函数就没有执行。
可惜我没能在初始化部分单步跟踪,断点调试。

百思不得其解!
继续求教!请多指导!

举报

更多回帖

发帖
×
20
完善资料,
赚取积分