【问题现象】
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