如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解决
问题如下,uart串口打印发不出数来,或者发错误的数,或者发全是0;很好笑这个问题,给我恼了两天。找来找去找不到问题,挨个屏蔽挨个试。最后发现屏蔽定时器初始化才正常。完全想不明白定时器怎么能跟串口冲突?又是试来试去,最后是发现,屏蔽按键扫描就行。
个人觉得应该是定时器0的中断优先级太高,不停的打断了uart,导致读取的数值错误。或者读不到。
但是不太确定是不是,uart中断被打断了应该是中断嵌套,从定时器回来应该继续发送啊,怎么会发不出来
void timer0() interrupt 1
{
TL0 = (65536 - 8000)%256; //手动重装载值低8位
TH0 = (65536 - 8000)/256; //手动重装载值高8位
Timer0_1msFg_Buzz = 1;
// Key_Scan();
} 按键扫描里面有delay?时间过长,导致这个中断还没结束下一个就来了 在Key_Scan这设置一个标识位,在主程序里判断这个标识位执行按键扫描程序,不要在中断里长时间延时。 MCU的软件,感觉就是一个时序大管理的工程,时序管理做好了基本就没有什么问题。 肯定是你的案件扫描和串口程序有冲突。串口程序只负责把数据放入串口模块,发送数据是模块硬件的事,不会受到timer中断的影响。 爱晴海玩偶 发表于 2022-5-19 11:35
按键扫描里面有delay?时间过长,导致这个中断还没结束下一个就来了
(引用自2楼)
写软件我能用定时器解决的,不会用delay。在按键扫描里只有一个消抖的计时KeyCount++。按键持续按下超过5ms没有抖动,给KeyValue这个变量返回一个键值。在另一个嵌套在主函数的KeyProcess()里面,根据返回来的键值KeyValue在不同界面进行对应的处理 无所谓吧,计算好中断占用时间和可接受的中断延迟就行,那些以讹传讹说中断要简单的估计都从来没经自己的理解和判断。 那你倒是把KEY_SCAN代码放上来呀 中断里用到的函数最好定义成可重入函数 串口驱动写的太差了 makesoft 发表于 2022-5-19 15:23
无所谓吧,计算好中断占用时间和可接受的中断延迟就行,那些以讹传讹说中断要简单的估计都从来没经自己的理 ...
(引用自7楼)
给新手说让他分析中断占用延时,还不如简单点让他在中断中少占用时间,新手没有足够的分析能力。 不是耗时操作肯定没影响,发个数据还能数据慢啊 “菜鸟有关中断里不能处理复杂的事情的问题 ”标题不合格。请自行修正。不理会此通知,将可能会被封锁ID。
帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
1:小女子冰天雪地裸体跪求解决方法
2:救命啊...
3:高手请出招,一个无法解决的AVR问题
4:一个困扰学习单片机初学者,惊动单片机开发者的难题
5:AVR的ADC测量 (点评:你到底是问问题,或是有技术心得与大家分享?)
高优先级的中断打断低优先级导致数据丢失应该如何解决?
armok. 发表于 2022-5-19 20:49“菜鸟有关中断里不能处理复杂的事情的问题 ”标题不合格。请自行修正。不理会此通知,将可能会被封锁ID。 ...
(引用自13楼)
抱歉,标题起得不合格。我原本想问如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解决。 gsq19920418 发表于 2022-5-19 16:48
那你倒是把KEY_SCAN代码放上来呀
(引用自8楼)
好的好的,其实问题已经解决,但是我还是不太明白原因。希望大哥帮忙看看。
当我开启定时器中断,打开定时器0(中断号为1),关闭其他定时器。同时开启uart串口(中断号4)。此时串口发不出去,也是收不到东西。(定时器中断里没东西都不行)
当我屏蔽了定时器的时候,串口又恢复正常。我猜测是中断优先级的问题。并关闭了定时器0,打开了定时器3(中断号13)。依然没有恢复正常,然后屏蔽了按键扫描,只留一个bit 变量置位。然后才恢复正常。
我不是很明白为什么发不出去东西,不是中断嵌套,回来继续执行吗
void main(void)
{
uchar m;
IO_Init();
Timer_Init();//
Buzz_Drive(500);
BTM_Init();
Uart_Init(16,9600);
SR_Cmd2_Gain();
TM1640_Init();
for(m=0;m<16;m++)
{
TM1640_display_H(m,0xFF);
}
delay_ms(16);
for(m=0;m<16;m++)
{
TM1640_display_H(m,0x00);
}
while(1)
{
DisAll();
Key_Scan();
Key_Process();
GoWork();
Work_State();
}
}
niugangzhou 发表于 2022-5-23 09:23
抱歉,标题起得不合格。我原本想问如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解 ...
(引用自14楼)
注意:主题发出24小时后就不能修改帖子。
你应该自修修改标题,我帮你修改了。
本应封锁ID一星期,这次不处罚。
下次再违反,将永久封锁ID。 armok. 发表于 2022-5-31 03:30
注意:主题发出24小时后就不能修改帖子。
你应该自修修改标题,我帮你修改了。
(引用自16楼)
好的,以后我会注意的。之前发完帖子一直没登录论坛,满脑子都在想这个问题怎么解决。等我解决了以后才想起来论坛上我有发求助的帖子。那时候已经是4天后了。 串口驱动中断优先级最高,驱动要在几个微秒执行完成。 去看看周航慈的书吧,给讲的明明白白 lhj200304 发表于 2022-6-1 19:41
去看看周航慈的书吧,给讲的明明白白
(引用自19楼)
基于嵌入式实时操作系统程序设计---周慈航这本? lb0857 发表于 2022-11-9 20:45
基于嵌入式实时操作系统程序设计---周慈航这本?
(引用自20楼)
是的呀
页:
[1]