TM4C1231E6PM的flash存储器保护策略设定成只允许执行(FMPPE和FMPRE位均为0),程序不能正常运行,调试发现在调用函数使用了指针变量、常量传递参数时就出错,程序跑到了错误函数处
FaultISR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}
请问这是什么原因呢?有何解决方法?
Maka Luo:
详细参见数据手册上说明:
对 Flash 存储器的读取保护块(FMPREn 位被置位)进行读取访问是被禁止的,否则会产生一次总线故障。对 Flash 存储器的编程保护块(FMPPEn 位被置位)进行编程或擦除访问是被禁止的。可以选择产生一个中断(将 Flash 控制器中断屏蔽 (FCIM) 寄存器中的 AMASK 位置位)提醒软件开发者在开发和调试阶段可能出现的错误软件操作。注:如果 FMPREn 位已清零,指向 Flash 存储器模块的所有读访问都被禁止,包括任何数据访问。必须注意的是,不得将所要求的数据存储在相关FMPREn 位已清零的 Flash 存储器模块中。对所有执行存储块来说,FMPREn 和 FMPPEn 寄存器在出厂时都被设置为 1。这些设置实现了一种开放式的访问策略和可编程策略。寄存器的位可通过清零特定寄存器的位来改变。这种改变立即生效,但不是永久的,等到寄存器被提交(保存)以后,位的改变就是永久性的。如果一个位从 1变为 0 且没有提交,那么它可以通过执行一段上电复位序列来恢复。这些更改需要用 Flash 存储器控制 (FMC) 寄存器来提交。有关这些位的编程详情请参考 “非易失性寄存器编程” 在 508页。
jack liu:
回复 Maka Luo:
你说的这些内容我都看过了,这种保护措施是禁止读写,但是可执行程序。我的程序没有去读取存储在flash中的数据,只是程序使用了指针,调用函数的参数使用了字符串常量,这样应该属于程序执行的范畴,为何会被禁止呢?如果是这样的话,那这种保护措施一般都使用不了,因为c语言程序经常用字符串常量。