[请教]keil中如何更合理处理多中断,不容易出现异常?

panyi1012   2009-4-11 09:32 楼主
譬如说:

我用个循环队列存储和发送消息,队列使用固定长度的数组,其中数组的长度肯定长于每条消息,队列中有8个数组(均存在XRAM中);

一个串口中断(每个字节触发一次) 另一个中断(固定T触发一次) 串口中断优先级高 波特率400Kbps;

串口是接收消息,入队列;定时中断发送消息,出队列;其中出队列按照一定的规则,存在出队列速度远远低于入队,如果队列满,则关闭串口;

我在高消息密度下入队时,丢消息是正常的,故宁可丢消息,也要保证工作稳定,但是发现我的队列以外的XRAM会被意外写成了数据,即被意外覆盖;

请教大家,在keil中应该如果避免此类的错误?
程序的架构上有没有改进的地方?

回复评论 (10)

循环队列管理有问题。
点赞  2009-4-11 10:11
ls

rear和front都是增减进行取余 可以在每个存储器上增加一个是否正使用的标志;

但是使用队列中数目依然可以达到这个要求 而且其中的使用都是在关中断执行;

谢谢!
点赞  2009-4-11 11:24
最好保证: rear 和 front 之间最少都会相差一个。判断时采用

[code]

来比较

点赞  2009-4-11 11:34
C51用波特率400Kbps是不是太高了,115200(115K)对51已经够呛了!
点赞  2009-4-11 14:55
ls 我使用的MCU的主频比较高呵呵……

关于3楼的建议谢谢哈 有没有更好的队列控制模式呢?因为每次队列操作都要进行判断 效率是不是有些不好……而且队列中的区

域被意外擦写我能理解,但是队列以外的区域也被擦写了这是为什么呢?
点赞  2009-4-12 15:32
“队列以外的XRAM会被意外写成了数据”,不是消息队列的架构导致的,应该是程序出错了,比如数组越界,指针错误,程序跑飞等等。
如果方便,可以将程序贴出,或者mail。
点赞  2009-4-12 18:18
谢谢shuiyan 呵呵每次都这么热心

嗯程序粘贴不是很方便 我先按照你说的几个问题去查查 到时再分享;谢谢大家!
点赞  2009-4-13 08:37
我承认是队列的问题,我目前的程序框架如下:

使用标志数组(就是和存储器一一对应的标志) “1”则表示存储器占用,“0”表示存储器被占;仍然延续了队列长度;

入队的时候,判断下一个存储器标志位是否为1,若为1,则认为队列满,关闭相应中断,停止入队;若不是,rear = (rear +1) % N;置标志位,队列长度增加;

出队的时候,判断队列中有长度,且front的当前位置寄存器标志位为“1”,表示此时存储器有效,进行出队;front= (front+1) % N,清标志位,队列长度减少;

可能有些繁琐,但是对于实际问题确实得到了解决,队列不再出问题了;一个中断频率很高,不停地入队;一个中断频率较低,慢慢地出队;

请教下大家,其实增加标志数组是个繁琐的东西,但是效果有改善,是为什么呢?
有没有更好的FIFO的代码?保护临界区的
点赞  2009-4-18 18:11
说明原来的程序没有判断越界,不停的入队,超过预定范围,将队列范围外的地方也写了数据。
要标志临界区,肯定要有标志的,不然无从判断。
点赞  2009-4-19 11:32
谢谢ls

我判断越界了啊 一旦到了队列满,即数目达到队列总数8的时候,即关闭串口中断,停止入队啊;

我也加了关EA的操作啊,有点匪夷所思
点赞  2009-4-19 13:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复