随想录(rtos和一般os的区别)


【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


    现在在网上可以看到代码的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让出来。仅此而已。




你可能感兴趣的:(随想录(rtos和一般os的区别))