[STM32F1] stm32f103 mdk 文件编译顺序不同竟然运行得到不同的结果??

[复制链接]
3047|18
 楼主| xlsbz 发表于 2015-11-4 17:26 来自手机 | 显示全部楼层 |阅读模式
mdk左侧加载c文件排放顺序改变后,竟然程序就不好用。

这个很奇怪。

明天我可能会现场直播~~~~
看我如何找到答案!!!~~
mmuuss586 发表于 2015-11-4 21:45 | 显示全部楼层
自己跟踪下程序看看;
shauew 发表于 2015-11-4 22:16 | 显示全部楼层
貌似和顺序没多大问题吧?

最多是头文件顺序有点问题罢了!
hwl1023 发表于 2015-11-5 07:55 来自手机 | 显示全部楼层
遇到过一次,好像是有些函数地址有问题,期待楼主找到答案
那就地方iv 发表于 2015-11-5 08:42 | 显示全部楼层
有这么神奇的事情,期待楼主解密
pkuzhx 发表于 2015-11-5 08:50 | 显示全部楼层
神奇。留爪。我也在用f4,希望不要碰到这样的问题。
冰零分子 发表于 2015-11-5 09:06 | 显示全部楼层
shauew 发表于 2015-11-4 22:16
貌似和顺序没多大问题吧?

最多是头文件顺序有点问题罢了!

c文件的摆放顺序不会影响到头文件吧
还没遇到过这问题:D
 楼主| xlsbz 发表于 2015-11-5 10:02 | 显示全部楼层
已经锁定出问题的位置,但是不知道原因。。。。

正在找原因。
autolog 发表于 2015-11-5 10:40 | 显示全部楼层
期待结果
cedar_renjun 发表于 2015-11-5 11:30 | 显示全部楼层
可能会出现这个现象,建议楼主检查是否有未初始化的全局变量

因为全局变量的问题,没有初始化的变量属于弱符号,多种弱符号会受链接次序的影响

养成一个习惯:把所有的变量都初始化,就能避免这个问题
cedar_renjun 发表于 2015-11-5 11:30 | 显示全部楼层
xlsbz 发表于 2015-11-5 10:02
已经锁定出问题的位置,但是不知道原因。。。。

正在找原因。

可能会出现这个现象,建议楼主检查是否有未初始化的全局变量

因为全局变量的问题,没有初始化的变量属于弱符号,多种弱符号会受链接次序的影响

养成一个习惯:把所有的变量都初始化,就能避免这个问题
 楼主| xlsbz 发表于 2015-11-5 12:25 | 显示全部楼层
cedar_renjun 发表于 2015-11-5 11:30
可能会出现这个现象,建议楼主检查是否有未初始化的全局变量

因为全局变量的问题,没有初始化的变量属于 ...

MDK在  .S代码里面已经初始化了。全是0.
 楼主| xlsbz 发表于 2015-11-5 12:43 | 显示全部楼层
问题很可能已经找到了。。。。

具体过程为:
首先追溯历史版本,发现27号下午的版本颠倒顺序好用,而28号上午的版本颠倒顺序不好用。
颠倒各个C文件的位置,发现有一个文件必须在另一个文件的后面,否则运行就有问题。
那么运行发生了什么问题呢?
估计有可能是看门狗复位了吧?于是禁止看门狗,发现执行了一个函数后进入了HardFault_Handler。那么为什么进入HardFault_Handler?
我猜想可能是运行了这个函数的非法指令。就是函数内容可能被改变了。因为我这个函数发放在RAM里面。

执行流程如下:
(1)通过通信接收到字节放到RAM(就是一个全局变量数组)里;
(2)执行RAM里的函数
(3)擦除这部分RAM
于是我想是不是由于第2步没执行完进行了第三步导致的。就是说属于异步造成的。于是我把第三部删掉。发现还是程序进入HardFault_Handler。

既然进入HardFault_Handler,那么可能是RAM的内容在运行过程中改变,于是我把RAM的内容进行核对了一小部分(几百字节,挨个核对太费劲),没发现问题。
尽管这步骤没发现问题,我在对RAM对应的汇编的指令 注意到一个DCW的指令是关于内存对齐的。

啊!!没有有可能是字节没对齐。一看list文件,发现RAM起始地址是0x20000069,不能被4整除。于是在定义RAM的全局变量数组前面加上

uint8_t aa = 0;
uint8_t aa1 = 0;
uint8_t aa2 = 0;

这样 这个函数对应的RAM可以被4整除,一运行OK。

所以找到原因了。





 楼主| xlsbz 发表于 2015-11-5 12:46 | 显示全部楼层
字节对齐是个很常见的问题。由于我以前很少弄RAM里面运行函数,所以没太在意。
现在想想以前好像有读过相关的**。。。。。。。。。。
 楼主| xlsbz 发表于 2015-11-5 12:47 | 显示全部楼层
hwl1023 发表于 2015-11-5 07:55
遇到过一次,好像是有些函数地址有问题,期待楼主找到答案

你这个贴子给我印象很深啊   让你说中了。
 楼主| xlsbz 发表于 2015-11-5 13:08 | 显示全部楼层
解决方案为  __align(4) 定义那个变量的时候
hwl1023 发表于 2015-11-5 13:46 | 显示全部楼层
xlsbz 发表于 2015-11-5 12:47
你这个贴子给我印象很深啊   让你说中了。

恭喜找到问题!!
shauew 发表于 2015-11-5 15:35 | 显示全部楼层
冰零分子 发表于 2015-11-5 09:06
c文件的摆放顺序不会影响到头文件吧
还没遇到过这问题

tianhaolan 发表于 2015-11-5 15:42 | 显示全部楼层
恭喜恭喜 很深奥的样子  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部