OpenEdv-开源电子网

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

请教一下关于任务调度的问题

[复制链接]

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
发表于 2019-7-12 11:59:07 | 显示全部楼层 |阅读模式
1金钱
以原子哥UCOS例程的的信号量访问共享资源为例,任务1优先级4,任务2优先级5。两个任务都包含一个WHLIE(1)死循环。例程里面每个任务都有延时函数,看教程说是由于延时导致任务切换,我想问的是如果任务中不delay的话优先级低的任务2是否有执行的机会(也就是是否会进行任务切换)?部分代码如下
void task1_task(void *p_arg)
{
        OS_ERR err;
        u8 task1_str[]="First task Running!";
        while(1)
        {
                printf("\r\nèÎÎñ1:\r\n");
                LCD_Fill(0,110,239,319,CYAN);
                OSSemPend(&MY_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);         //ÇëÇóDÅoÅá¿
                memcpy(share_resource,task1_str,sizeof(task1_str)); //Ïò12Ïí×êÔ′Çø¿½±′êy¾Y
                delay_ms(200);
                printf("%s\r\n",share_resource);        //′®¿úêä3ö12Ïí×êÔ′Çøêy¾Y       
                OSSemPost (&MY_SEM,OS_OPT_POST_1,&err);                                //·¢ËíDÅoÅá¿
                LED0=!LED0;
                OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //Ñóê±1s
        }
}

最佳答案

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

兄台客气了,指正不敢当,我技术较差,大家一起学习讨论,以下是我的理解。 我认为,一旦打开软件定时器的话,是会进行任务调度的。 我们OSTmrCreate并且OSTmrStart一个软件定时器后,实际上执行Callback Function的任务是OSTmr_Task,这个任务中有OSSemPend(OSTmrSemSignal, 0u, &err); 一直在等待着OSTmrSemSignal这个信号,这个信号由硬件定时器定时post(在OSTimeTickHook中),具体频率跟硬件定时器的频率和分频有关 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2019-7-12 11:59:08 | 显示全部楼层
dd777 发表于 2019-7-19 14:22
谢谢兄弟的回复!以我目前对UCOS的理解:是等待某一事件发生的过程中由于当前任务实际上没有进行任何操作 ...

兄台客气了,指正不敢当,我技术较差,大家一起学习讨论,以下是我的理解。

我认为,一旦打开软件定时器的话,是会进行任务调度的。

我们OSTmrCreate并且OSTmrStart一个软件定时器后,实际上执行Callback Function的任务是OSTmr_Task,这个任务中有OSSemPend(OSTmrSemSignal, 0u, &err); 一直在等待着OSTmrSemSignal这个信号,这个信号由硬件定时器定时post(在OSTimeTickHook中),具体频率跟硬件定时器的频率和分频有关。

如果OSTmr_Task中的OSSemPend没有pend到OSTmrSemSignal,OSTmr_Task自然就被阻塞了,然后进行了任务调度。

我手头的ucos代码是2.91版本,版本不同可能代码会有差异。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-7-13 02:55:31 | 显示全部楼层
帮顶
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-7-13 11:40:59 | 显示全部楼层

谢谢原子哥。昨天又看了看教程,说到延时或者等待事件会引发任务调度,那软件定时器等待到时的时间内会引发任务调度吗?
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2019-7-19 12:25:26 | 显示全部楼层
真正进行任务调度的是函数OS_Sched();(实际上是asm文件中的OSCtxSw函数),楼主如果想知道一个函数是否进行上下文切换,只需要在这个函数中寻找是否有OS_Sched();即可。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-7-19 14:22:23 | 显示全部楼层
东北小辉辉 发表于 2019-7-19 12:25
真正进行任务调度的是函数OS_Sched();(实际上是asm文件中的OSCtxSw函数),楼主如果想知道一个函数是否进 ...

谢谢兄弟的回复!以我目前对UCOS的理解:是等待某一事件发生的过程中由于当前任务实际上没有进行任何操作,所以会由内核自动调用OS_Sched()函数来进行任务调度。这里的等待某一时间发生包括delay和任务间通信需要等待的事件比如信号量、邮箱等。目前不知道如果是一个任务中有软件定时器的话在等待到时的时间内会引发任务调度吗?
PS:一般在任务中好像不会直接调用有关OS_Sched()的函数吧?个人理解如有不对请指正。
回复

使用道具 举报

17

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2019-1-18
在线时间
67 小时
 楼主| 发表于 2019-7-22 09:24:41 | 显示全部楼层
东北小辉辉 发表于 2019-7-19 17:49
兄台客气了,指正不敢当,我技术较差,大家一起学习讨论,以下是我的理解。

我认为,一旦打开软件定时 ...

学习学习,大概明白了,谢谢小辉辉啦
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-8-28 14:06:58 | 显示全部楼层
东北小辉辉 发表于 2019-7-12 11:59
兄台客气了,指正不敢当,我技术较差,大家一起学习讨论,以下是我的理解。

我认为,一旦打开软件定时 ...

看简介背景兄台是从硬件切到软件道路来的:半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java   厉害!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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