niugangzhou 发表于 2022-5-19 11:22:26

如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解决

问题如下,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();
}

爱晴海玩偶 发表于 2022-5-19 11:35:28

按键扫描里面有delay?时间过长,导致这个中断还没结束下一个就来了

Doding 发表于 2022-5-19 11:51:09

在Key_Scan这设置一个标识位,在主程序里判断这个标识位执行按键扫描程序,不要在中断里长时间延时。

chendaon 发表于 2022-5-19 14:09:59

MCU的软件,感觉就是一个时序大管理的工程,时序管理做好了基本就没有什么问题。

vuo50z 发表于 2022-5-19 14:48:41

肯定是你的案件扫描和串口程序有冲突。串口程序只负责把数据放入串口模块,发送数据是模块硬件的事,不会受到timer中断的影响。

niugangzhou 发表于 2022-5-19 15:15:22

爱晴海玩偶 发表于 2022-5-19 11:35
按键扫描里面有delay?时间过长,导致这个中断还没结束下一个就来了
(引用自2楼)

写软件我能用定时器解决的,不会用delay。在按键扫描里只有一个消抖的计时KeyCount++。按键持续按下超过5ms没有抖动,给KeyValue这个变量返回一个键值。在另一个嵌套在主函数的KeyProcess()里面,根据返回来的键值KeyValue在不同界面进行对应的处理

makesoft 发表于 2022-5-19 15:23:23

无所谓吧,计算好中断占用时间和可接受的中断延迟就行,那些以讹传讹说中断要简单的估计都从来没经自己的理解和判断。

gsq19920418 发表于 2022-5-19 16:48:57

那你倒是把KEY_SCAN代码放上来呀

modbus 发表于 2022-5-19 17:48:11

中断里用到的函数最好定义成可重入函数

makesoft 发表于 2022-5-19 18:08:55

串口驱动写的太差了

Doding 发表于 2022-5-19 20:29:30

makesoft 发表于 2022-5-19 15:23
无所谓吧,计算好中断占用时间和可接受的中断延迟就行,那些以讹传讹说中断要简单的估计都从来没经自己的理 ...
(引用自7楼)

给新手说让他分析中断占用延时,还不如简单点让他在中断中少占用时间,新手没有足够的分析能力。

初音之恋 发表于 2022-5-19 20:40:51

不是耗时操作肯定没影响,发个数据还能数据慢啊

armok. 发表于 2022-5-19 20:49:25

“菜鸟有关中断里不能处理复杂的事情的问题 ”标题不合格。请自行修正。不理会此通知,将可能会被封锁ID。

帖子标题必须能充分说明帖子的内容。如你要问AVR的ADC如何才能测量得比较准确,“AVR的ADC如何消除干扰测量得比较准确?”是合格的标题。不合格举例:
    1:小女子冰天雪地裸体跪求解决方法
    2:救命啊...
    3:高手请出招,一个无法解决的AVR问题
    4:一个困扰学习单片机初学者,惊动单片机开发者的难题
    5:AVR的ADC测量   (点评:你到底是问问题,或是有技术心得与大家分享?)

niugangzhou 发表于 2022-5-23 09:23:30

高优先级的中断打断低优先级导致数据丢失应该如何解决?

armok. 发表于 2022-5-19 20:49
“菜鸟有关中断里不能处理复杂的事情的问题 ”标题不合格。请自行修正。不理会此通知,将可能会被封锁ID。 ...
(引用自13楼)

抱歉,标题起得不合格。我原本想问如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解决。

niugangzhou 发表于 2022-5-23 09:42:04

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();
        }
}

armok. 发表于 2022-5-31 03:30:16

niugangzhou 发表于 2022-5-23 09:23
抱歉,标题起得不合格。我原本想问如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解 ...
(引用自14楼)

注意:主题发出24小时后就不能修改帖子。

你应该自修修改标题,我帮你修改了。

本应封锁ID一星期,这次不处罚。

下次再违反,将永久封锁ID。

niugangzhou 发表于 2022-6-1 17:18:52

armok. 发表于 2022-5-31 03:30
注意:主题发出24小时后就不能修改帖子。

你应该自修修改标题,我帮你修改了。
(引用自16楼)

好的,以后我会注意的。之前发完帖子一直没登录论坛,满脑子都在想这个问题怎么解决。等我解决了以后才想起来论坛上我有发求助的帖子。那时候已经是4天后了。

sfes 发表于 2022-6-1 17:36:12

串口驱动中断优先级最高,驱动要在几个微秒执行完成。

lhj200304 发表于 2022-6-1 19:41:59

去看看周航慈的书吧,给讲的明明白白

lb0857 发表于 2022-11-9 20:45:27

lhj200304 发表于 2022-6-1 19:41
去看看周航慈的书吧,给讲的明明白白
(引用自19楼)

基于嵌入式实时操作系统程序设计---周慈航这本?

lhj200304 发表于 2022-11-10 09:06:41

lb0857 发表于 2022-11-9 20:45
基于嵌入式实时操作系统程序设计---周慈航这本?
(引用自20楼)

是的呀   
页: [1]
查看完整版本: 如果开启两个中断,高优先级的中断打断低优先级导致数据丢失应该如何解决