打印
[应用相关]

双任务延时与空闲任务

[复制链接]
575|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在之前我们执行task1与task2函数中用到了延时操作,该延时函数原型就是让CPU一直空转,占用CPU资源。本次我们在任务中更改一种延时操作,且每次该延时执行时会触发空闲任务的执行。

使用特权

评论回复
沙发
dingbo95|  楼主 | 2019-6-20 22:51 | 只看该作者
空闲任务的创建和普通任务的创建一样,使用任务结构体um_os来创建,空闲任务堆栈使用通过的数组来创建。

使用特权

评论回复
板凳
dingbo95|  楼主 | 2019-6-20 22:51 | 只看该作者
需要在任务结构体um_os中添加软延时器变量,用来存储延时的数量。

使用特权

评论回复
地板
dingbo95|  楼主 | 2019-6-20 22:52 | 只看该作者
空闲任务中暂时什么也不做,后面任务1和任务2在执行任务延时切换到空闲任务中来,后面会加以完善,添加钩子函数来统计CPU的利用率,相信这个大家都很感兴趣。

使用特权

评论回复
5
dingbo95|  楼主 | 2019-6-20 22:52 | 只看该作者
在堆栈初始化中,现将DelayTicks 的值初始化为0

使用特权

评论回复
6
dingbo95|  楼主 | 2019-6-20 22:53 | 只看该作者
接着任务和任务列表的初始化,taskTable[0]对应任务1,taskTable[1]对应任务2,taskTable[2]对应着空闲任务。

使用特权

评论回复
7
dingbo95|  楼主 | 2019-6-20 22:53 | 只看该作者
将原先的简单延时delay()函数替换为TaskDelay()函数,在延时过程中可以实现任务调度。

使用特权

评论回复
8
dingbo95|  楼主 | 2019-6-20 22:53 | 只看该作者
将任务1和任务2中的delay()函数用TaskDelay()函数代替。

使用特权

评论回复
9
dingbo95|  楼主 | 2019-6-20 22:54 | 只看该作者
在Systick中断函数中需要对任务列表中的DelayTicks进行判断,大于0时会进行递减操作,根据设置的SysTicks中断触发的时间值对任务进行延时,最后需要调用任务调度器,根据任务中的DelayTicks是否为0进行任务切换。

使用特权

评论回复
10
dingbo95|  楼主 | 2019-6-20 22:54 | 只看该作者
任务调度函数修改如下,大致思路就是判断当前执行的任务是否是空闲任务,如果是空闲任务就会去判断任务1和任务2的DelayTicks值,为0是切换为对应的任务。相反如果当前执行的不是空闲任务,,则去判当前任务的DelayTicks值是否大于0,会执行空闲任务,然后就是判断其它任务,如果其它任务的DelayTicks值为0,就会切换到该任务中。

使用特权

评论回复
11
dingbo95|  楼主 | 2019-6-20 22:54 | 只看该作者
这段代码不香,写的很乱,后面会对其优化,目的只有一个,就是让大家看懂。
//任务调度器
void umTaskSched()
{
   if(currentTask == taskTable[2])//如果当前任务是空闲任务
         {
                         if(taskTable[0]->DelayTicks == 0)//如果任务1的延时完毕
                         {
                                 nextTask = taskTable[0]; //切换到任务1执行
                         }
                         else if(taskTable[1]->DelayTicks == 0)//如果任务2的延时完毕
                         {
                                 nextTask = taskTable[1];  //切换到任务2执行     
                         }
                         else         return;   //否则直接跳出                              
         }
        else
        {
           if(currentTask == taskTable[0])//如果当前任务是任务1
           {
                                if(taskTable[1]->DelayTicks == 0)
                                {
                                        nextTask = taskTable[1];
                                }
                                else if(currentTask->DelayTicks != 0)
                                {
                                        nextTask = taskTable[2];
                                }
                                else return;
          }
          else if(currentTask == taskTable[1])//如果当前任务是任务2
          {
                                if(taskTable[0]->DelayTicks == 0)
                                {
                                        nextTask = taskTable[0];
                                }
                                else if(currentTask->DelayTicks != 0)
                                {
                                        nextTask = taskTable[2];
                                }
                                else return;
          }
        }         
         umTaskSwitch();
}

使用特权

评论回复
12
dingbo95|  楼主 | 2019-6-20 22:55 | 只看该作者
最后,debug全速运行一下,我们来看一下效果,哈哈,不错两个任务已经在同步运行了,要的就是这个效果。

使用特权

评论回复
13
dingbo95|  楼主 | 2019-6-20 22:56 | 只看该作者
看到这个波形,我很激动,终于.........说不出的激动。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

1197

帖子

5

粉丝