STM32F303移植RT-Thread过程中因选择的芯片内核文件错误出现内存不足和hard fault问题

最近这几天在移植RT-Thread,移植的方式是从官网下载rtthread-nano-master源文件,然后添加到STM32CubeMX工程中去。移植点灯简单串口等都能正常,但是当创建两个线程的时候就出现了各种BUG,比如一个线程能跑,创建两个线程就死机,当系统调度一起来就开始死机。两个线程不管只要任意删掉一个都能正常跑。偶尔有时候删掉一个也会报空闲线程进入hardfault,但概率很小。在移植Finish的时候即使只保留一个线程也一直在报错,但不是报hardfault,而是报内存不足,如下图所示,但是我用的芯片是STM32F303VCT6,FLASH是256K,FLASH是48K的,查看.map文件,FLASH占用才20.52K,RAM才18.59K,还远远有得剩余呀。
报没有内存.map文件中显示的FLAH和RAM使用量

无耐之下只好重新在搞个新工程再移植一遍,结果还是一毛一样,直接给我整傻眼了。又是网上找资料又是翻看代码,耗费了好长时间也没有解决,到交流群上问也没有人鸟。
最后想起MDK里面可以直接移植,只要勾选配置下就行,不需要拷贝文件,要不用这种方法移植下看看?说干就干,又非了好一会才移植好,移植好后创建两个跑马灯线程,能正常跑,并没有前面用拷贝文件方法移植中出现的死机。把shell移植进去,shell也跑得好好的。这下基本确认了肯定是移植的过程中那些文件有问题或者那些文件的配置上有问题。于是把没问题的工程中的需要修改的那几个文件的内容全部复制粘贴到有问题的工程的相同文件上,再尝试,一个文件一个文件的尝试,把所有需要改的文件都换完了还是不行,最后连内核文件都给换了还是不行。

在绝望的边缘徘徊挣扎,一个工程有问题,一个没问题,文件该换的都换了,该对的都对了,那就是MDK的配置可能有问题了,对比了下两个工程的配置,一毛一样。绝望加一。最后想要对比整个工程的所有文件,奈何我自己手动建的工程文件树跟MDK自己建的又不一样,MDK的工程拷出来还没有包含rt-thread的内核文件,对比也是麻烦得要命,对比了几个文件发现后面没法进行下去只好放弃。

最后想到了一招,对比两个工程的.map文件。刚开始的时候从头开始对,虽然借助了对比工具,发现因为项目文件树不一样导致两个工程中相同的文件的编译顺序也不一样,这意味着.map文件中有些内容虽然是相同的,但是不在同一行,对比软件也把这些当成不同的,结果就是屏幕上一大片红(红代表有差异),根本无从下手。
函数、变量太多,对比这两者不显示,但是文件数并不是很多,而且文件不是按编译顺序排列的,而是按照文件名的顺序来的,这就意味着两个工程的各个文件的信息在map文件中的顺序基本是一样的,那对起来就容易多了,只要将其拷贝到Excel中,再借助=if函数要找出差异就不是很难了。更重要的是文件数也不太多。
.map文件中包含的各文件的信息
于是把两个工程的map文件的文件信息拷贝到excel中,按同样的顺序一个工程一列,然后利用Excel的函数先粗筛出不同的,相同的就不用关注了。一对比,发现两个工程的context_rvds.o和cpuport.o文件的Code和RO Data有差异,其他的文件即使Debug大小有差异,但其他项均没有大差异。所以就先锁定这两个文件了。将正常的工程的cpuport复制到有问题的工程中,保存编译烧录,还是有问题。继续如法炮制context_rvds,咦,串口工具上出现msh>了。我去,我去,老子找到问题了。竟然是这两个文件,由于这两个文件在移植的过程中是不需要更改的,所以前面的不管是对比还是替换文件都没有想到它们,就这样被它们成了漏网之鱼。
两个工程文件信息对比

但是,为什么采用复制文件的方式移植的这两个文件和采用MDK配置方式移植的这两个文件会不一样呢?看看MDK配置的工程中这两个文件在哪。把鼠标放到正常的工程的context_rvds右键后选择打开文件所在路径(如下左图),弹出下右图,咦,等等,这个文件怎么是在cortex-m4文件夹下?STM32F303不是M3内核的吗?????
从MAK中打开某个文件所在的路径
打开的context_rvds.s文件所有的路径

赶紧找出手册,看到手册那一瞬间心中一万匹草泥马奔腾而过。。。。。。。。。自己把自己整坑里去了,这么一个小小的不注意,坑了自己浪费那么多时间在那瞎调。。。。。。。。
问题是找到原因了,也解决了,但更重要的是要吃一堑长一智,以后别被自己的这种傻逼问题给坑了,总结出来一方面告诫自己,另一方面是防止自己以后哪天忘了又重蹈覆辙,同时也是给后面遇到同样问题的同学们分享下惨痛教训,要是遇到相同现象的时候能搜到我这篇文章,给你点灵感,尽快解决问题,不用像我那样摸索那么久,浪费了大量时间。
STM32F303的数据手册

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值