那些疑难杂症

本文记录了一次NorFlash擦除过程中遇到的难题及解决过程。作者在尝试擦除NorFlash并验证擦除结果时遇到了无法正确检测擦除状态的问题。通过一系列调试和思考,最终发现是由于CPU Cache导致的数据不一致现象。文章详细介绍了如何通过清除Cache来解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     在平时编程时经常遇到各种疑难杂症,有的只是小bug,调试调试就过去了。有的却是因为自己对CPU或硬件的工作方式理解有错误,这就麻烦了,因为你永远也无法从你百分百相信的代码里找出错误。除非是长期苦恼纠结后的灵机一动,或者看过别人代码或相关书籍后的恍然大悟。我想在这篇文章中加以记录,聊作警戒或谈笑之用。

    1. nor flash擦除

    我是首次需要自己擦除nor flash。根据flash的datasheet发送擦除命令,并进行擦除完的检测。问题就发生在检测上,时灵时不灵。擦除完检测,标准做法是读擦除地址中的数据,它在D6位会进行翻转,在D7位会置0,等擦除完成后,D6和D7位都会变成1。这是很简单的操作,我也翻过几本相关的书籍,上面的代码也基本是遵循这种思路。但在我实现时,有些时候是这样没错,但有时就不是了,D7位永远为0,D6位不会翻转,这可 怎么检测?难不倒我,我的土办法是延时,把命令发送完以后,延时个一两分钟,然后对整个flash空间检测是否所有位全置1,是则表示擦除完了,否则再延时,再检测。这样做其实并没有解决之前的问题,心里安慰多过实际效果。在我调试完数据下载到flash上的代码后,我进行整体测试,先擦除后编程,发现这里还是有问题。我很奇怪的是,无论我延时多久,测出来的值都是不变的,且为擦除前的值。一旦我重新启动程序,再检测就发现已经擦除好了,也就是说命令对了,但检测不出来。这时的我还未发觉。但稍后看到系统其它部分的代码,发现是对CPU cache操作的,它是设置系统异常表,设置完之后清一下cache,已保证内容被刷到内存中。我这才恍然大悟,原来问题在cache中,flash自己虽然改变了内容,但因为我在擦除前会先检测一遍flash空间,看是否需要擦除,这实际上就把flash中的内容缓存了,之后擦除完成检测,只要flash中有被缓存的非全1数据,我的检测就通不过。真正的解决方法很简单,就是在检查flash空间之前,先清一下缓存。

    *volatile是给编译器看的,CPU说,我照样缓存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值