打印

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

[复制链接]
2070|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxdengos|  楼主 | 2009-4-11 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
譬如说:

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

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

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

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

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

相关帖子

沙发
刘前辈| | 2009-4-11 12:15 | 只看该作者

自己程序的问题吧?

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

环形缓冲器没设计好吧。不闭环。

使用特权

评论回复
板凳
ayb_ice| | 2009-4-11 18:11 | 只看该作者

是没有控制好,不是意外

或是出乎你的意外

使用特权

评论回复
地板
yxdengos|  楼主 | 2009-4-12 15:32 | 只看该作者

谢谢ls两位

对于循环队列的数据结构 除了头尾计数指针 我就是增加了一个队列数目来防止
还应该从什么方面来防止意外呢?
而且我有些想不明白 如果没有控制好的话 队列中的元素会被意外擦写,属于正常

但是队列意外的内存区域也会被擦写,这是为什么呢?

使用特权

评论回复
5
ayb_ice| | 2009-4-12 16:32 | 只看该作者

越界后,要及时从头开始

使用特权

评论回复
6
冷漠| | 2009-4-12 17:37 | 只看该作者

怎么可能越界?写的不完善吧。

i=i+1 %10;

这样的环形缓冲器会越界么?根本不可能写到环域之外。

C没那么笨,什么都要编程员人工考虑到意外情况并程序处理。


LZ最好举个简单的程序例子,否则谁知道你错在哪。

使用特权

评论回复
7
yxdengos|  楼主 | 2009-4-13 08:36 | 只看该作者

谢谢大家

关键位置的队列操作我使用了保护

rear = (rear + 1) & 0x07;

front = (front + 1) & 0x07;   队列长度是8

比较不清楚是什么操作不当 导致其他内存区域被擦写呢?
我想问题的定位确实应该在队列中;

使用特权

评论回复
8
冷漠| | 2009-4-13 08:48 | 只看该作者

调试技术,手段、工具,什么都不用?凭空想象分析?

这不是很简单的事么?在编译后的代码中查找“MOVX....”就行了。

使用特权

评论回复
9
xwj| | 2009-4-13 08:55 | 只看该作者

你自己程序的问题

使用特权

评论回复
10
yxdengos|  楼主 | 2009-4-18 18:13 | 只看该作者

谢谢大家

我承认是队列的问题,我目前的程序框架如下:

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

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

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

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

请教下大家,其实增加标志数组是个繁琐的东西,但是效果有改善,是为什么呢?
有没有更好的FIFO的代码?保护临界区的

使用特权

评论回复
11
yxdengos|  楼主 | 2009-4-20 20:25 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

132

帖子

0

粉丝