« 上一篇下一篇 »

问题记录及解决方案

一、对目标区域flash的读写引发的程序异常的问题

该问题出现的根本原因为:对MCU中某一块flash区域有读写操作,主要是写操作,但是却又未在定义时告诉编译器,这块区域仅分配给某一个专用数据块,于是导致其他的无关代码被也存储在这块区域中未被使用的位置,这样一来,在程序中进行flash写操作时(一般是以块或扇区为单位),就会导致存储在这一块区域的无关代码全部被误擦除,这样一来程序的执行就完全混乱了,因为少了一些代码,它的行为是不定的,这样的异常使用平常的测试方法是很难找到是什么原因的。

这个问题,我已经碰到过两次了,两次都在这上面浪费了不少时间,故此进行总结记录,避免下次再在这上面浪费时间。当然,最重要的是,在定义时,如果是有写操作的flash区域,假如对象是一个数组,必须要指明这个数组的大小,使这一块扇区只存储该数组,这样其他的代码就不会被编译器存储在这块扇区中了,也就不会有被误擦除的情况发生了。

另外,以后如果碰到有程序运行不正常,但反复看出错处代码又没有问题的,就要看下是否有其他地方的代码有无擦写flash的操作,代码被误擦除的现象,就是奇奇怪怪,感觉没啥规律可循。


二、数据通讯中的数据长度及校验的准确性的问题

该问题是今天碰到的,不算是很典型的问题,但主要是涉及到习惯和细节。例如,下位机和上位机通讯,它们之间遵循一种通讯协议,数据帧里面会指定数据的长度值、数据,以及校验和,而发生这种问题的场景主要还是代码移植或修改的时候,比如一开始我有4个端口,每个端口有2字节数据,那么数据长度就是2*4(数据)+1(数据长度值本身)+1(校验和)=10,而如果下一次程序个性为2个端口,我的数据就只给了两个端口的数据,但是长度值忘记修改了,这时候的长度值就是错误的,于是导致校验和也是错误的,所以这个数据帧如果发给上位机,那就是错的,上位机无法正确识别,从而导致通讯失败。这个主要就是细节处要注意,要对代码非常理解,在修改端口数时,相应的数据和数据长度值都要跟着变,才不会出错,当然,更好的方式就是在刚开始设计代码时,要考虑到兼容性,只留出一个修改的接口,而不是改好几个的地方,这样的话就不会改了这里那里又忘记改了。


三、灵敏度切换

这不属于问题,属于概念,懒得放到其他地方去了,一并记录下好了。灵敏度的切换,不属于DSP的控制范畴,这种切换必须要有硬件提供支持,即硬件提供两个以上不同灵敏度的接口,固件只对这个接口进行切换操作就行了。


暂时先记录这些吧,有空再写。