踩得莫名其妙的一个坑!
//uint8_t flashDataBuff2[1024] = {1, 2, 3, 4};
uint8_t flashDataBuff2[1024] = {0,};
uint8_t * p_buffer = flashDataBuff2;
void readFlash(uint8_t *flashData, int dataNum, uint32_t add)
{
int i;
if(dataNum>1024){
return;
}
for(i = 0; i < dataNum; i++) {
*((uint16_t*)flashData) = 0x1234;
flashData += 2;
}
}
// 存储区包信息初始化-空片初始化
int doseFlashRest(uint32_t address)
{
doseDataFrame *temp;
memset((void*)p_buffer, 0x11, 1024);
readFlash(p_buffer, 10, address);
return 0;
}
问题点:
flashDataBuff2放在函数中,局部变量,在readFlash中解引用被赋值,无段错误
flashDataBuff2作为静态变量,不赋非零初值,依然无法解引用被赋值,段错误
flashDataBuff2作为静态变量,赋非零初值,则无此问题,看map是在.data段
奇怪的是memset2不也解引用赋值了吗??
测试发现,用uint8_t*指针来解引用是可运行的,uint16_t*等都不行,memset是单字节操作的所以无此问题
现象:*((uint16_t*)flashData) = 0x1234;总是失败直接跳转HardFault_Handler。
软件上多种尝试,最终结果就是,将这个全局静态数组放到.data段中,所有引用和解引用赋值操作都在预期!
废了不少时间一定要去探寻根源,生怕是语法问题!?最后,果真还是编译器的BUG!唉……
从version6改到6.12之后,程序正常……