搜索
bottom↓
回复: 19
打印 上一主题 下一主题

uCOS-II中断服务程序写法

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2011-11-25 15:29:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uCOS-II在写中断服务程序(如串口中断)中,下面两种方法有什么不同,哪个更好?

串口中断1
{
    OS_ENTER_CRITICAL();

    用户代码

    OS_EXIT_CRITICAL();
}


串口中断2
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    用户代码

    OSIntExit();
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

2
发表于 2011-11-25 16:41:16 | 只看该作者
两种写法,不是各有优缺点嘛...

出0入0汤圆

3
发表于 2011-11-25 18:33:38 | 只看该作者
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得到执行:退出ISR之前没有调用OSIntExit(),程序直接返回中断发生前的任务,继续执行原来的任务。             OSIntExit()的作用是1、OSIntNesting--;2、获取最高就绪任务,如最高优先级任务不是当前任务,则进行中断任务切换。也就是中断并不一定返回到被中断的任务,还有可能是更高优先级的就绪任务(在用户中断进行期间,时钟节拍中断有可能让等待任务进入就绪状态,当然前提是时钟节拍中断的优先级最高(关于时钟节拍中断的优先级问题,并没有资料明确,我一般将其设置为最高,可以保证高优先级任务的实时性,当然也有人设置为最低,降低了不必要的中断进行时时间开销,不过综合UCOS的其余代码,个人认为设定为最高比较好,毕竟时钟节拍切换的时间是可以估算的))。

第二种写法更好,但是建议不要直接OSIntNesting++,UCOS提供了OSIntEnter函数嘛

个人经验,欢迎拍砖

出0入0汤圆

4
发表于 2011-12-19 22:05:24 | 只看该作者
* Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call
*                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
*                 end of the ISR.

出0入0汤圆

5
发表于 2011-12-20 08:28:23 | 只看该作者
mark

出0入0汤圆

6
发表于 2012-11-22 14:40:53 | 只看该作者
hellochen 发表于 2011-11-25 18:33
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...

顶  表示感谢

出0入0汤圆

7
发表于 2012-11-22 16:12:11 | 只看该作者
学习了!!!!!!!!

出0入0汤圆

8
发表于 2013-2-25 01:23:19 来自手机 | 只看该作者
四楼正解!!

出0入0汤圆

9
发表于 2013-3-6 15:16:53 | 只看该作者
学习了。

出0入0汤圆

10
发表于 2013-3-20 22:42:06 | 只看该作者
mark  刚好碰到这个问题

出0入0汤圆

11
发表于 2013-3-20 23:19:30 | 只看该作者
恩。我个人的理解是这样子的。
首先如果我没有记错的话OS_ENTER_CRITICAL表示进入临界区有三种方案,其中有一种就是关闭所有中断请求。这个时候不存在中断嵌套的问题了。第一种写法就可以了。
随着应用要求的增多和处理器性能的提升。进入临界区后允许新的中断请求。中断嵌套的情况就会出现。这个时候需要使用第二种写法。

出0入0汤圆

12
发表于 2014-10-21 14:16:30 | 只看该作者
hellochen 发表于 2011-11-25 18:33
第一种写法不好,准确的说是不正确,程序可以运行,但并不是UCOS的标准做法,不能保证高优先级的任务优先得 ...

关键就是OSIntExit会引起调度。

出0入0汤圆

13
发表于 2015-2-3 13:42:04 | 只看该作者
多谢楼上的讨论!

出0入0汤圆

14
发表于 2015-2-4 15:45:03 | 只看该作者
看你要怎么用  
第一种写法 的话是中断函数自成一体的结构 中断函数和任务不太关联或者用共享内存的方法关联在一起
第二种写法 中断与任务有关联 比如mail message 或者signal 中断完成后立刻调度任务

出0入0汤圆

15
发表于 2015-2-4 19:05:23 | 只看该作者
学习了。

出0入0汤圆

16
发表于 2015-6-24 18:56:47 | 只看该作者
第一种写法关中断的时间比较长,不能中断嵌套,实时性差。

出0入0汤圆

17
发表于 2015-8-5 15:02:03 | 只看该作者
还不了解,过来学习的

出0入0汤圆

18
发表于 2015-8-11 23:08:55 | 只看该作者
用了这么久的uCOS-II,都还没这么深入的研究过,一直用的第一种方法

出0入0汤圆

19
发表于 2015-9-1 20:25:53 | 只看该作者
一直是这个方式:
中断服务程序
{
    OSIntEnter();   

    用户代码

    OSIntExit();
}

出0入0汤圆

20
发表于 2015-10-13 20:51:36 来自手机 | 只看该作者
这个会关总中断呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表