OpenEdv-开源电子网

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

说说我对uCOS-II任务调度的理解,大家看看对不,不对请指教

[复制链接]

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
发表于 2016-5-3 09:43:38 | 显示全部楼层 |阅读模式
1金钱
OS:uCOS-II

以前我一直认为是一个任务只要在运行,只有中断才可以打断它继续运行;但是最近测试发现只要比它优先级高的任务都可以打断它继续运行。只要高优先级的任务满足运行的条件,不管低优先级任务是否在运行,它都可以打断它来抢先运行自己。


总结:
1、中断可以打断任何任务而抢先运行,不管任务是否在运行都没有关系,即中断来了它就要使用CPU
2、高优先级的任务只要满足运行的条件,不管低优先级的任务是否在运行都没有关系,即使低优先级任务在运行,高优先级任务也可以打断它【类似中断的现象】而运行自己


这样理解对吗?不对请指点

最佳答案

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

正确,ucos就是抢占型的操作系统,抢占的意思就是你的第2点了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-5-3 09:43:39 | 显示全部楼层
正确,ucos就是抢占型的操作系统,抢占的意思就是你的第2点了。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-3 09:50:22 | 显示全部楼层
你说的高优先级任务打断低优先级任务是指可剥夺型内核,UCOS的内核是不可剥夺的

当前任务完成后系统进入调度,此时执行等待列表中优先级最高的任务。也就是高优先级任务可以“打断”(或者说插队更贴切)等待列表中的低优先级任务,而不是打断当前运行的低优先级任务。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 10:00:56 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 09:50
你说的高优先级任务打断低优先级任务是指可剥夺型内核,UCOS的内核是不可剥夺的

当前任务完成后系统进入 ...

哦,以前我也是那么理解的

但是上次测试发现在一个任务中输出了另一个任务的信息,所以又改变了想法?
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-3 10:09:25 | 显示全部楼层
天山狐狸 发表于 2016-5-3 10:00
哦,以前我也是那么理解的

但是上次测试发现在一个任务中输出了另一个任务的信息,所以又改变了想法?

贴一下具体的测试代码?

有时候可能因为其它原因也导致了这个现象
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 10:14:29 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 10:09
贴一下具体的测试代码?

有时候可能因为其它原因也导致了这个现象

好的,代码在屋里的电脑上,我看看能否想起来
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 10:24:17 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 10:09
贴一下具体的测试代码?

有时候可能因为其它原因也导致了这个现象

[mw_shl_code=applescript,true]static void Task1(void *pdata)
{
  (void)pdata;
  uint8_t  err;
  uint16_t temp;

  while(1)
  {
    temp=(u32)OSQPend(MsgQ_RangingDis_M2_LCD_Disp,0,&err);//请求消息队列,这个消息从中断中给出
    if(err==OS_ERR_NONE)
    {
      printf("%02d\r\n",temp);
    }
  }
}
static void Task2(void *pdata)
{
  (void)pdata;
  uint8_t  err;

  while(1)
  {
    printf("低优先级任务开始运行,下面不应该出现其他任务的提示信息\r\n");
    ......
    printf("低优先级任务结束\r\n");


    OSTimeDlyHMSM(0,0,1,0);
  }
}[/mw_shl_code]

测试结果是:任务2的两个输出信息中出现了任务1的输出信息。【任务1的优先级高于2,1的消息是中断给的】
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 10:39:16 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 09:50
你说的高优先级任务打断低优先级任务是指可剥夺型内核,UCOS的内核是不可剥夺的

当前任务完成后系统进入 ...

ls,刚才复习了下,ucos是抢占式的,可剥夺的内核。。
你理解错了,似乎我的理解的正确的,实际验证和理论符合。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-3 10:51:27 | 显示全部楼层
天山狐狸 发表于 2016-5-3 10:39
ls,刚才复习了下,ucos是抢占式的,可剥夺的内核。。
你理解错了,似乎我的理解的正确的,实际验证和理 ...

你这是用消息队列做的抢占式效果

UCOS发生中断,中断结束之后会先进一次调度,这时候task1优先级更高所以先执行task1。

从本质上来说还是中断打断了低优先级的任务,并不是高优先级任务打断了低优先级任务,

回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 10:58:33 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 10:51
你这是用消息队列做的抢占式效果

UCOS发生中断,中断结束之后会先进一次调度,这时候task1优先级更高 ...

嗯,可以这么理解。。但是我的中断中没有进行任务的调度,只是发了消息。中断前运行到哪里,中断后继续运行的。


ucos是抢占式内核,所以高优先级任务可以打断正在运行的低优先级任务而运行的。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-3 11:04:44 | 显示全部楼层
本帖最后由 特朗姆斯 于 2016-5-3 11:05 编辑
天山狐狸 发表于 2016-5-3 10:58
嗯,可以这么理解。。但是我的中断中没有进行任务的调度,只是发了消息。中断前运行到哪里,中断后继续运 ...

你看一下你中断服务程序里面有没有OSIntExit这个函数
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 11:11:42 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 11:04
你看一下你中断服务程序里面有没有OSIntExit这个函数

没有这个函数。。。。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-3 11:16:47 | 显示全部楼层
天山狐狸 发表于 2016-5-3 11:11
没有这个函数。。。。

这个情况我没试过。。值得探究一下
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 11:22:50 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 11:16
这个情况我没试过。。值得探究一下

嗯,我晚上可以再测试下没有中断下,看看高优先级任务是否可以打断正在运行的低优先级任务
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-3 20:58:42 | 显示全部楼层
本帖最后由 天山狐狸 于 2016-5-3 21:14 编辑

@正点原子,能否帮看看,对不


回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-5 16:11:08 | 显示全部楼层
正点原子 发表于 2016-5-3 09:43
正确,ucos就是抢占型的操作系统,抢占的意思就是你的第2点了。

谢谢

实际测试验证了我的理解是对的。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-5 16:14:19 | 显示全部楼层
特朗姆斯 发表于 2016-5-3 11:16
这个情况我没试过。。值得探究一下

哈哈,今天测试了下没有中断情况下,高优先级打断正在运行的低优先级任务的情况,事实证明确实如我楼主位说的,不仅中断可以打断正在运行的任何优先级任务,而且高优先级的任务也可以打断正在运行的低优先级任务。。。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-6 09:17:45 | 显示全部楼层
天山狐狸 发表于 2016-5-5 16:14
哈哈,今天测试了下没有中断情况下,高优先级打断正在运行的低优先级任务的情况,事实证明确实如我楼主位 ...

恭喜楼主!

我顺便蹭了一下和UCOS有关的经验
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-6 11:25:59 | 显示全部楼层
天山狐狸 发表于 2016-5-5 16:14
哈哈,今天测试了下没有中断情况下,高优先级打断正在运行的低优先级任务的情况,事实证明确实如我楼主位 ...

我觉得是在systickhandler里面进行任务切换了,高优先级任务怎么可能会打断低优先级任务呢。
我有故事,你有酒吗
回复

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
发表于 2016-5-6 11:51:29 | 显示全部楼层
天山狐狸 发表于 2016-5-5 16:14
哈哈,今天测试了下没有中断情况下,高优先级打断正在运行的低优先级任务的情况,事实证明确实如我楼主位 ...

顶19楼的前辈说的话~

因为Systick handler本身是一个中断服务程序,一般的话每1ms会进入一次,然后退出这个中断的时候(就是运行OSIntExit();时候)会触发一次任务切换。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-8 20:26:33 | 显示全部楼层
特朗姆斯 发表于 2016-5-6 09:17
恭喜楼主!

我顺便蹭了一下和UCOS有关的经验

共同进步哈
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-8 20:28:50 | 显示全部楼层
来俩不甜的 发表于 2016-5-6 11:25
我觉得是在systickhandler里面进行任务切换了,高优先级任务怎么可能会打断低优先级任务呢。

应该就在滴答定时器中判断并做的任务切换。另:抢占型OS就需要这样,永远是高优先级的任务先运行

下面是滴答定时器中断中的代码
[mw_shl_code=applescript,true]void  SysTick_Handler (void)
{
  #if OS_CRITICAL_METHOD == 3u
    OS_CPU_SR cpu_sr;
  #endif

  OS_ENTER_CRITICAL();
  OSIntNesting++;
  OS_EXIT_CRITICAL();

  OSTimeTick();                               /*  Call uC/OS-II's OSTimeTick()*/

  OSIntExit();
}[/mw_shl_code]
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-8 22:04:01 | 显示全部楼层
天山狐狸 发表于 2016-5-8 20:28
应该就在滴答定时器中判断并做的任务切换。另:抢占型OS就需要这样,永远是高优先级的任务先运行

下面 ...

我有一个疑问

假设systick的中断间隔是10ms,所有的任务执行一遍至多需要4ms。那么在没有滴答定时器中断帮助的情况下,突发的一个高优先级的任务会打断当前正在运行的低优先级任务吗?
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-9 09:23:34 | 显示全部楼层
特朗姆斯 发表于 2016-5-8 22:04
我有一个疑问

假设systick的中断间隔是10ms,所有的任务执行一遍至多需要4ms。那么在没有滴答定时器中 ...

不会,任务在4ms后执行完毕,必须要调用一个延时 或者等待信号量等可以引起任务调度的函数,若在此之前高优先级任务就绪了则在此之后就会运行此高优先级任务,否则进入空闲任务
我有故事,你有酒吗
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-9 11:26:50 | 显示全部楼层
来俩不甜的 发表于 2016-5-9 09:23
不会,任务在4ms后执行完毕,必须要调用一个延时 或者等待信号量等可以引起任务调度的函数,若在此之前高 ...

那么如果假设当前正在运行的低优先级任务总共需要占用2ms的运行时间,然后这个任务运行到1ms之后高优先级的任务突然来了,是否会打断正在运行的低优先级任务?
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-9 11:35:17 | 显示全部楼层
特朗姆斯 发表于 2016-5-9 11:26
那么如果假设当前正在运行的低优先级任务总共需要占用2ms的运行时间,然后这个任务运行到1ms之后高优先级 ...

要知道任务不会打断任务,除非任务里边进行了能够引起任务调度的操作如延时,或者是中断来了退出中断的时候会进行任务调度
我有故事,你有酒吗
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-9 11:41:58 | 显示全部楼层
来俩不甜的 发表于 2016-5-9 11:35
要知道任务不会打断任务,除非任务里边进行了能够引起任务调度的操作如延时,或者是中断来了退出中断的时 ...

楼主的第二点的意思不就是低优先级任务在运行的时候也会被高优先级任务打断吗
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-9 12:00:18 | 显示全部楼层
特朗姆斯 发表于 2016-5-9 11:41
楼主的第二点的意思不就是低优先级任务在运行的时候也会被高优先级任务打断吗

本质是中断打断,主要是systickhandler,如果systick设为1ms那么只有每ms进行一次调度,如果设为10ms那么就会每10ms进行一次任务调度。如果你的任务在2ms就执行完了,此时高优先级任务就绪,那也要等到8ms后才会执行。并不是高优先级 任务打断了低优先级任务
我有故事,你有酒吗
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-9 12:58:53 | 显示全部楼层
来俩不甜的 发表于 2016-5-9 12:00
本质是中断打断,主要是systickhandler,如果systick设为1ms那么只有每ms进行一次调度,如果设为10ms那么 ...

我之前是像你这么理解的,但是原子哥赞同的是楼主的想法
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-11 14:02:04 | 显示全部楼层
特朗姆斯 发表于 2016-5-9 12:58
我之前是像你这么理解的,但是原子哥赞同的是楼主的想法

再次呼叫一下原子

@正点原子,这种情况下这样理解对吗
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-11 14:11:38 | 显示全部楼层
来俩不甜的 发表于 2016-5-9 12:00
本质是中断打断,主要是systickhandler,如果systick设为1ms那么只有每ms进行一次调度,如果设为10ms那么 ...

原理上是这么理解的,即使高优先级的任务已经就绪了,但是os现在在空闲任务中,还没到调度的时间,空闲任务中没有调度的语句,所以这么看来,若OS是10ms调度一次,那个任务的最大延时时间可以看成是10ms,即10ms后系统才相应任务。


坐等高手解释下。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-11 22:12:53 | 显示全部楼层
特朗姆斯 发表于 2016-5-9 12:58
我之前是像你这么理解的,但是原子哥赞同的是楼主的想法

发现忽略了一个问题啊。任务不会无缘无故的就绪,任务的就绪都会伴随着任务调度。这样楼主位说的就没错了
我有故事,你有酒吗
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 08:56:45 | 显示全部楼层
来俩不甜的 发表于 2016-5-11 22:12
发现忽略了一个问题啊。任务不会无缘无故的就绪,任务的就绪都会伴随着任务调度。这样楼主位说的就没错了 ...

如果高优先级的任务是通过获得信号量来进行,这个信号量由中断给出,恰好中断服务程序的最后没有调用进入系统调度的函数呢?
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2016-5-12 09:11:46 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 08:56
如果高优先级的任务是通过获得信号量来进行,这个信号量由中断给出,恰好中断服务程序的最后没有调用进入 ...

那是你程序写的有问题,那谁知道呢。还是想办法搞明白正确的情况,错误的情况下出现啥问题都奇怪
我有故事,你有酒吗
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 09:18:27 | 显示全部楼层
来俩不甜的 发表于 2016-5-12 09:11
那是你程序写的有问题,那谁知道呢。还是想办法搞明白正确的情况,错误的情况下出现啥问题都奇怪

freertos的中断就可以不用写OSIntExit函数,照样没有问题
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:01:26 | 显示全部楼层
来俩不甜的 发表于 2016-5-11 22:12
发现忽略了一个问题啊。任务不会无缘无故的就绪,任务的就绪都会伴随着任务调度。这样楼主位说的就没错了 ...

嗯,这样理解就对了

高优先级任务不会无缘无故的就绪,哪里就绪了,那里就会有任务的调度的。所以高优先级任务不会延时10ms后才响应的。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:03:57 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 09:18
freertos的中断就可以不用写OSIntExit函数,照样没有问题

中断中根据需要决定是否调用:OSIntExit函数

如果被中断的任务重要的话,就可以不调用这个函数的。我写的Lwip的中断服务中就没调用这个函数。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:07:47 | 显示全部楼层
本帖最后由 特朗姆斯 于 2016-5-12 10:09 编辑
天山狐狸 发表于 2016-5-12 10:03
中断中根据需要决定是否调用:OSIntExit函数

如果被中断的任务重要的话,就可以不调用这个函数的。我 ...

如果不调用OSIntExit函数,中断结束之后理论上就会回到之前保存的现场(也就是低优先级任务被打断的位置)。

但是如果在中断里面释放了高优先级任务的信号量,这个时候就存在究竟是回到低优先级的任务还是进入高优先级的任务的情况,也就是这个帖子所讨论的高优先级任务是否会打断低优先级任务的问题。

ps: 我一直认为我们讨论的应该是这种情况。
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
发表于 2016-5-12 10:11:45 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 09:18
freertos的中断就可以不用写OSIntExit函数,照样没有问题

只有在调度的时候才会任务切换吧,如果时间片没有耗完,systick没有中断,系统没有调度,怎么切换呢?所以我感觉只有在调度的时候才会切换任务,不知道对不对?
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:14:01 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 08:56
如果高优先级的任务是通过获得信号量来进行,这个信号量由中断给出,恰好中断服务程序的最后没有调用进入 ...

这种情况的话,高优先级的任务就有一些延时了。

因为你没有在中断退出时做任务调度,哪里中断了,中断后系统又回原来的那里执行了。所以原来的那个任务的优先级在你看来比这个刚才的高优先级任务的优先级还高。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:14:12 | 显示全部楼层
gangzilife 发表于 2016-5-12 10:11
只有在调度的时候才会任务切换吧,如果时间片没有耗完,systick没有中断,系统没有调度,怎么切换呢?所 ...

你看38楼我描述的情况

如果不出现调度就不能发生任务切换的话,实际理论上高优先级的任务并不能打断低优先级的任务。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:16:20 | 显示全部楼层
天山狐狸 发表于 2016-5-12 10:14
这种情况的话,高优先级的任务就有一些延时了。

因为你没有在中断退出时做任务调度,哪里中断了,中断 ...

这样的话高优先级的任务并不能像中断那样“任性地”打断低优先级任务了

这就好比是NVIC里面,高优先级的任务只是比低优先级任务的“响应优先级“高
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
发表于 2016-5-12 10:17:59 | 显示全部楼层
特朗姆斯 发表于 2016-5-8 22:04
我有一个疑问

假设systick的中断间隔是10ms,所有的任务执行一遍至多需要4ms。那么在没有滴答定时器中 ...

不会吧!都没有调度,高优先级任务怎么抢占的?应该把时间片耗完,才调度的吧!

抢占的意思应该是说假如一个任务需要2ms,但系统1ms调度一次,任务才运行了一半,有可能被其他的任务抢占了CPU吧!
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:18:08 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 10:07
如果不调用OSIntExit函数,中断结束之后理论上就会回到之前保存的现场(也就是低优先级任务被打断的位置 ...

你不调用:OSIntExit函数的话,中断完就回中断前的任务了【假设是低优先级任务】

推荐是中断完再做一次任务调度的,你不调度,你认为的任务优先级就和我40楼说的一样,被中断的任务的优先级要比高优先级任务的优先级还要高这种情况了
回复

使用道具 举报

36

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2015-11-24
在线时间
162 小时
发表于 2016-5-12 10:25:38 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 10:16
这样的话高优先级的任务并不能像中断那样“任性地”打断低优先级任务了

这就好比是NVIC里面,高优先级 ...

我的感觉就是等系统调度,在就绪列表选择高优先级任务运行,不调度,大家该干嘛干嘛
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:25:56 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 10:14
你看38楼我描述的情况

如果不出现调度就不能发生任务切换的话,实际理论上高优先级的任务并不能打断低 ...

是这么理解的。没有任务调度,高优先级的任务肯定不会打断低优先级任务的。

问题的关键是:请看32、36楼。高优先级任务为什么没有运行了让你低优先级的任务运行呢?就是因为高优先级任务在等待某个信号或延时没到,低优先级任务才可以运行。当高优先级任务等待的信号来临时【如post等】,那里肯定会发生一次任务调度,这样高优先级任务马上就运行了。即打断了正在运行的低优先级任务。

总结:只要是满足高优先级任务就绪的那里肯定有任务调度,所以就绪的高优先级任务会马上执行,即它打断了正在运行的低优先级任务。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:27:27 | 显示全部楼层
天山狐狸 发表于 2016-5-12 10:18
你不调用:OSIntExit函数的话,中断完就回中断前的任务了【假设是低优先级任务】

推荐是中断完再做一 ...

我认为中断里面是否加任务调度应当权衡,有些中断里面可能只是作简单计数操作,这种情况就没有必要加调度使得低优先级任务的运行显得很支离破碎。
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:28:47 | 显示全部楼层
gangzilife 发表于 2016-5-12 10:25
我的感觉就是等系统调度,在就绪列表选择高优先级任务运行,不调度,大家该干嘛干嘛

对,就是这个意思
回复

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-5-12 10:31:25 | 显示全部楼层
天山狐狸 发表于 2016-5-12 10:25
是这么理解的。没有任务调度,高优先级的任务肯定不会打断低优先级任务的。

问题的关键是:请看32、36 ...

你这么说非常合理,总结的很到位。

但是如果细抠一下本质(抱歉我这个人比较较真),其实还是因为发生调度而产生的“打断”,和中断的直接”打断“是有区别的。
回复

使用道具 举报

26

主题

186

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-5-30
在线时间
93 小时
 楼主| 发表于 2016-5-12 10:47:31 | 显示全部楼层
特朗姆斯 发表于 2016-5-12 10:16
这样的话高优先级的任务并不能像中断那样“任性地”打断低优先级任务了

这就好比是NVIC里面,高优先级 ...

是的,再高优先级任务的优先级也没有中断的高,中断可以随意、随时打断任何任务而抢先执行。

任务的调度只是人为模拟出中断现象后,让各个任务切换运行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 05:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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