OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14457|回复: 28

uC/OS-II的中断处理函数中,OSIntEnter()函数怎么有的中断中写了,有的没写呢

[复制链接]

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
发表于 2015-12-31 09:20:03 | 显示全部楼层 |阅读模式
1金钱
如题,uC/OS-II的中断处理函数中OSIntEnter()和OSIntExit()什么时候写,什么时候不写呢?各有什么优缺点呢?
这个写了
1.png

这个没写
2.png

这个没写
3.png



     


最佳答案

查看完整内容[请看2#楼]

只要用了OS,那么就必须得写,没写应该是拷贝代码的时候没有注意到疏忽了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 09:20:04 | 显示全部楼层
只要用了OS,那么就必须得写,没写应该是拷贝代码的时候没有注意到疏忽了
开往春天的手扶拖拉机
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 09:50:08 | 显示全部楼层
OSIntEnter()是高速ucos要进入中断了,OSIntExit()是高速ucos中断完成了,同时进行一次任务调度。
如果中断中有post邮箱或者队列,这时候调度完成pend生效。如果没有和任务相关的信号post的话不需要立即切换任务调度的。【你可以进入相应函数看函数说明和内部逻辑,能看出来到底是做了哪些操作的】
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 10:14:10 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 09:57
只要用了OS,那么就必须得写,没写应该是拷贝代码的时候没有注意到疏忽了

不是必须的吧!?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-12-31 10:37:10 | 显示全部楼层
365mcu 发表于 2015-12-31 10:14
不是必须的吧!?

按照规则来讲,是必须的

如果没写,而程序正常,只能说走大运了
学无止境
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 10:40:57 | 显示全部楼层
本帖最后由 zuozhongkai 于 2015-12-31 10:42 编辑
365mcu 发表于 2015-12-31 10:14
不是必须的吧!?

必须得写,OSIntExit()里面调用了中断级任务调度器,UCOS中调度器分两种,一种是任务级调度器,一种是中断级任务调度器,但是一般情况下中断中不写的话不会出错,目前也没有深究为什么会这样
开往春天的手扶拖拉机
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 10:48:24 | 显示全部楼层
jermy_z 发表于 2015-12-31 10:37
按照规则来讲,是必须的

如果没写,而程序正常,只能说走大运了

一般中断中都会使用的是OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),看了一下函数说明OSIntEnter() 和 OSIntExit()包含静止中断的功能。
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-12-31 10:53:49 | 显示全部楼层
365mcu 发表于 2015-12-31 10:48
一般中断中都会使用的是OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),看了一下函数说明OSIntEnter() 和 O ...

那是  critical 的功能

别看错函数
学无止境
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 11:08:12 | 显示全部楼层
jermy_z 发表于 2015-12-31 10:53
那是  critical 的功能

别看错函数

在没有信号post的中断中,我在中断中只使用OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL();
不使用OSIntEnter() 和 OSIntExit();请问会有什么问题吗?
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 11:08:31 | 显示全部楼层
jermy_z 发表于 2015-12-31 10:53
那是  critical 的功能

别看错函数

在没有信号post的中断中,我在中断中只使用OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL();
不使用OSIntEnter() 和 OSIntExit();请问会有什么问题吗?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-12-31 11:12:15 | 显示全部楼层
365mcu 发表于 2015-12-31 11:08
在没有信号post的中断中,我在中断中只使用OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL();
不使用OSIntEn ...

万不得已  不要用critical
学无止境
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 11:21:55 | 显示全部楼层
jermy_z 发表于 2015-12-31 11:12
万不得已  不要用critical

我想想可能是以前使用的有点问题的,您看这么理解还对:
用OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()我是限制的中断嵌套,因为发生该中断的时候其他中断也停止了,这是ucos系统核心其实也是停止的,所以不会发送什么无法恢复导致程序跑飞的BUG;
使用OSIntEnter() 和 OSIntExit(),是允许在ucos下中断嵌套,必须所有中断执行完成才能恢复中断之前的任务或则切换为最高优先级任务;
但是我看OSIntEnter() 说明是在调用OSIntEnter() 函数的时候往往已经调用了OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),这个应该是在函数里加的:
[mw_shl_code=c,true]MyISR()
{
OS_ENTER_CRITICAL() ;
OSIntEnter();
OS_EXIT_CRITICAL();


OSIntExt();//这个里面也是调用了OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()的,我想都是为了防止在中断执行错误。
}[/mw_shl_code]
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-12-31 11:47:58 | 显示全部楼层
OS_ENTER_CRITICAL 和 OSIntEnter,这两什么关系?
看了半天还是没搞懂。μcos中断里面必须用吗?
小小蜗牛
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 13:08:40 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 09:20
只要用了OS,那么就必须得写,没写应该是拷贝代码的时候没有注意到疏忽了

不是疏忽的吧

我看了407最新的代码,有的有,有的就没写
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 13:15:56 | 显示全部楼层
365mcu 发表于 2015-12-31 09:50
OSIntEnter()是高速ucos要进入中断了,OSIntExit()是高速ucos中断完成了,同时进行一次任务调度。
如果中 ...

我也觉得不是必须的,只要中断没有post等操作,完全可以不用条用这两个函数。

我现在调用和不调用,系统都很正常
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 13:25:05 | 显示全部楼层
jiutianshenjian 发表于 2015-12-31 11:47
OS_ENTER_CRITICAL 和 OSIntEnter,这两什么关系?
看了半天还是没搞懂。μcos中断里面必须用吗?

OS_ENTER_CRITICAL():其实就是禁止CPU中断,即无法中断嵌套了。
OSIntEnter():实际上是ucos自己统计中断嵌套用的,和OSIntExt组合用来中断恢复时决定那个任务运行的。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 13:29:35 | 显示全部楼层
天山狐狸 发表于 2015-12-31 13:15
我也觉得不是必须的,只要中断没有post等操作,完全可以不用条用这两个函数。

我现在调用和不调用,系 ...

应该至少使用一种方法在中断中。目前理解应该是这样的,但是说有问题的大神没有回复我,我理解的是否有问题。@jermy_z
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 13:30:16 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 10:40
必须得写,OSIntExit()里面调用了中断级任务调度器,UCOS中调度器分两种,一种是任务级调度器,一种是中 ...

ls再看看f407的例程,不是疏忽吧。如:

1,标准例程-寄存器版本.rar  实验58中,HARDWARE下的RS485,TIMER,EXTI等都有中断服务函数,里面都没有调那2个函数。。。

回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 14:47:10 | 显示全部楼层
说了,就是疏忽,我们写的代码我能不知道是不是疏忽,因为多数基础例程都是没有操作系统的,所以写这些例程的时候就没有加这些。如果你要上系统的话这些中断服务函数就必须要加上。
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 14:47:36 | 显示全部楼层
天山狐狸 发表于 2015-12-31 13:30
ls再看看f407的例程,不是疏忽吧。如:

1,标准例程-寄存器版本.rar  实验58中,HARDWARE下的RS485,T ...

说了,就是疏忽,我们写的代码我能不知道是不是疏忽,因为多数基础例程都是没有操作系统的,所以写这些例程的时候就没有加这些。如果你要上系统的话这些中断服务函数就必须要加上。
开往春天的手扶拖拉机
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 15:21:52 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 14:47
说了,就是疏忽,我们写的代码我能不知道是不是疏忽,因为多数基础例程都是没有操作系统的,所以写这些例 ...

好的,是疏忽

我用系统时把他们都加上吧
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 15:35:31 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 14:47
说了,就是疏忽,我们写的代码我能不知道是不是疏忽,因为多数基础例程都是没有操作系统的,所以写这些例 ...

能解释一下为什么一定要加上吗?如果不加,在什么情况下可能出错呢?,我之前的理解不知道是否正确!
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 15:40:27 | 显示全部楼层
天山狐狸 发表于 2015-12-31 15:21
好的,是疏忽

我用系统时把他们都加上吧

对哒,一旦上了系统这两个一定要加的,我晚上会重开一个帖子详细的讲解一下为什么。
开往春天的手扶拖拉机
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-31 15:40:50 | 显示全部楼层
365mcu 发表于 2015-12-31 15:35
能解释一下为什么一定要加上吗?如果不加,在什么情况下可能出错呢?,我之前的理解不知道是否正确!

晚上会重开一个帖子详细讲解为什么要加这两个
开往春天的手扶拖拉机
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 15:59:03 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 15:40
晚上会重开一个帖子详细讲解为什么要加这两个

好的,谢谢,能否看看我之前回复的理解是否正确呢?
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 16:07:06 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 15:40
晚上会重开一个帖子详细讲解为什么要加这两个

期待,到时通知我一声啊。谢谢

我看安富莱的例程中这么写OSIntEnter,有必要调用OSIntEnter时关中断吗?
OS_ENTER_CRITICAL();                        
OSIntEnter();
OS_EXIT_CRITICAL();
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-31 17:20:14 | 显示全部楼层
天山狐狸 发表于 2015-12-31 16:07
期待,到时通知我一声啊。谢谢

我看安富莱的例程中这么写OSIntEnter,有必要调用OSIntEnter时关中断吗 ...

看ucos的OSIntEnter()函数说明,是需要的。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2015-12-31 17:42:16 | 显示全部楼层
365mcu 发表于 2015-12-31 17:20
看ucos的OSIntEnter()函数说明,是需要的。

哦,好吧。

看来中断中加的东西真不少啊
回复

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2017-5-16 15:43:42 | 显示全部楼层
zuozhongkai 发表于 2015-12-31 15:40
晚上会重开一个帖子详细讲解为什么要加这两个

你开的帖子链接在哪里,
我就是我,是颜色不一样的烟火。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 03:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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