合作式调度器实验

在安富莱STM32-V5开发板系统篇手册中,对简单的调度器进行介绍。由于最近在学习使用uC/OS,对任务的调度比较感兴趣,为此参照该资料进行了实验,验证文章中的观点。

以下是合作式调度器的特性,与最常见的前后台程序有很大相似。

1、合作式调度器提供了一种单任务的的系统结构
操作:
2、在特定的时刻被调度运行(以周期性或者单次方式)
3、当任务需要运行的时候,被添加到等待队列。
4、当CPU空闲的时候,运行等待队列中的下一个(如果有的话)。
5、任务运行直到完成,然后由调度器来控制。

该资料整理出这种调度器的缺陷有:1、只有一个中断;2、任务运行重叠;3、任务不能超时。


合作式调度器可以由简单的代码来实现,主要分为三个部分:1、刷新函数;2、添加任务函数;3、调度函数。其中,只需将调度函数放入main函数的while循环中,刷新函数放入定时中断的处理函数中即可。当然,在进入while循环之前需要初始化定时中断,添加自己想添加的任务。以下是代码部分:

主函数:

int main(void)
{
        /*UART Config 115200 8-N-1*/
UartConfig();
SystemTick_Init();
LED_Init();
KeyConfig();
        SCH_AddTask(Task1, 0, 1000);                    /*task 1*/
SCH_AddTask(Task2, 300, 1000);               /*task 2*/
SCH_AddTask(Task3, 500, 1000);               /*task 3*/
printf("Scheduler init work is done!\r\n");

LedGoOn(LED_A4);
LedGoOn(LED_B5);


        /* Infinite loop */
       while (1)
       {
            SCH_Scheduler();
       }
}


刷新函数:

void SCH_Update(void)
{
uint8_t index;

for(index =0; index < SCH_MAX_TASKS; index++)
{
if(MyTask[index].pTask)
{
if(MyTask[index].Delay == 0)
{
MyTask[index].RunMe += 1;

if(MyTask[index].Period)
{
MyTask[index].Delay = MyTask[index].Period;
}
}
else
{
MyTask[index].Delay -= 1;
}
}
}
}

调度函数:

void SCH_Scheduler(void)
{
uint8_t index;

for(index = 0; index < SCH_MAX_TASKS; index++)
{
if(MyTask[index].RunMe > 0)
{
(*MyTask[index].pTask)();
MyTask[index].RunMe -= 1;

if(MyTask[index].Period == 0)
{
SCH_DeleteTask(index);
}
}
}
}

以及添加任务和删除任务函数:

uint8_t SCH_AddTask(void (*pFunction)(void), uint32_t delay, uint32_t period)
{
uint8_t index = 0;

while((MyTask[index].pTask != 0) && (index < SCH_MAX_TASKS))
{
index++;
}

if(index == SCH_MAX_TASKS)
{
Err = ERROR_TOO_MANY_TASKS;
return SCH_MAX_TASKS;
}

MyTask[index].pTask = pFunction;
MyTask[index].Delay = delay;
MyTask[index].Period = period;
MyTask[index].RunMe = 0;

return index;
}


void SCH_DeleteTask(uint8_t index)
{
MyTask[index].pTask = NULL;
MyTask[index].Delay = 0;
MyTask[index].Period = 0;
MyTask[index].RunMe = 0;
}

以上几个函数就可以完成这个调度器的设计。不过正如资料所说,这个调度器不可避免的需要正视只有一个中断、任务执行叠加等问题。对于只需要同一时刻进行一个任务处理的情况,该调度器还是不错的选择。合作式调度器代码简单,程序本质上可预测,安全而且可靠。但是只适合简单的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值