加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

那些疑难杂症

发布时间:2020-12-15 18:46:11 所属栏目:百科 来源:网络整理
导读:?? ? 在平时编程时经常遇到各种疑难杂症,有的只是小bug,调试调试就过去了。有的却是因为自己对CPU或硬件的工作方式理解有错误,这就麻烦了,因为你永远也无法从你百分百相信的代码里找出错误。除非是长期苦恼纠结后的灵机一动,或者看过别人代码或相关书籍

?? ? 在平时编程时经常遇到各种疑难杂症,有的只是小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说,我照样缓存。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读