打印
[STM32F1]

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

[复制链接]
2617|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 | 只看该作者
遇到过一次,好像是有些函数地址有问题,期待楼主找到答案

使用特权

评论回复
5
那就地方iv| | 2015-11-5 08:42 | 只看该作者
有这么神奇的事情,期待楼主解密

使用特权

评论回复
6
pkuzhx| | 2015-11-5 08:50 | 只看该作者
神奇。留爪。我也在用f4,希望不要碰到这样的问题。

使用特权

评论回复
7
冰零分子| | 2015-11-5 09:06 | 只看该作者
shauew 发表于 2015-11-4 22:16
貌似和顺序没多大问题吧?

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

c文件的摆放顺序不会影响到头文件吧
还没遇到过这问题:D

使用特权

评论回复
8
xlsbz|  楼主 | 2015-11-5 10:02 | 只看该作者
已经锁定出问题的位置,但是不知道原因。。。。

正在找原因。

使用特权

评论回复
9
autolog| | 2015-11-5 10:40 | 只看该作者
期待结果

使用特权

评论回复
10
cedar_renjun| | 2015-11-5 11:30 | 只看该作者
可能会出现这个现象,建议楼主检查是否有未初始化的全局变量

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

养成一个习惯:把所有的变量都初始化,就能避免这个问题

使用特权

评论回复
11
cedar_renjun| | 2015-11-5 11:30 | 只看该作者
xlsbz 发表于 2015-11-5 10:02
已经锁定出问题的位置,但是不知道原因。。。。

正在找原因。

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

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

养成一个习惯:把所有的变量都初始化,就能避免这个问题

使用特权

评论回复
12
xlsbz|  楼主 | 2015-11-5 12:25 | 只看该作者
cedar_renjun 发表于 2015-11-5 11:30
可能会出现这个现象,建议楼主检查是否有未初始化的全局变量

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

MDK在  .S代码里面已经初始化了。全是0.

使用特权

评论回复
13
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。

所以找到原因了。





使用特权

评论回复
14
xlsbz|  楼主 | 2015-11-5 12:46 | 只看该作者
字节对齐是个很常见的问题。由于我以前很少弄RAM里面运行函数,所以没太在意。
现在想想以前好像有读过相关的**。。。。。。。。。。

使用特权

评论回复
15
xlsbz|  楼主 | 2015-11-5 12:47 | 只看该作者
hwl1023 发表于 2015-11-5 07:55
遇到过一次,好像是有些函数地址有问题,期待楼主找到答案

你这个贴子给我印象很深啊   让你说中了。

使用特权

评论回复
16
xlsbz|  楼主 | 2015-11-5 13:08 | 只看该作者
解决方案为  __align(4) 定义那个变量的时候

使用特权

评论回复
17
hwl1023| | 2015-11-5 13:46 | 只看该作者
xlsbz 发表于 2015-11-5 12:47
你这个贴子给我印象很深啊   让你说中了。

恭喜找到问题!!

使用特权

评论回复
18
shauew| | 2015-11-5 15:35 | 只看该作者
冰零分子 发表于 2015-11-5 09:06
c文件的摆放顺序不会影响到头文件吧
还没遇到过这问题

使用特权

评论回复
19
tianhaolan| | 2015-11-5 15:42 | 只看该作者
恭喜恭喜 很深奥的样子  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝