本帖最后由 lpfdewo 于 2020-3-12 09:26 编辑
我在设置时间片轮转调度后,任务1和任务2都只执行了一次,和UCOS开发手册上的例程效果不同,而且注释了时间片轮转调度的代码后也还是可以执行
- #include "BSP_ALL.h"
- //任务优先级
- #define START_TASK_PRIO 3
- //任务堆栈大小
- #define START_STK_SIZE 512
- //#define START_STK_SIZE 128
- //任务控制块
- OS_TCB StartTaskTCB;
- //任务堆栈
- CPU_STK START_TASK_STK[START_STK_SIZE];
- //任务函数
- void start_task(void *p_arg);
- #define TASK1_TASK_PRIO 8
- #define TASK1_STK_SIZE 64
- OS_TCB TASK1_TaskTCB;
- CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
- void task1_task(void *p_arg);
- #define TASK2_TASK_PRIO 8
- #define TASK2_STK_SIZE 64
- OS_TCB TASK2_TaskTCB;
- CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
- void task2_task(void *p_arg);
- int main(void)
- {
- OS_ERR err;
- CPU_SR_ALLOC();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- INTX_DISABLE();//关中断,防止滴答定时器对外设初始化的打扰
- BSP_Init();
- INTX_ENABLE();//开中断
- OSInit(&err);//初始化UCOSIII
- OS_CRITICAL_ENTER();//进入临界区
-
- OSTaskCreate(
- (OS_TCB *)&StartTaskTCB,//任务控制块
- (CPU_CHAR *)"start task",//任务名字
- (OS_TASK_PTR)start_task,//任务函数
- (void *)0,//传递给任务函数的参数
- (OS_PRIO)START_TASK_PRIO,//任务优先级
- (CPU_STK *)&START_TASK_STK[0],//任务堆栈基地址
- (CPU_STK_SIZE)START_STK_SIZE/10,//任务堆栈深度限位
- (CPU_STK_SIZE)START_STK_SIZE,//任务堆栈大小
- (OS_MSG_QTY)0,//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
- (OS_TICK)0,//当使能时间片轮转时的时间片长度,为0时为默认长度
- (void *)0,//用户补充的存储区
- (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR *)&err//存放该函数错误时的返回值
- );
- OS_CRITICAL_EXIT();//退出临界区
- OSStart(&err);//开启UCOSIII
-
- while(1){
- }
- }
- void start_task(void *p_arg){
- OS_ERR err;
- CPU_SR_ALLOC();
- p_arg=p_arg;
-
- CPU_Init();
- #if OS_CFG_STAT_TASK_EN>0u
- OSStatTaskCPUUsageInit(&err);
- #endif
-
- #ifdef CPU_CFG_INT_DIS_MEAS_EN
- CPU_IntDisMeasMaxCurReset();
- #endif
-
- #if OS_CFG_SCHED_ROUND_ROBIN_EN
- OSSchedRoundRobinCfg(DEF_ENABLED, 1, &err);
- #endif
-
- OS_CRITICAL_ENTER();
-
- OSTaskCreate(
- (OS_TCB *)&TASK1_TaskTCB,
- (CPU_CHAR *)"task1 task",
- (OS_TASK_PTR)task1_task,
- (void *)0,
- (OS_PRIO)TASK1_TASK_PRIO,
- (CPU_STK *)&TASK1_TASK_STK[0],
- (CPU_STK_SIZE)TASK1_STK_SIZE/10,
- (CPU_STK_SIZE)TASK1_STK_SIZE,
- (OS_MSG_QTY)0,
- (OS_TICK)3,
- (void *)0,
- (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR *)&err
- );
-
- OSTaskCreate(
- (OS_TCB *)&TASK2_TaskTCB,
- (CPU_CHAR *)"task2 task",
- (OS_TASK_PTR)task2_task,
- (void *)0,
- (OS_PRIO)TASK2_TASK_PRIO,
- (CPU_STK *)&TASK2_TASK_STK[0],
- (CPU_STK_SIZE)TASK2_STK_SIZE/10,
- (CPU_STK_SIZE)TASK2_STK_SIZE,
- (OS_MSG_QTY)0,
- (OS_TICK)3,
- (void *)0,
- (OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
- (OS_ERR *)&err
- );
- OS_CRITICAL_EXIT();//进入临界区
- OSTaskDel((OS_TCB *)0,&err);
- }
- void task1_task(void *p_arg){
- u8 task1_num=0,i;
- OS_ERR err;
-
- CPU_SR_ALLOC();
- p_arg=p_arg;
-
- POINT_COLOR=RED;
- OS_CRITICAL_ENTER();
- POINT_COLOR=BLUE;
- LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
- OS_CRITICAL_EXIT();
- while(1){
- task1_num++;
- LED0=~LED0;
- printf("Mission Task1 is completed:%d tims\r\n",task1_num);
- for(i=0;i<5;i++) printf("Task1:56789\r\n");
- LCD_ShowxNum(86,111,task1_num,3,16,0x80);
- OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
- }
- }
- void task2_task(void *p_arg){
- u8 task2_num=0,i;
- OS_ERR err;
-
- CPU_SR_ALLOC();
- p_arg=p_arg;
-
- POINT_COLOR=RED;
- OS_CRITICAL_ENTER();
- POINT_COLOR=BLUE;
- LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
- OS_CRITICAL_EXIT();
- while(1){
- task2_num++;
- LED1=~LED1;
- printf("Mission Task2 is completed:%d tims\r\n",task2_num);
- LCD_ShowxNum(206,111,task2_num,3,16,0x80);
- for(i=0;i<5;i++) printf("Task2:01234\r\n");
- OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
- }
- }
复制代码- void BSP_Init(void){
- uart_init(115200);
- delay_init(168);
- LED_Init();
- LCD_Init();
-
- POINT_COLOR = RED;
- LCD_ShowString(30,10,200,16,16,"Explorer STM32F4");
- LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 6-1");
- LCD_ShowString(30,50,200,16,16,"Task Creat and Del");
- LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
- LCD_ShowString(30,90,200,16,16,"2014/11/25");
-
- }
复制代码
输出的结果都是一样的,只运行了一次:
|