芯片:STM32F103C8 我把一个函数定位到单独的一页上,读flash判断函数还存在时才调用这个函数。 在特定的条件下,把这一页擦除,重启后进入 HardFault_Handler() 中断。 有没有可能删除这个函数了,程序还能运行呢?
原来光这样指定函数位置还不行:
#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)
}
}
目前正常运行,不知道有没有其他问题,仅供参考
我已经把这部分代码指定到flash尾部单独的一页了,并且没占满一页,一页1024字节。
#pragma arm section code=".ARM.__at_0x0800F000"
//函数
#pragma arm section code
感觉你理解错了
写FF就是FF,不是0,所谓的擦除是把0变成1。
另外,擦除最少是按页擦除。如果要写入的位置(按字对齐,或者是半字,忘了),不全为0就必须擦除。
所以擦除是免不了的,但不是整片扇区擦除。
你改一个字节,有可能不是关键的数据。有可能程序没有执行到这条指令,或者执行到这条指令了,但是只是个参数,而不是命令,而没有影响程序运行。
评分
查看全部评分
评分
查看全部评分
那交换两个字节的位置可能就不死机了
我把代码删除以后,就没有去调用,它应该不会执行吧
我这个确实是想当然了。我是想在第一次上电时执行这个函数,然后把它从flash删除掉,之后不去调用它。
评分
查看全部评分
东搞西搞
而且每次上电都擦除一次,FLAH可是有擦写寿命的哦。 理论上指令和数据总线不再访问这块是不影响运行的
评分
查看全部评分
这段代码的主要是计算出flash其他部分的校验并保存起来,算完之后使命就完成了,所以要删掉。
据说可以用于加密。
并不需要每次上电都擦除。