当RTOS发现多个任务具有相同优先级时,会采用两种措施:1、向用户报错。2、对相同优先级的任务进行基于时间片的调度。us/os采用的是第一种方法,当遇到多个任务具有相同优先级时会返回一个错误代码函数:alt_ucosii_check_return_code(return_code);
同时解析这个错误代码,并打印出详细信息。如以下程序:当然这个没有错误了。第个任务中都有上面的函数代码。
/********************************************************************
* 文 件 名:main.c
* 功 能:调用MicroC/OS-II系统服务,实现任务创建、调度和删除。
* 使用MicroC/OS-II时间服务,实现延时和系统时间获取。
* 说 明:观察信息窗口中由jtag_uart输出的信息。
********************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "includes.h" /*步骤1:MicroC/OS-II总头文件 */
#include "alt_ucosii_simple_error_check.h" /* 错误处理软件模块 */
#define TASK_STACKSIZE 2048 /* 步骤2:定义任务栈大小 */
/*步骤2:定义各任务任务栈 */
OS_STK initialize_task_stk[TASK_STACKSIZE];
OS_STK print_task1_stk[TASK_STACKSIZE];
OS_STK print_task2_stk[TASK_STACKSIZE];
OS_STK print_task3_stk[TASK_STACKSIZE];
OS_STK sys_info_task_stk[TASK_STACKSIZE];
/*步骤3:分配各任务优先级 */
#define INITIALIZE_TASK_PRIORITY 6
#define PRINT_TASK1_PRIORITY 7
#define PRINT_TASK2_PRIORITY 8
#define PRINT_TASK3_PRIORITY 9
#define SYS_INFO_TASK_PRIORITY 10
int initCreateTasks(void);
/*步骤4:实现任务功能 */
void initialize_task(void* pdata)
{
INT8U return_code = OS_NO_ERR;
/* 创建任务 */
initCreateTasks();
/*完成用户功能后自我删除 */
return_code = OSTaskDel(OS_PRIO_SELF); /* 调用系统服务:删除任务 */
alt_ucosii_check_return_code(return_code);
while (1);
}
/* 打印任务1:每.500毫秒打印一次系统时间系统 */
void PrintTask1(void* pdata)
{
while(1)
{
printf("Time infomation from Task1:\n");
printf("System Time is %ld\n",OSTimeGet());
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
/* 打印任务2:每250毫秒打印一次系统时间系统 */
void PrintTask2(void* pdata)
{
while(1)
{
printf("Time infomation from Task2:\n");
printf("System Time is %ld\n",OSTimeGet());
OSTimeDlyHMSM(0, 0, 0, 250);
}
}
/* 打印任务3:每125毫秒打印一次系统时间系统 */
void PrintTask3(void* pdata)
{
while(1)
{
printf("Time infomation from Task3:\n");
printf("System Time is %ld\n",OSTimeGet());
OSTimeDlyHMSM(0, 0, 0, 125);
}
}
/* 系统信息任务:每秒打印一次CPU利用率 */
void SysInfoTask(void* pdata)
{
while(1)
{
printf("The CPU Usage is %d\n",OSCPUUsage);
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
/*步骤5:在任务运行前,需要创建任务并向系统注册 */
int initCreateTasks(void)
{
INT8U return_code = OS_NO_ERR;
return_code = OSTaskCreateExt(PrintTask1,
NULL,
(void *)&print_task1_stk[TASK_STACKSIZE],
PRINT_TASK1_PRIORITY,
PRINT_TASK1_PRIORITY,
print_task1_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
return_code = OSTaskCreateExt(PrintTask2,
NULL,
(void *)&print_task2_stk[TASK_STACKSIZE],
PRINT_TASK2_PRIORITY,
PRINT_TASK2_PRIORITY,
print_task2_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
return_code = OSTaskCreateExt(PrintTask3,
NULL,
(void *)&print_task3_stk[TASK_STACKSIZE],
PRINT_TASK3_PRIORITY,
PRINT_TASK3_PRIORITY,
print_task3_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
return_code = OSTaskCreateExt(SysInfoTask,
NULL,
(void *)&sys_info_task_stk[TASK_STACKSIZE],
SYS_INFO_TASK_PRIORITY,
SYS_INFO_TASK_PRIORITY,
sys_info_task_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
return 0;
}
int main (int argc, char* argv[], char* envp[])
{
INT8U return_code = OS_NO_ERR;
/* 创建父任务,由父任务创建其它任务 */
return_code = OSTaskCreateExt(initialize_task,
NULL,
(void *)&initialize_task_stk[TASK_STACKSIZE],
INITIALIZE_TASK_PRIORITY,
INITIALIZE_TASK_PRIORITY,
initialize_task_stk,
TASK_STACKSIZE,
NULL,
0);
alt_ucosii_check_return_code(return_code);
OSStart(); /*步骤6:调用OSStart()启动MicroC/OS-II */
return 0;
}