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

可以将某个函数从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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版