eCos与uC/OS-II内核实现的比较

=======================
线程结构信息:
eCos使用cyg_thread类表示线程,用cyg_thread_info结构存储线程信息,而UC/OS使用TCB结构表示任务
=======================
调度单位:
eCos调度以线程为单位,状态有CREATING SUSPENDED RUNNING(包括准备运行和正在运行) SLEEPSET(包括SLEEPING COUNTSLEEP) EXITED。创建线程cyg_thread_create(),创建后处于SUSPENDED状态,调用cyg_thread_resume()进入RUNNING状态。
UC/OS调度以任务为单位,状态有READY RUNNING WAITING DORMANT。创建任务OSTaskCreate(),创建后处于READY状态,调用OSStart()加入多任务调度。
=======================
调度单位:
eCos中用suspend_count表示挂起次数,可以多次挂起,只有suspend_count==0时才转为RUNNING状态。
UC/OS和其他RTOS一样,不支持多次挂起。
eCos中使用unique_id表示线程的标识
UC/OS中任务的优先级就代表任务的标识
=======================
休眠:
eCos中使用sleep_reason表示休眠原因,分别有NONE WAIT TIMEOUT DELAY,而UC/OS中用event event_flags结构表示
=======================
唤醒:
eCos使用wake_reason表示唤醒原因,分别有NONE EXIT BREAK TIMEOUT DONE DESTRUCT,而UC/OS中没有对应变量
=======================
调度:
eCos支持优先级的抢占式调度和轮转调度相结合的MLQ(Multi Level Queue)调度器,基于优先级的抢占式调度的Bitmap位图调度器,Lottery抽签调度器,三种调度器只是在Cyg_Scheduler_Implementation类的定义上有所区别。Bitmap为每个线程设置唯一的优先级,最多支持32个优先级,这点与UC/OS一样,run_queue是位图,类似于UC/OS中的RdyTbl,thread_table是线程指针数组,类似于UC/OS中的PrioTbl。MLQ中queue表示位图,run_queue表示相同优先级线程的双向链表,timeslice_count表示时间片变量。Lottery中run_queue表示线程队列,rand_seed表示随机数种子,total_tickets表示总签数,timeslice_count表示时间片。
UC/OS只支持基于优先级的抢占式调度的Bitmap位图调度器。
=======================
继承和反转:
eCos中使用优先级继承和优先级封顶策略解决优先级反转问题
UC/OS中只使用优先级继承
=======================
锁住:
eCos和UC/OS都支持锁住调度器,并且不容许在ISR中执行调度
=======================
异常:
eCos中可以通过HAL层和kernel层处理异常,调用顺序如下:
idx号发生异常->hal_pc_exception_idx->_default_exception_vsr->cyg_hal_exception_handler->cyg_hal_deliver_exception->应用程序安装的异常处理例程,eCos的异常处理过程和Linux比较相像
UC/OS中异常和中断必须由用户程序自己处理,kernel只提供OSIntEnter()和OSIntExit()
=======================
中断处理:
eCos中中断处理可以分为两步执行,第一步是ISR,执行必须的操作,此时调度器被锁住,ISR执行结束后,调用interrupt_end()挂起DSR(Deferred Service Routine),对调度器解锁,如果调度器锁的值是0则执行DSR(Deferred Service Routine),并调度线程
UC/OS中所有的中断处理都在ISR中执行,没有DSR(Deferred Service Routine),这样会带来比较长的中断延时
=======================
堆栈:
eCos的中断可以有独立于线程的堆栈,这点与Linux相像,而UC/OS没有
=======================
中断嵌套:
eCos容许中断嵌套,而UC/OS不容许
=======================
时间事件:
eCos实现了Counter Alarm Clock Timer等定时机制,Alarm常和Counter一起使用,Clock主要用来实现实时时钟的功能,Clock的ISR和DSR负责实时时钟中断的处理,Clock的DSR中会调用tick(),检查相关alarm是否触发。Timer是为了实现uTRION相关的机制。
UC/OS中只有OSTimeDly()处理时间间隔事件
=======================
同步机制:
eCos实现的同步机制有Mutex, Condition variables, Semaphore, Mailbox, Message queue, Event flags, Spinlock。Condition variables用于和Mutex联合使用,以完成对某些资源的较长时间的等待。Semaphore有两种,分别是Binary semaphore和Counting semaphore。Mailbox的结构是一个FIFO类型的循环队列,存储的是指针,很像UC/OS中的Message queue。Message queue传递的不是指针,而是占用空间较大的一段数据,但是eCos的C API中没有提供消息队列的封装。Event flags可以使得线程同时等待多个事件,与UC/OS的Event flags很像,有AND,OR,CLR,MASK四种模式。Spinlock只能用于SMP系统中,原理和API与Linux的Spinlock很像。
UC/OS实现的同步机制有Semaphore, Mutex, Mailbox, Message queue, Event flags。Semaphore有三种。Mailbox中只能有一条消息,存储的是指针。Message queue的结构是一个循环队列,可以有FIFO和LIFO两种模式,存储的是指针。Event flasg可以使任务同时等待多个事件,有AND和OR两种模式,又分别有SET和CLR两种情况。

以上内容转自:http://blog.sina.com.cn/s/blog_598ef4df0100c9xy.html

你可能感兴趣的:(eCos与uC/OS-II内核实现的比较)