请教:擦除了一个函数,重启就不再工作了

2020-01-01 17:41发布

随便写了一个很简单的函数,将其编译在一个特定的页
1.此页只有它,无其它内容;
2.板子重启后,也不会被调用(特定条件才会被执行)

用烧写软件,将此页删除,程序立即死掉(可以理解)

断电重启,发现板子还是死掉的,这一点很难理解,大家有什么见解?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
40条回答
popo_new
1楼-- · 2020-01-06 00:10
落叶随风 发表于 2017-1-9 08:58
这是因为你sct文件中分区分错了

你的sct文件中这一段

谢谢楼上,果然OK了,
之前对sct中的语法一直都没看明白,现在明白多了
ronic
2楼-- · 2020-01-06 05:29
 精彩回答 2  元偷偷看……
weiwei4
3楼-- · 2020-01-06 10:15
学习,谢谢分享
wt3333
4楼-- · 2020-01-06 14:15
落叶随风 发表于 2017-1-7 20:44
楼主,我不知道你擦除的那个程序有多复杂,我自己做了个简单的测试,擦除后重启也没问题的,不知道是不是太 ...

谢谢解答,很详细
请教下:楼主的ram和rom的定位写到一起了,但对rom(flash)的操作是如何影响到ram的? 谢谢
落叶随风
5楼-- · 2020-01-06 17:17
popo_new 发表于 2017-1-10 03:55
谢谢楼上,果然OK了,
之前对sct中的语法一直都没看明白,现在明白多了

其实后来我又做了测试,发现自己有理解错误的地方。

用你的sct文件,也是不会进入HardFault的,最多是把变量的初始化数据清成0xffffffff了。

用的是STM32F103RE,MDK V5.15.

  1. LR_IROM1 0x08000000  0x00080000{    ; load region size_region
  2.   ER_IROM1 0x08000000  0x00080000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }
  7.   ER_IROM2 0x0803e000 FIXED
  8.   {
  9.    main.o(test)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00010000  {  ; RW data
  12.    .ANY (+RW +ZI)
  13.   }
  14. }
复制代码

倒是 FIXED 会有影响,不加的时候load address 和 execution address 是不同的,启动的时候会进行搬运,目标地址是FLASH就进HardFault了

为了不对RAM初始化数据产生影响,可以这样写

  1. LR_IROM1 0x08000000  0x00080000{    ; load region size_region
  2.   ER_IROM1 0x08000000  0x00080000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }
  7.   RW_IRAM1 0x20000000 0x00010000  {  ; RW data
  8.    .ANY (+RW +ZI)
  9.   }
  10.   ER_IROM2 0x0803e000 FIXED
  11.   {
  12.    main.o(test)
  13.   }
  14. }
复制代码

如果楼主有空的话,再做下测试,然后麻烦把结果告知我一下,因为我这边没法重现你那出现的异常,谢谢。

关于31楼我的回复中的 AlignExpr,我从帮助里摘录一下解释,更权威一点,我自己的理解还是有偏差的。

  1. 8.25 AlignExpr(expr, align) function
  2. Aligns an address expression to a specified boundary.

  3. This function returns:
  4. (expr + (align-1)) & ~(align-1))
  5. Where:
  6. expr is a valid address expression.
  7. align is the alignment, and must be a positive power of 2.
  8. It increases expr until it is:
  9. 0 mod align
复制代码
落叶随风
6楼-- · 2020-01-06 21:52
wt3333 发表于 2017-1-10 08:22
谢谢解答,很详细
请教下:楼主的ram和rom的定位写到一起了,但对rom(flash)的操作是如何影响到ram的?  ...

因为RAM的初始化数据还是存在ROM中的,当把ROM中相应的地址的数据擦除了,就影响到了RAM。

当然,只是影响初始化非零数据,在加载到RAM中后,ROM擦除也不会影响。

一周热门 更多>