实际编程中,遇到一个问题:
stellaris芯片提供了FLASH保护的一个级别--只执行保护,但是如果某一个放置程序的扇区被设置了只执行保护,那么放置在该扇区的程序是不可能跑得起来的,因为很多变量也是放在这个扇区的,程序运行的时候会用到这些变量,那如果这些变量无法被读出,程序当然就跑不起来了。
那问题就来了,这个只执行保护到底有什么意义呢?我的理解是让某个扇区只能运行而不能被读取,难道只执行保护不是这个意思吗?还是用法不对?
实际编程中,遇到一个问题:
stellaris芯片提供了FLASH保护的一个级别--只执行保护,但是如果某一个放置程序的扇区被设置了只执行保护,那么放置在该扇区的程序是不可能跑得起来的,因为很多变量也是放在这个扇区的,程序运行的时候会用到这些变量,那如果这些变量无法被读出,程序当然就跑不起来了。
那问题就来了,这个只执行保护到底有什么意义呢?我的理解是让某个扇区只能运行而不能被读取,难道只执行保护不是这个意思吗?还是用法不对?
1.
下面是文档原文对只执行保护的解释:
Execute-only protection. The block may only be executed and may not be written or erased.
This mode is used to protect code.
意思是是说,只执行模式下,不允许写入或擦除,用来保护代码,数据是可以读取的。这样是只执行保护。
2.
当然也有另一种模式,这种才是楼主说的只执行、写入、擦除,但不能读取的模式。这种模式确实没有什么用,只是寄存器可以配置成这种状态:
The block may be written, erased or executed, but not read. This combination is unlikely to be used.
Dear Richard:
不知道你是否做过相关实验,我写了以下代码:
void main()
{
long i;
fnTargetInit(); //system init
FlashProtectSet(2048, FlashExecuteOnly);
for(;;)
{
i+=1;
}
}
进行仿真时,执行到FlashProtectSet之后芯片就进入FaultISR了,这个问题我还是不得其解。
hi leo,
我测试了一下你的代码,程序没有问题,没有进入FaultISR, 建议你在测试这个程序时,先使用JTAG对MCU进行解锁,这样做的目的是使MCU的FLASH恢复到出厂设置,即MCU的所有FLASH处于可编程,可写,可读状态。关于只执行保护,个人理解是有用的一项保护措施,表示该区域的程序只能被执行,不能被读取写入。
打个比方,我们做一个字库将它放在该区域,然后通过查表法读取字库点阵,最终用来显示。如果存放字库区设置成了只执行保护,那么我们的程序将无法正确执行,一旦查表时将会产生Fault.

楼主查查自己器件上FMPRE和FMPPE两个寄存器的值,看看配置是否正确~
另外,给楼主附了一个附件,楼主查查看进Fault前在哪里执行代码的,也许看到那个地址就会有些想法了。
非常非常感谢richard的分享,一直想找这个东西。
我查看了FMPRE和FMPPE两个寄存器的值,无论死之前还是死之后,都是正确的。
继续写代码:
void main()
{
long i;
fnTargetInit();
HWREG(FLASH_FMPPE) = 0xfffffffd;
HWREG(FLASH_FMPRE) = 0xfffffffd;
HWREG(0x2202000c) = 1; \\\ A
for(;;)
{
i +=1;
}
}
(IAR环境)程序在A处死掉了,我纳闷:我操作的是SRAM啊,我保护的是flash啊,怎么就死掉了呢?
然后这样(调换了写FLASH_FMPRE和FLASH_FMPPE的位置):
void main()
{
long i;
fnTargetInit();
HWREG(FLASH_FMPRE) = 0xfffffffd;
HWREG(FLASH_FMPPE) = 0xfffffffd; \\\ B
HWREG(0x2202000c) = 1;
for(;;)
{
i +=1;
}
}
程序在B处死掉,完全无解。。。。。