【Open】2015.08.03-连接脚本配置错误导致“不精确的数据访问违例”

本文档详细介绍了在MUTEX测试用例中遇到的“不精确的数据访问违例”问题,原因是变量g_lpWakeupTaskName被错误地放入了片上FLASH的.data段。分析指出,这可能是由于STM32官方固件库中某些不需要写操作的变量被错误放置导致,为节省RAM空间,.data段被配置到了FLASH。解决方法包括修改stm32-soft.sct脚本,确保.__I变量正确放入.constdata段。
【问题现象】

MUTEX测试用例中发生“不精确的数据访问违例”

testmutex.c 文件内定义在 .UserRWdata 段的变量 g_lpWakeupTaskName 连接后地址为 0x0800bd88。

【问题原因】

0x0800bd88 为片上FLASH地址,查看stm32-soft.map文件发现 g_lpWakeupTaskName 连接后被放入data group,由于STM32官方固件库中的数组/变量(不涉及改变):AHBPrescTable/SystemCoreClock/APBAHBPrescTable/ADCPrescTable等不需要执行写操作的变量被放入.data,可能和连接为lib文件有关,为节省 RAM空间,在stm32-soft.sct配置脚本中.data 被放入片上FLASH。

【解决办法】

将testmutex.c加入到stm32-soft.sct脚本中

  USER_RAM 0x20000000 0x00000200  {  ; RW data
   testtask.o (.UserRWdata, +RW +ZI)
   testmutex.o (.UserRWdata, +RW +ZI)
   caobject.o (.UserRWdata, +RW +ZI)
  }
【遗留问题】

解决 stm32官方固件库声明的 __I 变量被放入.data而不是.constdata的问题

stm32官方固件库对__I的声明:

<pre name="code" class="plain">#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
#endif





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值