Microchip
直播中

刘嵩

7年用户 126经验值
私信 关注
[问答]

带有自定义节的链接器脚本添加失败是怎么回事?

大家好,我使用的是p32 MZ1024ECG100MPLAB X3.35xC32 1.42ICD3I,试图在Flash存储器中创建自定义部分,但由于某种原因,我失败了。我已经为这个MCU复制了XC32文件夹的默认链接器脚本,将它添加到项目中,并对它做了一些小的改动:创建了一个“KSG00A PrimaTym MEM”内存区域:…创建了我的PrimeType部分:…在我的C代码中,我给项目添加了一个变量:项目编译成功。我可以在.map文件中看到,我的变量确实映射到KSeG00B PrimaTym MEM区域。由于某些原因,在开始断点后立即停止固件崩溃/停止,尽管没有指定断点。ICD3屏幕转储:如果从C代码中删除变量,则所有的都运行Fink。我最终想达到的目的是在闪存中创建一个区段,我可以用一个程序校验和重写,使用HexMID注入,这样我就可以在启动时验证代码。如果有人能引导我找到正确的解决方案,这将是非常合适的。RDS

回帖(6)

李铭鑫

2019-10-29 13:15:56
嗨,虽然其他人,希望能够指导您在链接器脚本中定义._mem区域的原始方法,……我认为在不需要修改链接器脚本的情况下实现您想要的是可能的。通过使用编译器的属性,可以定义v。在不改变链接器脚本的情况下,在闪存中使用ARILE或数组。如果将Flash数据初始化为所有1位:0xFF…有可能不用先擦除整页就可以写入闪存位置。因为PIC32MZ有ECC用于闪存,所以我认为最小的闪存更新可能是128位。16字节或4个整数字,每个闪存更新必须在16字节的边界上对齐。如果必须擦除闪存数据,我认为每个闪存擦除页在MZ上是16kByte。
举报

毕凯

2019-10-29 13:30:57
在MPLAB X中进入项目属性并导航到链接器选项(“XC32 LD”)。在“诊断”类别下,链接器生成一个MAP文件并选择“显示内存使用”选项。使用这些来查看链接器是否正在将您不想要的任何内容放入您的私有部分。伊维特段。这可能不是你想要的。参见http://ft.gun.org/Pub/旧GNU/手册/LD-2.91/HTMLYNOND/LDY16.HTML*SEC16。
举报

黄飞高

2019-10-29 13:47:45
不过要小心。编译器可以优化闪存读取,并直接使用初始化的值,这样即使您在实际的闪存中更改它们,它们也不会改变。
举报

李铭鑫

2019-10-29 14:11:08
嗨,maxruben可能是对的,优化器可能误解并优化掉必需的代码。我在包含访问数组的多个函数的代码中只对大数组使用这些声明,并且在该上下文中没有检测到问题。不应该需要声明中的onst指定符,并且可以尝试省略它。甚至可以使用易失性指定符,易失性指定符是对编译器的警告,该声明可以通过编译器不知道的方式更改,从而优化r不应该对值进行假设。现在尝试了使用以下声明的测试程序,并且正确读取了之前存储在Flash程序内存中的数据:在这个程序中,闪存数组没有在声明中初始化。效果是编译器将我将程序十六进制文件清除为零,除非程序员读取存储在闪存中的先前数据并替换编译器生成的数据。如果没有以前的数据,或者MPLAB中没有指定“保存程序内存”,则闪存页在写入之前必须由固件擦除。Mysil,Tin数据
举报

更多回帖

发帖
×
20
完善资料,
赚取积分