使用 EOC 信号作为中断具有一定优势,因为 CPU 不会被轮询标记占用,因此在获得数据前不会打断 CPU 的正常工作。不过,如果转换器等待处理特定的协议来读取数据,比如转换器发出转换结束信号后又需要读取命令来检索数据,每个读取命令都会触发新的中断,那么就会造成过多的开销,得不偿失。在这种情况下,轮询的方法就具有明显的优势了。
现在,数据已经进入系统,数据字存储在阵列中,数据大小也合适,于是开始处理数据,但没有获得预期的结果,这时需要思考到底出了什么问题。首先应该检查 DSP 的高速缓存,DMA 传输数据进入存储器时是否启用高速缓存,在这种情况下,高速缓存很可能保留拷贝的旧数据,并在算法工作中使用它们。如果发生了此类问题,就必需注意高速缓存相关性与转储清除问题,或者是存储新数据的高速缓存区失效。这样就能确保 CPU 处理的数据是传输完成后的最新数据。
如果用 C 语言编程应分配易失关键字
在调试嵌入式系统时,采用变量查询外设的状态后,发现 CPU 所用变量
值是错误的,这时就要思考到底哪里出了问题。先看看下面这个结构:
unsigned int *pControl = (unsigned int *)0x00COFFEE; file&58//错误
while (*pControl == 0); file&58//等待一个外部事件
这里的 *pControl 指向一个外设。通过 while 循环,期望 EOC 能从“0”转换为“1”。但在大多数情况下,恐怕得一直等下去,因为编译器认为它已经完全控制了变量及与其相关的存储器,只加载 *pControl 指向的存储器位置的内容一次,就会对其进行循环测试。但问题在于,由于不会重新读取存储器内容,也就不能结束循环。