嵌入式技术论坛
直播中

梅利号

8年用户 1494经验值
擅长:可编程逻辑
私信 关注
[问答]

INIT_DEVICE_EXPORT问题求助,代码放到C文件就报错

我写了这样一个函数
int drv_test_hw_init(void)
{
rt_kprintf("in drv_test_hw_init 000
");
return 0;
} INIT_DEVICE_EXPORT(drv_test_hw_init);
这些代码放到bsp/my_board/drivers/uart_drv.c中可以正常启动,也会有打印drv_test_hw_init;
放到另外一个c文件里面就报错,如图,从map里面看 drv_test_hw_init的地址0x8000b800 __rt_init_drv_test_hw_init的地址0x8008b460,而从报错信息看 8008b460对应的函数是8008bbf8


initialize desc = 8008b460 desc->fn = 8008bbf8 undefined instruction:


回帖(4)

最强海贼王

2022-4-14 09:39:04
你在使用 rt_kprintf 的时候,在这之前需要把串口初始化一下,放在 uart_drv.c 里面的时候系统编译后你可以看一下 map 文件,自定义的 drv_test_hw_init 应该在串口初始化之后,放在别的文件自定义的 drv_test_hw_init 可能导致在串口初始化之前进行调用了,所以导致了错误。
自定义的话,可以使用别的自动初始化比如 INIT_APP_EXPORT ,这样就能避免类似的错误了。


举报

贾小龙

2022-4-14 09:39:14
降低一个等级后,component到app均可,再放到不同文件中编译应该不会出问题了。

自动初始化时,如果需要串口输出,不要用int device等级,usart在这个时候都不一定成功初始化了,在函数中调用rt_kprintf当然会出问题。

lz debug一下,并且结合查看map文件中.rti_fn.3的函数顺序,看看到底是usart先被驱动,还是你自定义的drv_test_hw_init函数先被调用,应该就能知道原因了。

断点设置rt_components_board_init函数中,即可清晰看到各个自动初始化的调用顺序。
举报

陈伟

2022-4-14 09:39:24
换个文件就出错?怎么可能。
这几行代码无论放到那个c文件里,只要它被编译了。最终的执行顺序都是一样的。
不一样的可能是函数实体在flash中的位置。还可能影响到全局变量内存布局顺序。
可以肯定的是问题不在这个函数上,别在这里浪费时间
举报

李燕

2022-4-14 09:39:32
大概率是在串口初始化之前被调用了吧
举报

更多回帖

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