Flash调试碰到的一些问题

最近做flash模块验证的时候碰到几个新的问题,这里记录一下。
问题列表:

  1. 非对齐访问出错
  2. 堆栈溢出问题
  3. Flash缓存问题

地址非对齐访问出错。

这个问题在CM0核上比较容易出现,因为它本身不支持地址不对齐的访问,首先我们来看看代码。


// strings usually not aligned in data section
uint8_t *p = "This is string used in program, byte align."
// convert string pointer to 32-bit word pointer will cause error
uint32_t *align_p = (uint32_t *)p;
// when accessing data not aligned, hardfault happens
printf("Align access %d\r\n", *align_p);

上面就是出问题的代码, 可以看到一般不对齐的字节数组如果按照32位的访问方式访问,就会出现错误,这个对于编译器来说一般是不会报错的,所以使用的时候需要谨慎一些

堆栈溢出

堆栈溢出应该算是比较常见的问题了,这里之所以单独拎出来说一下是以为以前一直认为编译链接的时候可以自动计算出堆栈的大小,但是实际上是我太天真,编译器压根不会帮你算,所谓的SIZEOF(.dummy_stack)好像只是哄哄小孩的,反正我不管怎么编译,算下来都是0,手动滑稽。

有个比较大一点的代码,编译能过,跑一会就废了,调了好久发现堆栈把数据段给冲了,无奈只好手动设置堆栈大小,一点一点缩小数据段,算了,都是泪。。。

Flash缓存

Flash缓存是个好东西,程序运行的时候要是没有他,效率要低不少,但是一般好东西都有副作用,Flash缓存在测试Flash模块的时候就是必须要禁掉的一个东西,比如你刚刚把flash里面program了一些新的数据,你读回来的时候实际还是之前的数据,因为数据还是从缓存里面出来的,这个时候volatile也不好用,因为缓存一般是透明的,volatile只是说编译器不敢把必要的步骤省略,这玩意不能限制不从缓存里面出数据,除非你编程完之后在跑一大堆新的代码,把缓存更新了,之后再去读就没有问题了。

这里说一下,像是复位等操作也是没有用的,Flash缓存照样在,甚至我们奇葩的板子上你断电都木有用,这个可能和串口上面还是有电压有关系。

好了就酱,学新知识去了。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

发表新评论