在ARM的设计过程中,通常我们要完成一个(或者一些列)功能的时候有最常用的三种方式:轮询,中断以及轮询+中断。 以最简单的无操作系统的设计为例子, 主函数模型如下: main() { 。。。。。//系统配置 。。。。。//初始化端口,寄存器,中断等等。
while(1) {
..............//功能实现
} }
通常如果以中断触发功能的话,比如说定时器,计数器,串口等等,一般都会在中断处理函数里面避免使用 打印函数,因为打印函数是一个慢速的功能函数(通常指串口打印,9600K和115200K的传输速度和系统 几十兆上百兆的速度相比),因此很多设计者都会尽量避免使用打印函数。 在调试过程中为了调试的需要,我们常常需要观察一些数据,特别是中断里面的数据,因此需要考虑到 上述问题,比如在轮询里面,如果打印信息很快,串口就有可能出现打印不全的现象,还有些数据不需要打印 ,如果全部打印,势必会造成主函数的执行效率降低,因此注意一下技巧。
1. 如果打印放在主函数里面,为了得到完整大打印信息,必要考虑使用延时函数,确保程序的运行。 2. 如果不是有每次都打印信息,而打印函数又放在主函数里面,比如,打印串口收到的数据,可以设置 一个全局变量,串口接收到数据的时候,全局变量值“1”打印完成后全局变量清零,这样使用时有 两点需要注意,打印函数必须要先判断全局变量的真假,其次打印函数要放在功能函数之后。这样减 少了打印的次数,增加了函数的执行效率。 3. 如果有外部或者内部中断使能,打印的时候必须充分考虑中断对打印函数的影响。比如,主函数里面 执行打印的时候有可能发生中断,因此会中断打印的操作(打印函数不是中断处理),这时候打印数 据有可能被中断修改,因此造成打印信息不准确。这时简单的处理就是在打印的时候先关闭中断,打印 完成后打开中断,但是这样会降低系统的执行效率。当然这不是最好的执行方式,如果全面考虑的话, 可以在内存里面建立缓冲区,存储临时数据,或者使用DMA,因此在执行打印函数的时候要根据自己关 注的数据进行合理的操作。
|