在详解1中首要讲了移植需求用到的CM3内核常识,本文讲一讲ucosii的原理和代码组成。ucosii最经典的学习材料莫过于邵贝贝教师的<<嵌入式实时操作系统uc/os-ii(第2版)>>,我想这本书对学ucosii现已足够了,由于他把ucosii V2.55代码都讲了一遍。移植前应该好好看看此书。
下面说说我对ucosii的了解。应该说ucosii这个内核仍是比较简单的,根本能够分为使命调度,使命同步和内存办理三个部分。
使命调度
ucosii为确保实时性,给每个使命分配一个不同的优先级。当产生使命切换时,总是切换到安排妥当的最高优先级使命。有2种状况会产生使命切换。
1.使命等候资源安排妥当或自我延时;
2.退出中止;
状况1能够了解为使命自动抛弃cpu的使用权。
状况2能够了解为中止后,某种资源或许安排妥当了,需求使命切换。
需求留意的是SysTick中止,这个中止是os的“心跳”,有必要得有。这样就使得cpu会产生周期性地做使命切换。由于ucosii不支持时刻片轮转调度,因此在该中止中有必要做的作业仅有os的时刻办理。也便是调用OSTimeTick()。
使命同步
使命同步和大多数操作系统的做法差不多,假如学过操作系统或是有多线程编程经历的话,应该很好了解。无非是使命A由于某个资源未安排妥当,就抛弃cpu使用权,等使命B或是中止使该资源安排妥当,当再次使命进行切换时假如使命A优先级最高,则使命A持续履行。详细怎样完结就看邵教师的书吧。
内存办理
ucosii的内存办理比较简单,就不说了。
下面看看ucosii代码组成:
os_core.c是ucosii的中心,它包含了内核初始化,使命切换,事情块办理等,其间事情块是各个同步量(这儿我把互斥量,信号量,邮箱,行列统称为同步量,不是很科学,图个便利。事情标志组不是以事情块为根底的,不过原理也差不多)的根底。
os_task.c
使命办理代码。
os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
各个同步量办理代码。
os_mem.c
内存办理代码。
os_time.c
时刻办理代码,首要做各种延时。
os_tmr.c
守时器办理代码,这部分代码时从V2.81版才开端有的,邵教师的书讲的是V2.55版的代码,是没有这部分内容的。假如前面的代码都了解的话,这部分代码也是不难了解的。一个守时器大体由3部分组成:守时时刻,回调函数和特点。当守时时刻到了的话,就进行一次回调函数的处理,守时器特点阐明守时器是周期性的守时仍是只做一次守时。假如用户使能了OS_TMR_EN,ucosii会在内部创立一个守时器使命,负责处理各个守时器。这个使命一般应该由硬件守时器的中止函数中调用OSTmrSignal()去激活。所以从实质上说os_tmr.c中的守时器是由一个硬件守时器分解出来的。
默许状况下是由SysTick中止里经过OSTimeTickHook()去激活守时器使命的。
移植相关文件
os_cpu.h:
进行数据类型界说,处理器相关代码和几个函数原型。
os_cpu_c.c:
界说一些用户hook函数。
os_cpu_a.asm:
移植需求用汇编代码完结的函数,首要便是使命切换函数。
os_dbg.c:
内核调试相关数据和函数,能够不改。
ucosii内核就介绍到这儿。