用RTT Studio建立项目,设备是STM32WB55 Nucleo。
按照RTT的流程,在rtthread_startup()函数中已经有对board的各种接口的初始化。
main()函数中,直接开展应用操作。
其中rt_hw_board_init()
函数(文件 drv_common.c中)已经是改写成STM32对应的函数。
宏定义RT_USING_PIN
在rtconfig.h
文件中也已经定义。
继续调用rt_hw_pin_init(void)
(drv_gpio.c文件中),这个函数中,根据配置打开各个端口,并注册硬件pin设备。
这个函数注册pin设备时,传递了_stm32_pin_ops 结构地址,这个是在这个文件中定义的局部变量。
再下层函数将这个ops地址付给_hw_pin.ops.
一切看起来都非常OK。
但是,main()函数里,执行rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
也就是调用
发现_hw_pin.ops
是空(RT_NULL)
我觉得最大可能性,前面初始化函数就没有执行。
可惜我没能在初始化部分单步跟踪,断点调试。
百思不得其解!
继续求教!请多指导!
那就再来一遍,断点调试一下,虽然 _hw_pin 是全局静态变量,rt_device_pin_register
里打个断点,看看它的初始化后的情况,然后进 rt_pin_mode
函数之前打断点,再看看他啥情况。
可能,它早就变了。
最近也出现了类似的问题,包括rt_thread_mdelay也卡死,一个简单点灯程序,和楼主的现象一样,反复检查也没发现错误,之前使用的时候没问题,最近两天写LCD的驱动突然出现了,新建工程也无法正常运行,奇怪
我打了断点,它不停下来。所以我怀疑,压根儿就没进来。
在main()函数开始部分增加对PIN的硬件初始化。rt_hw_pin_init();
执行后,在进行PIN脚操作,点灯OK。
@咫尺不再天涯 按说,RT_USING_PIN 宏被定义了,
rt_hw_board_init
函数就一定会调用rt_hw_pin_init
@出出啊
在
config.C
里面有#define RT_USING_PIN
在
.comfig
文件里,也有CONFIG_RT_USING_PIN=y
在 Kconfig里,
在SConscript文件中
看工程文件,drv_gpio.c去成功加入项目里。
一切看起来都OK,构建、下载、调试都一气呵成,但只要调用设备相关操作,就出问题。初始化过程还看不到运行过程。
@咫尺不再天涯 要看 rtconfig.h 里面有没有定义。
所以就打断点可以看出来到底有没有被调用到嘛,没有停下来就肯定没被执行呗