譬如说:
我用个循环队列存储和发送消息,队列使用固定长度的数组,其中数组的长度肯定长于每条消息,队列中有8个数组(均存在XRAM中);
一个串口中断(每个字节触发一次) 另一个中断(固定T触发一次) 串口中断优先级高 波特率400Kbps;
串口是接收消息,入队列;定时中断发送消息,出队列;其中出队列按照一定的规则,存在出队列速度远远低于入队,如果队列满,则关闭串口;
我在高消息密度下入队时,丢消息是正常的,故宁可丢消息,也要保证工作稳定,但是发现我的队列以外的XRAM会被意外写成了数据,即被意外覆盖;
请教大家,在keil中应该如果避免此类的错误?
程序的架构上有没有改进的地方?
ls
rear和front都是增减进行取余 可以在每个存储器上增加一个是否正使用的标志;
但是使用队列中数目依然可以达到这个要求 而且其中的使用都是在关中断执行;
谢谢!
最好保证: rear 和 front 之间最少都会相差一个。判断时采用
[code]
来比较
C51用波特率400Kbps是不是太高了,115200(115K)对51已经够呛了!
ls 我使用的MCU的主频比较高呵呵……
关于3楼的建议谢谢哈 有没有更好的队列控制模式呢?因为每次队列操作都要进行判断 效率是不是有些不好……而且队列中的区
域被意外擦写我能理解,但是队列以外的区域也被擦写了这是为什么呢?
“队列以外的XRAM会被意外写成了数据”,不是消息队列的架构导致的,应该是程序出错了,比如数组越界,指针错误,程序跑飞等等。
如果方便,可以将程序贴出,或者mail。
谢谢shuiyan 呵呵每次都这么热心
嗯程序粘贴不是很方便 我先按照你说的几个问题去查查 到时再分享;谢谢大家!
我承认是队列的问题,我目前的程序框架如下:
使用标志数组(就是和存储器一一对应的标志) “1”则表示存储器占用,“0”表示存储器被占;仍然延续了队列长度;
入队的时候,判断下一个存储器标志位是否为1,若为1,则认为队列满,关闭相应中断,停止入队;若不是,rear = (rear +1) % N;置标志位,队列长度增加;
出队的时候,判断队列中有长度,且front的当前位置寄存器标志位为“1”,表示此时存储器有效,进行出队;front= (front+1) % N,清标志位,队列长度减少;
可能有些繁琐,但是对于实际问题确实得到了解决,队列不再出问题了;一个中断频率很高,不停地入队;一个中断频率较低,慢慢地出队;
请教下大家,其实增加标志数组是个繁琐的东西,但是效果有改善,是为什么呢?
有没有更好的FIFO的代码?保护临界区的
说明原来的程序没有判断越界,不停的入队,超过预定范围,将队列范围外的地方也写了数据。
要标志临界区,肯定要有标志的,不然无从判断。
谢谢ls
我判断越界了啊 一旦到了队列满,即数目达到队列总数8的时候,即关闭串口中断,停止入队啊;
我也加了关EA的操作啊,有点匪夷所思