现在在网上可以看到代码的os很多,既有rtos类型的微内核代码,也有大型的linux kernel代码。大型的os代码包括的内容很多,就拿linux来说,它就包括了调度、文件、网络、驱动等完整的代码内容。而一般的rtos呢,就拿大家熟悉的ucos2来说,只是包含了调度、同步、互斥、时钟等代码。如果系统工程师需要拿ucos2来做一个项目,那么他还需要bsp、lwip、ucGUI、fatfs、driver、framework等很多代码才能组成一个完成的系统。但是,在我看来,rtos和一般os就是两个主要的区别,
a)rtos中调度的任务永远是优先级最高的
void raw_sched(void)
{
RAW_SR_ALLOC();
/*if it is in interrupt or system is locked, just return*/
if (raw_int_nesting || raw_sched_lock) {
return;
}
USER_CPU_INT_DISABLE();
get_ready_task(&raw_ready_queue);
/*if highest task is currently task, then no need to do switch and just return*/
if (high_ready_obj == raw_task_active) {
USER_CPU_INT_ENABLE();
return;
}
TRACE_TASK_SWITCH(raw_task_active, high_ready_obj);
CONTEXT_SWITCH();
USER_CPU_INT_ENABLE();
}
这是rawos中调度的一段代码。事实上,任务调度的时机是比较固定的。一方面,任务可能会在资源阻塞的时候主动调度,另一方面就是任务在中断返回的时候发现了优先级更高的任务,这也可能发生调度。当然,不管什么时候发生调度,系统都会挑选优先级最高的任务。而在linux或者windows上面,系统会对任务的优先级进行灵活设置,每个任务都有一个固定优先级和浮动优先级,这是一个显著的特点。
b)互斥量
/*Must release the mutex by self*/
if (raw_task_active != mutex_ptr->mtxtsk) {
RAW_CRITICAL_EXIT();
return RAW_MUTEX_NOT_RELEASE_BY_OCCYPY;
}
这是互斥量显著的特点。一般来说,互斥量释放必须由占有mutex的任务自己完成。另外一方面就是,mutex可以避免优先级翻转的问题。换句话说,如果低优先级的任务率先抢占了mutex,那么后面申请mutex的高优先级任务会强迫低优先级任务抬高自己的优先级,这样可以尽快地把mutex让出来。仅此而已。