在学习正点原子视频的时间片轮转调度时,发现一个问题:当设置时间片为2个10ms时串口收到的消息为图1所示,Tsak1输出5次以后(未执行换行)2个时间片用完,Task2开始执行,输出5次后回到Task1继续执行输出换行,输出5次后,Task2开始执行,开始循环。

但是任务1与任务2中都有一个任务调度函数,并且延迟的时间是1S,应该在Task1执行输出换行后发生调度执行任务2输出5次Task2:568789才对啊

//task1任务函数
void task1_task(void *p_arg)
{u8 i,task1_num=0;OS_ERR err;p_arg = p_arg;POINT_COLOR = RED;LCD_ShowString(30,130,110,16,16,"Task1 Run:000");POINT_COLOR = BLUE;while(1){task1_num++;  //任务1执行次数加1 注意task1_num1加到255的时候会清零LCD_ShowxNum(110,130,task1_num,3,16,0x80);   //显示任务执行次数for(i=0;i<5;i++) printf("Task1:01234\r\n");LED0 = ~LED0;OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S}
}//task2任务函数
void task2_task(void *p_arg)
{u8 i,task2_num=0;OS_ERR err;p_arg = p_arg;POINT_COLOR = RED;LCD_ShowString(30,150,110,16,16,"Task2 Run:000");POINT_COLOR = BLUE;while(1){task2_num++;  //任务2执行次数加1 注意task1_num1加到255的时候会清零LCD_ShowxNum(110,150,task2_num,3,16,0x80);  //显示任务执行次数for(i=0;i<5;i++) printf("Task2:56789\r\n");LED1 = ~LED1;OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S}
}

图1

于是对代码做了多次修改,主要是添加了一个TEST函数优先级为4,Task1,Task2分别为5,并不时对任务调度函数做了屏蔽,使串口得到多种输出信息。修改的代码如下,注意将Task1,Task2循环的次数改为了4次。

//task1任务函数
void task1_task(void *p_arg)
{u8 i,task1_num=0;OS_ERR err;p_arg = p_arg;while(1){for(i=0;i<4;i++) printf("Task1:01234\r\n");OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S}
}
//测试任务函数
void test_task(void *p_arg)
{u8 i,task1_num=0;OS_ERR err;p_arg = p_arg;while(1){for(i=0;i<5;i++) printf("TEST\r\n");OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S}
}
///task2任务函数
void task2_task(void *p_arg)
{u8 i,task2_num=0;OS_ERR err;p_arg = p_arg;while(1){for(i=0;i<4;i++) printf("Task2:56789\r\n");OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S}
}

得到结论,时间片轮转调度并不会发生调度点(当使用OS_SchedRoundRobin()函数放弃剩下的时间片时才会产生调度点)。添加TEST函数,Task1,Task2屏蔽OSTimeDlyHMSM()函数,除了开始会输出4次TEST随后在4次01234与4次56789之间来回输出;添加TEST函数,Task1不屏蔽OSTimeDlyHMSM()函数,Task2屏蔽OSTimeDlyHMSM()函数,开始会输出5次TEST,然后是4次01234,然后一直是56789。添加TEST函数,Task1,Task2都不屏蔽OSTimeDlyHMSM()函数,会输出4次TEST,4次01234,4次56789,循环。这都是在时间片长度为3的情况下(即时间足够完成Task1、Task2)

然后改为时间片长度2,并分别在Task1,Task2输出完4次后添加一条

printf("Task1任务切换\r\n");

printf("Task2任务切换\r\n");

语句

添加TEST函数,Task1,Task2都不屏蔽OSTimeDlyHMSM()函数,得到图2的串口信息。

图2

画图解释图2

再画图解释图1

其它的都可以用类似的过程来解释

以上均为自己根据实验所理解的关于时间片轮转调度器,希望大家一起讨论,指正。

正点原子STM32 UCOSiii学习笔记——时间片轮转调度相关推荐

  1. 正点原子STM32——LCD学习笔记(2)

    一:代码设计 lcd.h #include "stdlib.h" //LCD重要参数集 typedef struct { u16 width; //LCD 宽度u16 height ...

  2. 正点原子探索者板学习笔记——最开始的各种奇怪的bug

    安装MDK5(514版)以及1.0.8支持包后出现:"One or more Device Family Pack Devices are not present" 用推荐的&qu ...

  3. 正点原子USMART调试学习笔记(二)

    软件设计 keilkill.bat,是一个批处理文件,双击,可以删除 MDK 编译过程中产生的中间文件, 从而大大减少整个工程所占用的空间,节省硬盘空间,方便传输. 由于 USMART 默认提供了 S ...

  4. RTOS学习笔记--时间片调度

    RTOS学习笔记–时间片调度 本文基于正点原子RTOS开发指南,笔记自用,获取详细信息请关注正点原子官方账号 介绍:在RTOS中,除了按优先级调度之外,还可以按照时间片调度,也就是给每个任务分配一个时 ...

  5. 【正点原子STM32连载】第五十七章 USB读卡器(Slave)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  6. 【正点原子STM32连载】 第六十二章 UCOSII实验2-信号量和邮箱 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  7. 【正点原子STM32连载】第四章 STM32初体验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  8. 正点原子STM32(基于HAL库)3

    目录 高级定时器实验 高级定时器简介 高级定时器输出指定个数PWM 实验 高级定时器输出指定个数PWM原理 TIM1/TIM8 寄存器 硬件设计 课堂源码(输出指定个数PWM灯就闪几次) 程序设计 下 ...

  9. 【正点原子STM32连载】第四十六章 FATFS实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

最新文章

  1. F5刷新以及计算几秒钟的代码
  2. leetcode005 longest_palidrome
  3. MPB:宁大张德民组-对虾养殖系统微生物组样品的采集与制备
  4. 使用PHP Excel类读取和生成excel文件
  5. scala教程之:可见性规则
  6. scrapy 让指定的spider执行指定的pipeline
  7. c语言构造数据类型有,《c语言程序设计基础7构造数据类型.ppt
  8. 计算机直线的绘制实验报告,dda画直线实验报告
  9. C++动态绑定和静态绑定
  10. Android蓝牙A2dp profile的使用
  11. angularjs内置63个指令
  12. linux常见权限相关错误及解决
  13. BarTender数据批量打印软件的入门操作
  14. SQL注入之MYSQL注入
  15. i7 10700和10700f 10700k这三个CPU有什么区别
  16. Webots+ROS学习记录(4)——六轮全地形移动机器人
  17. 各种输入方法总结(C++)
  18. 针对常见的四种短路故障(单相接地短路,两相相间短路,两相接地短路,三相短路),可采取三种方法进行计算
  19. 需求背后程序员的辛酸—(由APP主题颜色随手机壳颜色变化需求带来的思考)
  20. c语言编写录音机思路,python实现网页录音效果

热门文章

  1. CloudSim常见问题
  2. 【axure mac版下载免费版 mac文件已损坏解决】
  3. 解决skype突然无法启动的问题(原创)
  4. 【三维目标检测】FCAF3D(二)
  5. 了解大数据技术原理与应用(复习知识点)
  6. Keil C251V557破解
  7. UE4_拉近拉远控制某一类Actor的显示与隐藏
  8. 【2019杭州集训】12.11训练总结
  9. Socket测试工具(客户端、服务端)
  10. 明年美国韭菜大收割,Uber,Pinterest,Lyft等争相上市