1.什么是时间片,他的作用是什么
在UCOSII下,同一优先级下只能有一个任务。在UCOSIII下,同一优先级下可以有多个任务。所以在UCOSIII下引入时间片轮转调度解决相同优先级任务都可以执行的问题。还需要注意的事,我们只需要配置时间片功能,系统即可自动完成调度,不需要用户手动调用函数。配置过程在下面。
2.基本配置过程 。文件os_core.c
void OSSchedRoundRobinCfg (CPU_BOOLEAN en, OS_TICK dflt_time_quanta, OS_ERR *p_err)
这个是配置时间片的函数,第一个参数 打开or关闭,第二个参数是分配给每个任务的时间片时间,第三个参数是保存返回值,记录了错误类型。这个函数在程序中一般都在一个宏定义中:
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif
OS_CFG_SCHED_ROUND_ROBIN_EN 这个宏在os_cfg.h中
#define OS_CFG_SCHED_ROUND_ROBIN_EN 1u /* Include code for Round-Robin scheduling
当我们在os_cfg.h文件中把这个宏定义为1时,UCOSIII会自动把所有和时间片有关的代码包括到所需要的地方去。这个也符合系统可裁剪的规则,其他模块也是这样做的。需要哪个模块则把该模块的宏定义打开。看一下其他模块的宏定义:
#define OS_CFG_APP_HOOKS_EN 1u /* Enable (1) or Disable (0) application specific hooks */ #define OS_CFG_ARG_CHK_EN 1u /* Enable (1) or Disable (0) argument checking */ #define OS_CFG_CALLED_FROM_ISR_CHK_EN 1u /* Enable (1) or Disable (0) check for called from ISR */ #define OS_CFG_DBG_EN 1u /* Enable (1) debug code/variables */ #define OS_CFG_ISR_POST_DEFERRED_EN 1u /* Enable (1) or Disable (0) Deferred ISR posts 通过调度器上锁来访问临界段*/ #define OS_CFG_OBJ_TYPE_CHK_EN 1u /* Enable (1) or Disable (0) object type checking */ #define OS_CFG_TS_EN 1u /* Enable (1) or Disable (0) time stamping */
到目前为止,时间片已经打开了。只要有相同优先级的任务即可完成自动切换。那么每个任务的执行时间或者说时间片的大小怎么设置?
一个时间片的大小为一个系统节拍时间。如果写0的话则 0 means assumes OSCfg_TickRate_Hz / 10. 其中OSCfg_TickRate_Hz=200(可配置)
在哪里给每个任务分配时间片?
在创建任务的时候,OSTaskCreate()函数的OS_TICK参数就是为任务分配时间片的
3.任务1和任务2通过串口发送数据
两个优先级相同的任务通过串口发送数据,任务1发送0123456789,任务2发送9876543210,时间片设置为1
//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<5;i++) {
printf("Task1:0123456789 ");
} 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<5;i++){
printf("Task2:9876543210 ");
} OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s } }
使用时间片时:任务1和任务2会轮换执行,看到现象,互相打断。以后设计任务的时间片时要设置合理点。
不使用时间片时:两个优先级相同的任务也能被执行,任务1执行完了才会执行任务2,不会互相打断
相同优先级的任务按照时间片时间执行,不同优先级的任务不用时间片。
2个相同优先级的任务如果不使用时间片,也能被执行,先被创建的任务先被执行 https://www.firebbs.cn/thread-13154-1-1.html
最新评论