RTOS快速入门--uc/os II

2019-07-13 04:20发布

UC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。 UClinux是一种优秀的嵌入式Linux版本。uClinux是Micro-Conrol-Linux的缩写。同标准Linux相比,它集成了标准Linux操作系统的稳定性、强大网络功能和出 {MOD}的文件系统等主要优点。但是由于没有MMU(内存管理单元),其多任务的实现需要一定技巧。 万事入门难,入门之后就好办了

意义

随着电子产品和设备的应用的复杂化和智能化,原来在电子产品中占统治地位的单片机和较简单的程序结构已经难以满足要求。加之微处理器芯片本身性 能的大幅提高,对软件的要求也随之提高,而实时操作系统(Real Time Operation System,以下简称为RTOS)很好满足了这些需 求 原来一直用单片机,06年才开始接触ARM。开始一直是用前后台的编程方法,顺序执行,感觉也挺好,但是程序任务多了以后,调试比较麻烦。在网上查查资料,看大家都在用ucos,也就尝试着用。

区别

以往是顺序执行,中断处理,状态机 工作核心原理是: 让最高优先级的任务处于运行状态。 这需要操作系统在某个时间得运行任务调度的一个算法(操作系统提供了这个函数),她将自动完成调度运算并完成任务的切换。 调度操作在下面情况中将被运行:调用api函数(用户主动调度),中断(系统、用户的)

Ucos

免费,VxWorks收费 ucos ii和大家所熟知的Linux等分时操作系统不同,它不支持时间片轮转法。ucos ii是一个基于优先级的实时操作系统,每个任务的优 先级必须不同,分析它的源码会发现,ucos ii把任务的优先级当做任务的标识来使用,如果优先级相同,任务将无法区分。进入就绪态的优先级最高的任务 首先得到CPU的使用权,只有等它交出CPU的使用权后,其他任务才可以被执行。所以它只能说是多任务,不能说是多进程,至少不是我们所熟悉的那种多进 程。显而易见,如果只考虑实时性,它当然比分时系统好,它可以保证重要任务总是优先占有CPU。但是在系统中,重要任务毕竟是有限的,这就使得划分其他任 务的优先权变成了一个让人费神的问题。另外,有些任务交替执行反而对用户更有利。例如,用单片机控制两小块显示屏时,无论是编程者还是使用者肯定希望它们 同时工作,而不是显示完一块显示屏的信息以后再显示另一块显示屏的信息。这时候,要是ucos ii即支持优先级法又支持时间片轮转法就更合适了。 在单片机系统中嵌入ucos ii将增强系统的可靠性,并使得调试程序变得简单。以往传统的单片机开发工作中经常遇到程序跑飞或是陷入死循环。可以 用看门狗解决程序跑飞问题,而对于后一种情况,尤其是其中牵扯到复杂数学计算的话,只有设置断点,耗费大量时间来慢慢分析。如果在系统中嵌 入 ucos ii的话,事情就简单多了。可以把整个程序分成许多任务,每个任务相对独立,然后在每个任务中设置超时函数,时间用完以后,任务必须交 出 CPU的使用权。即使一个任务发生问题,也不会影响其他任务的运行。这样既提高了系统的可靠性,同时也使得调试程序变得容易。 在单片机系统中嵌入ucos ii将增加系统的开销。由于每建立一个任务,都要产生一个与之相对应的数据结构TCB,该数据结构要占用很大一部分内存空间。所以在定义最大任务数时,一定要考虑实际情况的需要 和其他一些著名的嵌入式操作系统不同,ucos ii在单片机系统中的启动过程比较简单,不像有些操作系统那样,需要把内核编译成一个映像文件写入 ROM中,上电复位后,再从ROM中把文件加载到RAM中去,然后再运行应用程序。ucos ii的内核是和应用程序放在一起编译成一个文件的,使用者只 需要把这个文件转换成HEX格式,写入ROM中就可以了,上电后,会像普通的单片机程序一样运行。 当然,是否在单片机系统中嵌入ucos ii应视所开发的项目而定,对于一些简单的、低成本的项目来说,就没必要使用嵌入式操作系统了。 Ucos 51上都适合 μC/OS-Ⅱ是基于μC/OS的,μC/OS自1992年以来已经有好几百个商业应用。μC/OS-Ⅱ与μC/OS的内核是一样的,只不过提供了更多的功能。 也有人直接在PC上移植,参uCOS-II中文手册:“笔者选择 PC 做为目标系统是由于以下几个原因:首先也是最为重要的,以PC做为目标系统 比起以其他嵌入式环境,如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写 EPROM,不断地向 EPROM 仿真器中下载程序等等。用户只需 要简单地编译、链接和执行”

所需

ucos pic18 51 要把uC/OS II成功地移植到某一处理器上.该处理器必须满足以下要求: 处理器的C编译器能产生可重入代码。
用C语言就可以打开和关闭中断。
处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
而Microchip PIC18F452的体系结构可以满足移植uC/OS II的硬件需求.同时Microchip提供的C18编译器也能满足移植的需要。

一步步实践

经过一番查找,我得到了5个版本。其中3个是用KEIL编译的。本来我想直接把OS代码嵌到应用程序中,但后来发现没有一个可以直接使用。有的无法 用KEIL直接编译,有的需要修改DLL在软件仿真下使用。而我需要的是能在串口输入输出,不需要修改任何无关软件,能在软件仿真和硬件上运行的实时多任 务操作系统。没有办法,我只好硬着头皮去改编。 没那么复杂啊 把那三个CPU文件移植后,照书本自检测一下,开几个任务就可以了。 我是第一天买了书,第二天移植到2132,第二天晚上跑了ADC和串口两个任务。很EASY啊 关键要看你功夫到不到家 就在某一天,总之基本上没看uCOS2那本书,只是随便翻了翻,突然顿悟,原来就是这样啊,就在那一刻,我会用uCOS2了,其实用一个移植好的uCOS2和用一个头文件里的程序没多大区别 关键是你是否编过操作系统中用的最广泛知识的程序 在Window上,推荐大家用RealView+Proteus学习UCOS 在Linux下,推荐大家使用Skyeye学习 个人认为自上向下的学习方法不错,先看例子,看API,再在PC上先跑一跑,然后看移植方法,自己移植一个。然后在以后的应用中,感觉哪一块重要,再去读源码!如果一上来直接读源码,你会发现,源码确实很好懂,不过读后感觉还是不太会用!!

uC/OS II在Microchip MCU上的移植

uC/OS II是一个完整的、可移植、可裁减、源码公开的抢占式实时多任务操作系统。因此程序开发人员可以在嵌入式系统的开发过程中.灵活地改写其源代码.以满足用 户特定的需求。PIC18F452是Microchip公司生产的单片机PICmicro家族中的中档微处理器产品.是一款含有丰富片上资源的8位 MCU.广泛应用在家用电器、医疗设备、工业控制等领域。因此uC/OS II在该处理器上的成功移植.将大大提高复杂应用系统的开发效率.增强系统的可靠性,降低开发成本,提高经济效益。 1 uC/OS II移植方法
1.1 uC/OS II成功移植的条件
要把uC/OS II成功地移植到某一处理器上.该处理器必须满足以下要求: 处理器的C编译器能产生可重入代码。
用C语言就可以打开和关闭中断。
处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
而Microchip PIC18F452的体系结构可以满足移植uC/OS II的硬件需求.同时Microchip提供的C18编译器也能满足移植的需要。 1.2 uC/OS II移植的相关工作
uC/OS II的移植工作主要涉及与处理器相关的以下内容: 与编译器相关的数据类型声明(OS_CPU.H)不同的处理器有不同的字长.所以必须定义一系列数据类型以确保移植的正确性。文件OS_CPU.H中声明了10个相关数据类型。
改写与任务管理相关的函数(OS_CPU_C.C)uC/OS II移植需要改写6个与任务管理相关的函数.它们是:OSTaskStkInit()、OSTaskCreatHook()、 OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()、OSTaskTickHook()
其中只需对OSTaskStkInit()编写代码,后5个函数必须声明,但是内部并没有代码。OSTaskCreate()和OsTaskCreateExt()通过调用OSTaskStkInit()来初始化任务的堆栈结构。
编写与任务切换相关的函数(OS_CPU_A.ASM)
uC/OS II的移植要求用户编写四个与处理器相关的汇编语言函数:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
如果用户的编译器支持插入汇编语言代码,可将所有与处理器相关的代码放到OS_CPU_C.C文件中,该文件便不再需要。
编写中断服务程序CPUhighInterruptHook() 数和CPUlwoInterruptHook()函数
2 uC/OS II在PIC18F452上的移植实现
2.1数据类型定义
在uC/OS II中,不使用c的short、int和long等数据类型。下面就是uC/OS II定义的一部分数据类型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;/*无符号8位整数 */
typedef signed char INT8S; /*有符号8位整数 */
typedef unsigned int INT16U; /*无符号16位整数 */
typedef signed int INT16S; /*有符号16位整数 */
…… 2.2宏定义
包括开关中断的宏定义,以及进行任务切换的宏定义。
#define OS_CRITICAL_METHOD 3
……
#if OS_CRITICAL_METHOD==3 /*关开中断方式*/
#define OS_ENTER_CRITICAL()
cpu_sr=INTCON & 0b11000000;
INTCON &=(0b00111111|(RCON&0b10000000))
#define OS_ENTER_CRITICAL_HIGH()
cpu_sr=INTCON & 0b11000000;
INTCON &=0b00111111
#define OS_EXIT_CRITICAL() INTCON |=cpu_sr
#endif
……
void OSCtxSw(void);
#define OS_TASK_SW() OSCtxSw()
(1)开关中断宏
与其他实时系统一样,uC/OS II在进入系统临界代码区之前要关闭中断,等到退出临界区后再打开,从而保护核心数据不被多任务环境下的其他任务或中断破坏。uC/OS II定义了两个宏用来关闭/打开中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。uC/OS II中提供三种开关中断的方法。本移植中实现OS_ENTER_CRITICAL()用的是第3种方法,将CPU的状态字寄存器保存到局部变量中。而 OS_EXIT_CRITICAL()从这个局部变量中恢复状态寄存器。该移植中使用的局部变量为OS_CPU_SR类型的cpu_sr。此方法还定义了 一个关中断的宏OS_ENTER_CRITICAL_HIGH(),与OS_ENTER_CRITICAL()不同的是它不仅可以禁止低优先级中断,而且 可以禁止高优先级中断。后者只能禁止低优先级中断。
(2)任务切换宏OS_TASK_SW()
上下文切换时可直接调用该宏,因为在PIC18中是没有软中断的。 2.3堆栈
uC/OS II是一个多任务的调度器,每个任务都有自己的堆栈。堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。OS_STK数据类型和处理器的寄存器 长度是一致的,PIC18F452的寄存器长度为8位,并定义堆栈由低地址向高地址增长,以便在调用任务建立函数OSTaskCreate()或 OSTaskCreateExt()时,告知堆栈是增长方向:
typedef INT8U OS_STK;/*栈类型(8位宽)*/
#define OS_STK_GROWTH 0 /*定义栈增长方向为由低到高*/ 2.4时钟
PIC18F452有8种振荡器模式。设计中选用的是XT模式,故决定了时钟频率为4Mhz。 2.5任务切换
由于uC/OS II是一个抢占式的内核,所以它总是执行处于就绪态的优先级最高的任务。任务在执行时会调用uC/OS II提供的一个服务来等待时间过期,或者信号量的到来,或者另一个任务或中断服务例程的消息的到来。当内核发现有优先级更高的任务处于就绪态时,便进行任 务间切换。其处理过程如下: 任务调用uC/OS II提供的OSTimeDly()服务;
OSTimeDly()将任务放到正在等待任务过期的一串任务里面;
因为任务不可能再被执行,系统会调用调度器(OSSched())找出下一个优先级最高的任务来运行;
上下文切换是通过调用OSCtxSw()来完成的。
OSCtxSw()是用内嵌汇编语言写的,因为它要直接操作PIC中的寄存器。
2.6中断服务例程
根据uC/OS II的要求,用户要编写自己的中断服务例程。所有的中断是在CPUhighInterruptHook()函数和 CPUlowInterruptHook()函数中处理的.用户只需要提供处理中断的代码。时钟中断中的必须是一个低优先级的中断.并且需要定时调用 OSTimeTick()。
在CPUlowInterruptHook()函数处理完中断服务子程序后,CPU相关代码开始退出中断。调用OSIntExit()使中断嵌套层数递 减,当嵌套层数为0时,所有的中断嵌套结束,系统通过调用OSSched()判断CPU应该回到先前被中断的任务,还是运行高优先级的任务。如果有一个高 优先级的任务,uC/OS II会通过任务切换使CPU运行此任务。
void CPUlowInterruptHook(void)
{
if(INTCONbits.TMROIF){ //检查TMR0是否溢出
INTCONbits.TMR0IF=0; //清除中断标志
TMR0H=0xD8; //设置时间常数10 ms.(at 4MHz)
TMR0L=0xA0;
OSTimeTick(); //调用OS时钟请求
}
/*此处插入用户的中断程序*/
}
#pragma interrupt CPUhighInterruptHook
void CPUhighInterruptHook(void)
{
/*此处插入高优先级中断程序,但不能使用任何OS功能调用*/
} 3 用户实时任务编写
uC/OS II中的实时任务是在系统初始化(调用OSInit()和OSCtxSw())后,通过OSTaskCreateExt()调用创建的,实时任务创建完成 后,调用OpenTimer0()设置时钟中断,最后调用OSStart(),系统开始运行并进行任务调度。
为了测试移植的结果,使用高奇ICD DEMO教学实验板并利用板上资源创建TempTask()、LEDTask()及通过RS232实现的Shell任务。其中,Shell任务接收并执行 用户的Shell命令.并通过LCDTask()任务显示该命令.TempTask()则实现则周期性地采集与RA0-RA3相连接的温度。由于PIC的 USART中只有2个字节的FIFO缓冲队列,快速的通信过程中很容易丢失数据.故除了通信的实现采用中断方式之外.还设计了一个30Byte的缓冲队 列,存放接收到的数据,接收数据由设计在CPUlowInterruptHook()中的代码完成,主要代码如下:
while((PIE1bits.RCIE)&&(PIR1bits.RCIF))
{
c=RCREG;
t=q.rear+1;
if(t==MAX_LEN)//接收的数据存放到队列中
t=0;
if(t==q.front)
break; //溢出
q.rear=t;
q.data[q.rear]=c;
} 4 结束语
目前正在进行的水质控制系统中采用PIC MCU作为下位机负责数据采集、数据简单处理、控制执行机构以及与上位机的通信。该项目中引人uC/OS II后.系统开发效率明显提高。下一步考虑将其与已经设计完成的以太网控制器结合,实现嵌人式控制系统的TCP/IP互连。 UC/OS-II 在pic18上的移植(一) 由于学习µC/OS-II 时间比较短,很多问题还在不断地摸索,我想将我在移植µC/OS-II到PIC18f8720中的一些经验贡献出来,让大家分享,难 免错误的地方,欢迎拍砖。由于手头任务时间较紧,我只有抽空凑一点大家一起交流。望走在前面的大虾,多提宝贵意见。
为什么要RTOS(实时内核)?是不是觉得很时髦?这样说,你要是搞一些代码量很小,产品质量也不是很重要,也不需要所有的任务都按时完成,那还是传统的 程序结构比较适用,因为它不需要你花大量的时间去接触内核这个当代软件的专家技术。如果你的程序量很大,系统的任务繁重,像现在超过32K的code已很 常见,这时,就再也不是我们传统说的30%时间写程序,70%调试程序了,很可你花了大半年时间搞出来的程序自己都说不清结构,维护起来十分吃力,有时候 维护一个程序还不如重新写一个快。我去年就这样,3个月写出来的东西,自己都把它否定了!搞得人很累。最近又一个东西需要管理4个步进电机、一个交流电 机,多路开关信号的输入输出,还要240x64的lcd,键盘。要求人机信息交换很多。最头痛的还要这些电机同步协调工作。我水平很臭,搞了10来天就走 不动了,超过25k后没有头绪了。只好咬紧牙关看看RTOS(实时内核)的东西了。没有一点基础,也就没有一点底自己到底行不行?但背水一战,也只好硬着 头试一下。它有什么作用?虽然学起来十分艰难,但完全可以将整个工程分成若干个小块,每一块就只处理一个任务,比如说一个电机的工作或lcd如何显示;各 个任务之间再想办法通过专门的方法联系,让你不再考虑程序的整体结构问题了。
用什么RTOS?从一些资料中发现µC/OS-II很适合初学者,好,就是它。
µC/OS-II是一个源代码公开专门针对MCU的一个占先式实时内核,它的最大好处是可以放在你的源代码中,一起编译链接后在 mcu中运行,不像一些内核需要放在专门的boot代码块中。其次可以根据你的需要进行裁减——这些都可以在它的资料中看到。当然你离不开一下的几个过 程,有些甚至很痛苦。
首先,你要有较好的C基础,不然你看它的一些代码就是坐飞机了!
其次,必须搞懂嵌入式系统的概念。
有这样的前提,你就可以看看邵贝贝翻译Jean J.Labrosse著的《嵌入式实时操作系统 µC/OS-II》,我花了20天时间专门看这本书,现在也就懂一点皮毛。我认为第一步不要深究代码的意思,只要知道这个函数做了些 什么工作,就可以了,关键是要知道如何应用,必须搞懂的地方有:任务和事件的数据结构,优先级算法,中断的处理方法。然后你就可以试着使用被前人移植过的 环境了。如果要自己去搞移植,没有功底就绝对没有把握。
去www.ucosii.com 上下载一个适合你的移植好了的代码,着手编译一下,最好是能够在PICDEM 2 PLUS上运行。这个过程看来简单,自己摸索也很费时日的~~~ 要注意的一些问题:
1、    不要指望在htsoft出的Picc18下编译,由于它不支持代码重载,你用的再熟练也只有抛掉!去关心难用的mcc18吧。还要注意linker脚本文 件的修改,我也没有搞懂linker,参照下载文档里现成的18f452的样子,删掉对databank的划分,在编译命令里选用大模式,就过去了。现在 也说不出原因。
2、    下载的文档里,没有Kernel的代码,你还得拷贝进去,注意千万不要覆盖已存在的源代码。
3、    编译通过了,你就成功了一半,我在PICDEM 2 PLUS 下调时发现根本就不能运行,今天花了一天时间,才找到问题,是xlcd.c里面除了问题。只要看到任务能够调动了,不管它,过。搞了3个任务,分别驱动3个led,很好都工作了。代码如下:
***************************************************************/
#include "includes.h"
#include
#include
#include /************************************************************************/
#define    Ldata    PORTD
#define Lport    TRISD
#define CCP1    PORTCbits.RC2
#define    DIR1    PORTCbits.RC3
#define EN1        PORTCbits.RC4 OS_STK    Task1Stk[100];
OS_STK    Task2Stk[50];
OS_STK    Task3Stk[50];
OS_STK    Task4Stk[50]; void Task1(void *pdata);
void Task2(void *pdata);
void Task3(void *pdata); void Task1(void *pdata)
{
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
WriteTimer0(-10000); // Initialize statistics task
OSStatInit(); OSTaskCreate(Task2,(void *)0,Task2Stk,7);
for(;;)
{    CCP1=1;
OSTimeDly(0x20);
CCP1=0;
OSTimeDly(0x20);
}
} void Task2(void *pdata)
{    OSTaskCreate(Task3,(void *)0,Task3Stk,6);
for(;;)
{    DIR1=1;
OSTimeDly(0x20);
DIR1=0;
OSTimeDly(0x20);
}
} void Task3(void *pdata)
{    for(;;)
{    EN1=1;
OSTimeDly(0x20);
EN1=0;
OSTimeDly(0x20);
}
} void Task4(void *pdata)
{ } // initialization
void Initialize(void)
{
ADCON1=0x0F;    // all ad conversion disable at this system
PORTA=0x00;
LATA=0x00;
TRISA=0x00; PORTB=0b11110000;
LATB=0xF0;
TRISB=0xF0; PORTC=0x00;
LATC=0x80;
TRISC=0x80; Ldata=0xff;
Lport=0xff;
LATD=0XFF; PORTF=0xFF;
LATF=0xFF;
TRISF=0xFF; PORTG=0x00;
LATG=0x00;
TRISG=0x00; PORTH=0x0F;
LATH=0x0F;
TRISH=0x0F; PORTJ=0b11111111;
LATJ=0xFF;
TRISJ=0b11010101; } //main rouitine
void main(void)
{    Initialize();
OSInit();
OSTaskCreate(Task1,(void *)0,Task1Stk,5);
OSStart();
} 下一步就可以试一下身手了。以后的经验看情况,继续发给大家。 --------------
真正接触uC/OS-II是3个月之前的事,在网上有许多关于uC/OS-II的文章,文章有对uC/OS-II的种种观点和看法,总结起来有点大于缺 点,在资源相对丰富的单片机内使用uC/OS-II可以简化应用程序设计,增强系统的稳健性,提高开发效率,便于多人协作等优点,最吸引我的地方就是关于 TCP/IP协议在uC/OS-II上的移植内容,于是决心在单片机上移植uC/OS-II。为了这个目的我买了邵贝贝教授翻译的那本书,花了72块钱。  

FreeRTOS

作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。 FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。 FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用 时间。 FreeRTOS的内核可根据用户需要设置为可剥夺型内核或不可剥夺型内核。当 FreeRTOS被设置为可剥夺型内核时,处于就绪态的高优先级任务能剥夺低优先级任务的CPU使用权,这样可保证系统满足实时性的要求;当 FreeRTOS被设置为不可剥夺型内核时,处于就绪态的高优先级任务只有等当前运行任务主动释放CPU的使用权后才能获得运行,这样可提高CPU的运行 效率。   这是两种RTOS, 现在粗略比较一下。 freeRTOS比uCOS II优胜的地方:
1。内核ROM和耗费RAM都比uCOS 小,特别是RAM。 这在单片机里面是稀缺资源,uCOS至少要5K以上, 而freeOS用2~3K也可以跑的很好。 2。freeRTOS 可以用协程(Co-routine),减少RAM消耗(共用STACK)。uCOS只能用任务(TASK,每个任务有一个独立的STACK)。 3。freeRTOS 可以有优先度一样的任务,这些任务是按时间片来轮流处理,uCOSII 每个任务都只有一个独一无二的优先级。因此,理论上讲,freeRTOS 可以管理超过64个任务,而uCOS只能管理64个。 4。freeRTOS 是在商业上免费应用。uCOS在商业上的应用是要付钱的。 freeRTOS 不如uCOS的地方:
1。比uSOS简单,任务间通讯freeRTOS只支持Queque, Semaphores, Mutex。 uCOS除这些外,还支持Flag, MailBox.
2。uCOS的支持比freeRTOS 多。除操作系统外,freeRTOS只支持TCPIP, uCOS则有大量外延支持,比如FS, USB, GUI, CAN等的支持
3。uCOS可靠性更高,而且耐优化,freeRTOS 在我设置成中等优化的时候,就会出问题。 *********************** 期待大家的意见 我认为这个是个硬伤:uCOSII 每个任务都只有一个独一无二的优先级,而没有按时间片来轮流处理的同级任务
如 我要在屏幕上同时显示两个任务的运行输出状况简直没法做   --- 我认为这个是个硬伤:uCOSII 每个任务都只有一个独一无二的优先级,而没有按时间片来轮流处理的同级任务
如 我要在屏幕上同时显示两个任务的运行输出状况简直没法做
这个我觉得正是uCOSII的优点呢.有了这条才能保证任务执行时间的确定性.正是uCOSII高可靠性保证之一.
时间片轮换实际上会影响系统的实时性.如果同级任务过多,还叫不叫实时系统我都怀疑.
至于同时显示,时间要求不严格的情况下,uCOSII的例子里(通过任务挂起)做得不是很好吗? -- 如何开发出1种通用的RTOS,使得用户易于使用,方便地裁剪到某系统中去,国外商用RTOS已经很好地解 决了这个问题。中国人设计的RTOS应更多地适于中国的国情,除了中文处理,中国有着广泛的单片机的应用基础。开发设计1种简单、易用的RTOS开发环 境,以中国人可以接受的价格和更为务实的技术支持手段推出,也许可以找到1种正常的市场回报途径。RTOS产业是1个循序渐进的产业,任何急功近利的做法 都将导致功亏一篑。用户熟悉1种RTOS需要1个相当的过程和厂家的支持,同时用户也不愿意轻易放弃1种RTOS。我们相信中国人自己开发设计的RTOS 一定会得到国人的认可,有着无限光明的前途。    -- freertos 不限制任务数,支持堆栈检测中断处理机制好,不像UCOS中断还得自己写入口程序支持优先级继承,ucos只支持预设优先级来提升还有,我觉得freertos查找最高优先级就绪任务更快,没有实测过。还有支持固定时钟周期的延时方式。freertos更像一个真正完善的实时内核,只是外围的东西少了点文件系统有fatfs TCP/IP 有uip,lwip,大部分的移植工作都是基于GCC的很方便