VxWorks Ucos-II 实时性对比问题

来源:互联网 发布:sybase数据库日志查看 编辑:程序博客网 时间:2024/05/16 06:33



VxWorks的Wind微内核基于优先级抢占调度和时间片轮询。
uCOS II内核调度特点: 只支持基于优先级的抢占式调度算法,不支持时间片轮训;


usosII遇到任务具有相同优先级时


http://hi.baidu.com/sofeng/item/32e17c3d7e62d35b81f1a7e5

当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;
}


原创粉丝点击