你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

可以将某个函数从flash删除,而不死机吗?

[复制链接]
a707083746 提问时间:2020-6-1 19:48 /
芯片:STM32F103C8
我把一个函数定位到单独的一页上,读flash判断函数还存在时才调用这个函数。
在特定的条件下,把这一页擦除,重启后进入 HardFault_Handler() 中断。
有没有可能删除这个函数了,程序还能运行呢?
收藏 评论19 发布时间:2020-6-1 19:48

举报

19个回答
a707083746 回答时间:2020-6-12 09:04:29
终于实现了。
原来光这样指定函数位置还不行:

#pragma arm section code=".ARM.__at_0x0800F000"
//函数
#pragma arm section        code

因为,在函数后面还有一些全局变量的初始值。


为了将两者分开,采用分散加载的方式:

LR_IROM1 0x08000000 0x00010000  
{    ; load region size_region
  ER_IROM1 0x08000000 0x0000F800  
  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00004FF0  
  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_TEST 0x0800F800 0x00000400  
{    ; load region size_region
  ER_TEST_ROM 0x0800F800 0x00000400  
  {
   OnlyTest.o (+RO)
  }  
  ER_TEST_RAM 0x20004FF0 0x00000010  
  {
   OnlyTest.o (+RW +ZI)
  }
}

目前正常运行,不知道有没有其他问题,仅供参考
a707083746 回答时间:2020-6-3 16:18:05
安 发表于 2020-6-3 15:23
理论上是可以的,通过判断指定地址的内容是否不为空。或者不为全FF。但是在工程中需要将这部分代码写入到指 ...

我已经把这部分代码指定到flash尾部单独的一页了,并且没占满一页,一页1024字节。

#pragma arm section code=".ARM.__at_0x0800F000"
//函数
#pragma arm section        code
a707083746 回答时间:2020-6-15 19:39:33
cap 发表于 2020-6-15 09:31
Flash的擦除就是往扇区写0xFF,实际写flash的时候是写0的,所以可以看.map文件看看这个函数占用多少空间,然 ...

感觉你理解错了
写FF就是FF,不是0,所谓的擦除是把0变成1。
另外,擦除最少是按页擦除。如果要写入的位置(按字对齐,或者是半字,忘了),不全为0就必须擦除。
所以擦除是免不了的,但不是整片扇区擦除。
a707083746 回答时间:2020-6-1 20:17:50
只修改一个字节没死机~~
wenyangzeng 回答时间:2020-6-1 20:58:43
代码的校验和就会出错而死机。
七哥 回答时间:2020-6-2 12:12:07
建议看一下汇编代码,STM32指令是32位的,有可能一个或几个32位数地构成一条指令。
你改一个字节,有可能不是关键的数据。有可能程序没有执行到这条指令,或者执行到这条指令了,但是只是个参数,而不是命令,而没有影响程序运行。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

MrJiu 回答时间:2020-6-2 13:04:54
删除Flash,我经常这么干啊,因为要保持一些数据到flash上去,没出现什么死机现行。。。我感觉是函数保存问题,而且,还涉及到变量问题。。。总之,没你想得那么简单

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

a707083746 回答时间:2020-6-3 13:46:52
wenyangzeng 发表于 2020-6-1 20:58
代码的校验和就会出错而死机。

那交换两个字节的位置可能就不死机了
a707083746 回答时间:2020-6-3 13:49:00
toofree 发表于 2020-6-2 12:12
建议看一下汇编代码,STM32指令是32位的,有可能一个或几个32位数地构成一条指令。
你改一个字节,有可能不 ...

我把代码删除以后,就没有去调用,它应该不会执行吧
a707083746 回答时间:2020-6-3 13:51:20
MrJiu 发表于 2020-6-2 13:04
删除Flash,我经常这么干啊,因为要保持一些数据到flash上去,没出现什么死机现行。。。我感觉是函数保存问 ...

我这个确实是想当然了。我是想在第一次上电时执行这个函数,然后把它从flash删除掉,之后不去调用它。
废鱼 回答时间:2020-6-3 15:23:28
理论上是可以的,通过判断指定地址的内容是否不为空。或者不为全FF。但是在工程中需要将这部分代码写入到指定的FLASH地址。需要考虑使用芯片的空间分布情况。有的芯片分区少,一个区的地址是128或者256。这样使用会不会感觉到浪费?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

yklstudent 回答时间:2020-6-3 17:11:22
想法很美好
a707083746 回答时间:2020-6-3 18:12:38

东搞西搞
butterflyspring 回答时间:2020-6-9 16:00:56
已经把这段代码单独安排到尾部一页,一上电就删除这一页,那当初为啥还把这段代码敲进去啊?
而且每次上电都擦除一次,FLAH可是有擦写寿命的哦。 理论上指令和数据总线不再访问这块是不影响运行的

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

tanic 回答时间:2020-6-9 17:30:57
可行
a707083746 回答时间:2020-6-9 19:40:39
butterflyspring 发表于 2020-6-9 16:00
已经把这段代码单独安排到尾部一页,一上电就删除这一页,那当初为啥还把这段代码敲进去啊?
而且每次 ...

这段代码的主要是计算出flash其他部分的校验并保存起来,算完之后使命就完成了,所以要删掉。
据说可以用于加密。
并不需要每次上电都擦除。
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版