将rt-thread移植到W806上遇到的宏定义INIT_EXPORT(fn, level)编译后运行的内存出错问题?

发布于 2022-07-18 18:38:58

最近将rt-thread移植到W806上,从stm32F103的rt-htread工程代码移植到W806,基本的GPIO和UART修改后能通过,但运行出错。经过排查,问题出现在函数rt_components_board_init()中的__rt_init_rti_board_start的宏定义INIT_EXPORT(fn,level),凡是用到了对宏定义INIT_EXPORT(fn,level)的变量调用,编译后对结构体变量rt_object_container[]的内存空间都造成了破坏,而且内存破坏的结果很奇怪,原内存数据整体向后移动了若干字节。相同的代码在stm32F103下编译后运行没有问题。我已将该问题在联盛德官方提供W806的DEMO工程代码WM_SDK_W806上复现了,我已经检查了startup.s和gcc_csky.ld,未发现什么错误,目前怀疑可能是编译工具链在编译处理时有bug,编译是在WIN下,编译工具链是csky-elfabiv2-tools-mingw-minilibc-20210423.tar.gz(我查了下是最新版本,下载地址:https://occ.t-head.cn/community/download?id=3885366095506644992)。

问题描述如下

正常编译后rt_object_container指向的内存空间前4字节应该是01000000,但实际编译后rt_object_container指向的内存空间前4字节是00000000,之前怀疑是startup.s启动初始化到main函数这个阶段对内存作了修改,但没发现有内存拷贝的调用,故怀疑编译工具链的bug。问题的重点是在宏定义INIT_EXPORT(fn,level)和这个宏定义所声明的变量__rt_init_rti_board_start被调用了,这两个关键点同时满足,编译后就会对内存造成破坏。

以下是WM_SDK_W806修改后复现该问题的工程代码(主要是增加了main.h和修改了main.c部分代码)。
WM_SDK_W806_DEBUG.zip

编译WM_SDK_W806的步骤

1. 需要下载编译工具链解压到适当的目录,
2. 修改WM_SDK_W806代码工程中的文件.config下的工具链路径CONFIG_W800_TOOLCHAIN_PATH,
3. WM_SDK_W806目录下直接直接执行make。

请官方技术支持或有余力的同仁帮助分析下bug原因,是否有其他出错可能。

查看更多

关注者
1
被浏览
2.3k
ZYQ
ZYQ 2022-07-18
我已不再支持W80X任何相关问题的回复,请大家不要私信,有问题找 isme 谢谢

下载了你的demo,关于你上述的问题暂时还没有腾出来时间去验证,但是发现了一个问题,感觉你没有理解 INIT_EXPORT 宏的 作用是什么,要想使用该宏 是需要更改链接脚本的,因为 INIT_EXPORT 宏的作用就是把函数的地址,按照顺序放到 section 段内,你如果不指定的话,gcc 编译在链接脚本里找不到该section 的描述,就会忽略此限定词,你可以参考RTthread 官方 BSP 中 CK802的链接脚本的写法进行更改。这是我的一点拙见哈
RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = &fn;

__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览