OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3096|回复: 2

UCOSIII时间片轮转调度的效果什么样的?

[复制链接]

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-3-29
在线时间
39 小时
发表于 2020-3-12 09:23:16 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 lpfdewo 于 2020-3-12 09:26 编辑

我在设置时间片轮转调度后,任务1和任务2都只执行了一次,和UCOS开发手册上的例程效果不同,而且注释了时间片轮转调度的代码后也还是可以执行

  1. #include "BSP_ALL.h"

  2. //任务优先级
  3. #define START_TASK_PRIO                3
  4. //任务堆栈大小
  5. #define START_STK_SIZE                512
  6. //#define START_STK_SIZE                128
  7. //任务控制块
  8. OS_TCB StartTaskTCB;
  9. //任务堆栈
  10. CPU_STK START_TASK_STK[START_STK_SIZE];
  11. //任务函数
  12. void start_task(void *p_arg);

  13. #define TASK1_TASK_PRIO                8
  14. #define TASK1_STK_SIZE                64
  15. OS_TCB TASK1_TaskTCB;
  16. CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
  17. void task1_task(void *p_arg);

  18. #define TASK2_TASK_PRIO                8
  19. #define TASK2_STK_SIZE                64
  20. OS_TCB TASK2_TaskTCB;
  21. CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
  22. void task2_task(void *p_arg);

  23. int main(void)
  24. {
  25.         OS_ERR err;
  26.         CPU_SR_ALLOC();
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  28.         INTX_DISABLE();//关中断,防止滴答定时器对外设初始化的打扰
  29.         BSP_Init();
  30.         INTX_ENABLE();//开中断
  31.         OSInit(&err);//初始化UCOSIII
  32.         OS_CRITICAL_ENTER();//进入临界区
  33.         
  34.         OSTaskCreate(
  35.                 (OS_TCB *)&StartTaskTCB,//任务控制块
  36.                 (CPU_CHAR *)"start task",//任务名字
  37.                 (OS_TASK_PTR)start_task,//任务函数
  38.                 (void *)0,//传递给任务函数的参数
  39.                 (OS_PRIO)START_TASK_PRIO,//任务优先级
  40.                 (CPU_STK *)&START_TASK_STK[0],//任务堆栈基地址
  41.                 (CPU_STK_SIZE)START_STK_SIZE/10,//任务堆栈深度限位
  42.                 (CPU_STK_SIZE)START_STK_SIZE,//任务堆栈大小
  43.                 (OS_MSG_QTY)0,//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
  44.                 (OS_TICK)0,//当使能时间片轮转时的时间片长度,为0时为默认长度
  45.                 (void *)0,//用户补充的存储区
  46.                 (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  47.                 (OS_ERR *)&err//存放该函数错误时的返回值
  48.         );
  49.         OS_CRITICAL_EXIT();//退出临界区
  50.         OSStart(&err);//开启UCOSIII
  51.                
  52.         while(1){
  53.         }
  54. }

  55. void start_task(void *p_arg){
  56.         OS_ERR err;
  57.         CPU_SR_ALLOC();
  58.         p_arg=p_arg;
  59.         
  60.         CPU_Init();
  61. #if OS_CFG_STAT_TASK_EN>0u
  62.         OSStatTaskCPUUsageInit(&err);
  63. #endif
  64.         
  65. #ifdef CPU_CFG_INT_DIS_MEAS_EN
  66.         CPU_IntDisMeasMaxCurReset();
  67. #endif
  68.         
  69. #if OS_CFG_SCHED_ROUND_ROBIN_EN
  70. OSSchedRoundRobinCfg(DEF_ENABLED, 1, &err);
  71. #endif        
  72.         
  73.         OS_CRITICAL_ENTER();
  74.         
  75.         OSTaskCreate(
  76.                 (OS_TCB *)&TASK1_TaskTCB,
  77.                 (CPU_CHAR *)"task1 task",
  78.                 (OS_TASK_PTR)task1_task,
  79.                 (void *)0,
  80.                 (OS_PRIO)TASK1_TASK_PRIO,
  81.                 (CPU_STK *)&TASK1_TASK_STK[0],
  82.                 (CPU_STK_SIZE)TASK1_STK_SIZE/10,
  83.                 (CPU_STK_SIZE)TASK1_STK_SIZE,
  84.                 (OS_MSG_QTY)0,
  85.                 (OS_TICK)3,
  86.                 (void *)0,
  87.                 (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  88.                 (OS_ERR *)&err
  89.         );
  90.                
  91.         OSTaskCreate(
  92.                 (OS_TCB *)&TASK2_TaskTCB,
  93.                 (CPU_CHAR *)"task2 task",
  94.                 (OS_TASK_PTR)task2_task,
  95.                 (void *)0,
  96.                 (OS_PRIO)TASK2_TASK_PRIO,
  97.                 (CPU_STK *)&TASK2_TASK_STK[0],
  98.                 (CPU_STK_SIZE)TASK2_STK_SIZE/10,
  99.                 (CPU_STK_SIZE)TASK2_STK_SIZE,
  100.                 (OS_MSG_QTY)0,
  101.                 (OS_TICK)3,
  102.                 (void *)0,
  103.                 (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  104.                 (OS_ERR *)&err
  105.         );

  106.         OS_CRITICAL_EXIT();//进入临界区
  107.         OSTaskDel((OS_TCB *)0,&err);
  108. }

  109. void task1_task(void *p_arg){
  110.         u8 task1_num=0,i;
  111.         OS_ERR err;
  112.         
  113.         CPU_SR_ALLOC();
  114.         p_arg=p_arg;
  115.         
  116.         POINT_COLOR=RED;
  117.         OS_CRITICAL_ENTER();

  118.         POINT_COLOR=BLUE;
  119.         LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  120.         OS_CRITICAL_EXIT();
  121.         while(1){
  122.                 task1_num++;
  123.                 LED0=~LED0;
  124.                 printf("Mission Task1 is completed:%d tims\r\n",task1_num);
  125.                 for(i=0;i<5;i++)        printf("Task1:56789\r\n");

  126.                 LCD_ShowxNum(86,111,task1_num,3,16,0x80);
  127.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
  128.         }
  129. }

  130. void task2_task(void *p_arg){
  131.         u8 task2_num=0,i;
  132.         OS_ERR err;
  133.         
  134.         CPU_SR_ALLOC();
  135.         p_arg=p_arg;
  136.         
  137.         POINT_COLOR=RED;
  138.         OS_CRITICAL_ENTER();

  139.         POINT_COLOR=BLUE;
  140.         LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  141.         OS_CRITICAL_EXIT();
  142.         while(1){
  143.                 task2_num++;
  144.                 LED1=~LED1;
  145.                 printf("Mission Task2 is completed:%d tims\r\n",task2_num);
  146.                 LCD_ShowxNum(206,111,task2_num,3,16,0x80);

  147.                 for(i=0;i<5;i++)        printf("Task2:01234\r\n");
  148.                 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
  149.         }
  150. }

复制代码
  1. void BSP_Init(void){
  2.         uart_init(115200);
  3.         delay_init(168);
  4.         LED_Init();
  5.         LCD_Init();
  6.        
  7.         POINT_COLOR = RED;
  8.         LCD_ShowString(30,10,200,16,16,"Explorer STM32F4");       
  9.         LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-1");
  10.         LCD_ShowString(30,50,200,16,16,"Task Creat and Del");
  11.         LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
  12.         LCD_ShowString(30,90,200,16,16,"2014/11/25");
  13.        
  14. }
复制代码





输出的结果都是一样的,只运行了一次:
2020-03-12_092133.png


最佳答案

查看完整内容[请看2#楼]

找到原因了,把这个使能给去掉就可以正常运行了 使能统计任务后所有任务好像就只执行一次,取消使能后就可以正常轮转和运行了,然后这个如果带进去的话,是默认使能的要自己取消
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-3-29
在线时间
39 小时
 楼主| 发表于 2020-3-12 09:23:17 | 显示全部楼层
找到原因了,把这个使能给去掉就可以正常运行了
  1. #if OS_CFG_STAT_TASK_EN>0u
  2.         OSStatTaskCPUUsageInit(&err);
  3. #endif
复制代码


使能统计任务后所有任务好像就只执行一次,取消使能后就可以正常轮转和运行了,然后这个如果带进去的话,是默认使能的要自己取消
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-3-29
在线时间
39 小时
 楼主| 发表于 2020-3-12 09:24:15 | 显示全部楼层
#if OS_CFG_SCHED_ROUND_ROBIN_EN
OSSchedRoundRobinCfg(DEF_ENABLED, 1, &err);
#endif      

这段代码注释了后还是可以运行,运行结果和上面不变
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-4 06:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表