通用操作系统与实时操作系统(RTOS)比较


零、引 子---由终端设备到RTOS:RTOS无处不在..........

(1).Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP):

                AP是ARM架构的处理器,用于运行Linux+Android系统;

                BP 用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上。非通话时间,BP的能耗基本上在5mA左右,而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高。另外LCD工作时功耗在100mA左右,WIFI也在100mA左右。一般手机待机时,AP、LCD、WIFI 均进入休眠状态,这时Android中应用程序的代码也会停止执行。

               下面以mt6582/32位(四核处理器为例说明)

AP MCU: Apps MCU(APP MCU)-------处理器1
MD MCU: Modem MCU(Modem MCU)-------处理器2

通用操作系统与实时操作系统(RTOS)比较_第1张图片



下面再以高通8x26平台为例说明:



高通说明如下:(高通  android 智能手机解决方案的软件包括两个部分)

1). 以linux 操作系统为基础的 android 系统

2). 以 L4,REX为基础的 Modem 部分(RTOS)


在高通7系列的架构中,一个IC内部集成有两个ARM处理器

        一个ARM9(或者arm11),专门负责处理通信协议,射频以及GPIO等,软件架构采用AMSS,;

        另外一个是ARM11,用来处理多媒体,上层应用,以及其他的一些任务,运行的系统是 android 系统。

        这两个处理器之间通过共享内存的硬件方式来进行通信。


补充:

       L4是一组计算机程序,是最初由Jochen Liedtke设计的微内核构架的操作系统内核,现在已经形成一个微内核家族。L4这个微内核系统由于其出色的性能和很小的体积而开始被计算机工业所认知,被移植到了许多不同的硬件构架上。高通的 L4 提供了操作系统最基本的操作,是买别人的。

       早期的操作系统绝大多数是 Monolithic Kernel, 意思是整个操作系统 - 包括Scheduling (调度), File system (文件系统),Networking (网络),Device driver (设备驱动程序), Memory management (存储管理),Paging(存储页面管理) - 都在内核中完成.一直到现在广泛应用的操作系统,如UNIX,Linux,和Windows还大都是monolithic kernel操作系统.但随着操作系统变得越来越复杂(现代操作系统的内核有一两百万行C程序是很常见的事情),把所有这些功能都放在内核中使设计难度迅速增加.

       微内核是一个与Monolithic Kernel相反的设计理念.它的目的是使内核缩到最小,把所有可能的功能模块移出内核.理想情况下,内核中仅留下Address Space Support(地址空间支持),IPC
(Inter-Process Communication,进程间通讯),和Scheduling(调度),其他功能模块做为用户进程运行。

       REX 是在 L4 之上封装的服务,是一个抢占式,多任务的RTOS,所有的任务都以task的形式存在,REX提供包括任务创建,同步,互斥,计时器,中断控制等功能的API,这里的task实际上就是我们的线程,每个 task对应着一个线程。REX维护一个task list(双向链表),始终运行高优先级的task。products里面所有的服务包括3g协议栈等都是以task的形式跑在rex之上的。

       而Brew的话是运行的环境,跟Java 有点儿类似,相当于是一个虚拟机。

       AMSS――高级的移动用户软件(Advanced Mobile Subscriber Software)技术,是一种新的软件架构,是对原来软件架构 DMSS 的升级。 AMSS 源代码实际上是QC BREW(Binary Runtime Environment For Wireless)平台的的底层部分,去掉了为应用程序提供接口的AEE(application execution environment)部分,高通在Dual Proc 芯片上的其他平台基本上都是采用的这样的架构。




(2).每部Android手机(具有移动通信功能的手机)都运行着两个操作系统:在终端用户熟悉的Android和iOS外,还有一个实时操作系统(RTOS)管理着无线电功能。这个操作系统储存在固件,运行在基带处理器上。这些基带RTOS系统都是私有的。

        例如,运行在高通基带处理器的RTOS系统叫AMSS,基于高通私有的REX内核,由69个并发任务构成,处理从USB到GPS的一切事物,它运行在一个ARMv5处理器上。这些私有闭源的软件从未经过恰当的同行评审,实际上质量堪忧。Luxembourg大学的安全研究员Ralf-Philipp Weinmann逆向工程了高通和英飞凌的基带处理器软件,轻而易举的就发现了大量的bug。这些漏洞可以让攻击者远程执行代码,导致设备崩溃,可以用Hayes命令集悄悄启动自动应答。


(3)TP-Link小白路由內置了雙系統: 智能擴充部份由 Android 4.2 系統提供,大家可以透過安裝 Apps 加強功能。至於RTOS 則提供了一個系統嚴密、安全而且專業路由器的完整功能。



一、通用操作系统的设计 注重每次执行的平均响应时间而不关心某次特定执行的响应时间。通用操作系统中采用的很多策略和技巧都体现出了这种设计原则。
        大型的os代码包括的内容很多,就拿linux来说,它就包括了调度、文件、网络、驱动等完整的代码内容。


二、对于实时操作系统 ,它除了要满足应用的功能需求以外,更重要的是还要满足应用提出的实时性要求,而组成一个应用的众多实时任务对于实时性的要求是各不相同的,此外实时任务之间可能还会有一些复杂的关联和同步关系,如执行顺序限制、共享资源的互斥访问要求等,这就为系统实时性的保证带来了很大的困难。因此,实时操作系统所遵循的最重要的设计原则是:采用各种算法和策略,始终保证系统行为的可预测性predictability)
       而一般的rtos呢,就拿大家熟悉的ucos2来说,只是包含了调度、同步、互斥、时钟等代码。如果系统工程师需要拿ucos2来做一个项目,那么他还需要bsp、lwip、ucGUI、fatfs、driver、framework等很多代码才能组成一个完成的系统。

         可预测性是指在系统运行的任何时刻,在任何情况下,实时操作系统的资源调配策略都能为争夺资源(包括CPU、内存、网络带宽等)的多个实时任务合理地分配资源,使每个实时任务的实时性要求都能得到满足。与通用操作系统不同,实时操作系统注重的不是系统的平均表现,而是要求每个实时任务在最坏情况下都要满足其实时性要求,也就是说,实时操作系统注重的是个体表现,更准确地讲是个体最坏情况表现。



三、差别比较之处
1.几个主要差别的地方:

(1)任务调度策略不同。

(2)内存管理方式不同。

(3)中断处理方式。

(3)系统管理方式不同。


2.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让出来。仅此而已。





     





 

你可能感兴趣的