打印

什么是抢占式调度?

[复制链接]
1460|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
什么是抢占式调度?
沙发
huihui520| | 2015-8-26 09:03 | 只看该作者
调度的概念,通俗的说就是系统在多个任务中选择合适的任务执行。 系统如何知道何时该执行哪个任务?可以为每个任务安排一个唯一的优先级别, 当同时有多个任务就绪时, 优先运行优先级较高的任务。

使用特权

评论回复
板凳
zheng522| | 2015-8-26 09:09 | 只看该作者
int Main(void)
{
TargetInit(); //初始化目标板
OSInit(); //初始化操作系统
OSTaskCreate(Task0,&StackTask0[StackSizeTask0 - 1],PrioTask0); // 创建一个任务
Uart_Printf("Ready to start OS\n");
OSStart();  //运行操作系统
return 0; //程序不会运行至此
}
void Task0(void)
{
TargetStart(); //设置中断向量, 启动操作系统的硬件定时器中断
Uart_Printf("Start OS\n");
// 创建其他任务
OSTaskCreate(Task1,&StackTask1[StackSizeTask1 - 1],PrioTask1);
OSTaskCreate(Task2,&StackTask2[StackSizeTask2 - 1],PrioTask2);
OSTaskCreate(Task3,&StackTask3[StackSizeTask2 - 1],PrioTask3);
while(1)
{
Uart_Printf("Task0\n");
OSTimeDly(100); //1 秒运行一次
}
}
void Task1(void)
{
while(1)
{
Uart_Printf("Task1\n");
OSTimeDly(300); //3 秒运行一次
}
}

使用特权

评论回复
地板
zheng522| | 2015-8-26 09:09 | 只看该作者
void Task2(void)
{
while(1)
{
Uart_Printf("Task2\n");
OSTaskSuspend(PrioTask2); // 使自己进入挂起状态
}
}
void Task3(void)
{
while(1)
{
Uart_Printf("Resume Task2\n");
OSTaskResume(PrioTask2); // 恢复任务 2
OSTimeDly(800);
}
}

使用特权

评论回复
5
zheng522| | 2015-8-26 09:09 | 只看该作者
程序中创建了四个任务,任务 0 每 1 秒运行一次, 任务 1 每 3 秒运行一次,任务 2 运行一次即把自己挂起,任务 3 每 8 秒运行一次并把任务 2 恢复。

使用特权

评论回复
6
电子信使| | 2015-8-26 09:50 | 只看该作者
根据任务的截止时间来确定任务的优先级。截止时间愈早,其优先级愈高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序。调度程序在选择任务时,总是选择就绪队列中的第一个任务,为之分配处理机,使之投入运行。
该算法既可以用于抢占式调度,也可用于非抢占式调度方式中。

使用特权

评论回复
7
电子信使| | 2015-8-26 09:51 | 只看该作者
有两个周期性任务,任务A的周期时间为20ms,每个周期处理时间为10ms;任务B的周期时间为50ms,每个周期处理时间为25ms。两个任务的到达时间,最后期限和执行时间如下图:

图片1.png (20.4 KB )

图片1.png

使用特权

评论回复
8
波越| | 2015-8-26 15:46 | 只看该作者
这个用在带操作系统的应用中多一些

使用特权

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

本版积分规则

90

主题

648

帖子

0

粉丝