准确理解µC/OS-III的源码,对顺利移植OS、建立应用程序非常有帮助。下面将介绍µC/OS-III源码的架构:
从图中可以看出,与ucOS密切相关的硬件是CPU、定时器和中断控制器,当然,MCU还有其他的外设,在BSP中要用到,只是这里没有列出。
除去硬件,整个µC/OS-III源码架构包含9个模块,下面分别予以介绍:
⑴应用层模块
应用程序代码由项目文件组成。为了方便,这里简单统称为app.c和app.h,事实上应用层可以包含任意数量的文件,而不仅仅只有app.*。 主应用程序代码含有main()函数。
⑵与内核无关的CPU文件
半导体厂商通常以源代码形式提供库函数,以访问其CPU或MCU上的外设。这些库非常有用,可以提高效率,节省宝贵时间。由于这些文件没有统一的命名规范,因此这里设为为* .c和* .h。
⑶BSP模块
µC / OS-III所需的板级支持软件包(BSP)代码通常比较简单。µC / OS-III一般仅要求初始化用于延时和超时的周期性中断源(OS用定时器),将此功能放置在bsp_os.c源文件中,其对应头文件bsp_os.h。
- bsp_os.c:初始化延时和超时的周期性中断源。
⑷与CPU无关的OS内核模块
这部分代码可以不做任何修改移植到所支持的CPU上,内容包括:
- os_cfg_app.c:系统任务的配置
- os_type.h:内核对象的数据类型定义
- os_core.c:ucos3相对比较底层的函数,供其它内核对象函数调用;包含ucos的核心功能,例如初始化uc-osiii的OSInit(),用于任务级调度器的OSSched(),用于中断级调度器的OSIntExit(),挂起列表管理(pend list),就绪列表管理(ready list),等等。
- os_dbg.c:内核识别的调试器或probe使用的常数标量声明。
- os_flag.c:事件标志管理的代码。
- os_mem.c:µC / OS-III固定大小内存管理器的代码,内存分区代码。
- os_msg.c:用于处理消息的代码。 µC / OS-III提供消息队列和针对任务的消息队列。 os_msg.c为这两个服务提供通用代码。
- os_mutex.c:管理互斥信号量的代码。
- os_prio.c:包含用于管理位图表(bitmap table)的代码,该位图表用于跟踪哪些任务已准备好运行,请参阅“就绪列表”。 如果使用的CPU提供位清除、置1和测试指令以及计数前导零指令,则可以用汇编 源文件等效替代该文件,以提高性能。
- os_q.c:包含用于管理消息队列的代码。
- os_sem.c:用于资源管理和同步的信号量代码。
- os_stat.c:包含统计任务的代码,用来计算全局CPU使用率以及每个任务的CPU使用率。
- os_task.c:包含任务管理的代码,使用OSTaskCreate(),OSTaskDel(),OSTaskChangePrio()等函数实现。
- os_tick.c:用于管理自身主动延迟或在内核对象上被超时挂起的任务。
- os_time.c:时间管理代码,允许任务将自身延迟到某个截止时间。
- os_tmr.c:管理软件定时器的代码。
- os_var.c:包含µC / OS-III全局变量。这些变量由内核管理,应用程序不能访问。
- os.h:µC / OS-III主头文件,该文件声明常量、宏、µC / OS-III全局变量(仅由µC / OS-III使用)、函数原型等。
⑸与CPU相关的OS内核模块
这是适用于特定CPU架构的µC / OS-III代码,称为端口(Ports)。
- os_cpu.h:CPU相关配置、下面两个文件中函数的声明;
- os_cpu_a.asm:CPU相关的汇编函数声明及定义,比如关中断、前导零指令的调用,
OSCtxSw()
,OSIntCtxSw()
和OSStartHighRdy()
; - os_cpu_c.c:CPU相关的C语言函数定义及声明,C语言计算前导零个数等。
⑹与特定CPU相关的模块uC/CPU
Micrium封装了CPU的功能,这些文件定义了用于禁用和使能中断的函数,以及独立于所用CPU和编译器的CPU_???命名的数据类型,另外还有一些其他功能。
- cpu_core.c:包含所有CPU架构通用的C代码。具体来说,该文件包含了函数用于测量宏CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT()之间的中断禁用时间,一个在CPU不提供指令的情况下模拟计数前导零指令的函数以及一些其他函数。
- cpu_core.h:包含cpu_core.c的函数原型,以及分配用来测量中断禁用时间的变量。
- cpu_def.h:包含µC / CPU模块使用的各种各样#define常量。
- cpu.h:包含用于使OS内核和其他模块独立于CPU和编译器字长的类型定义。头文件中将找到CPU_INT16U,CPU_INT32U,CPU_FP32和许多其他数据类型的声明。该文件还规定CPU是大端还是小端模式,定义OS模块使用的CPU_STK数据类型,定义宏CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT(),并包含特定于CPU架构的函数原型,以及其他。
- cpu_a.asm:包含汇编函数,以实现禁用和启用CPU中断,计数前导零(如果CPU支持该指令)和仅能用汇编语言编写的其他特定于CPU的函数代码。该文件可能还包含用于启用缓存,设置MPU和MMU等的代码。该文件中提供的函数可用C语言调用访问。
- cpu_c.c:包含基于特定CPU架构的C语言函数,出于可移植性而用C编写。一般如果可以使用C编写函数,则应该使用,除非使用汇编语言编写可以显着提高性能。
⑺uC库文件
µC/LIB包含一系列源文件,它们提供一些常用功能,例如内存复制,字符串和与ASCII相关的函数,可以使用库中的函数替换编译器提供的stdlib标准库函数。提供这些库文件是为了确保它们可以在应用程序之间(尤其是在编译器之间)完全可移植。µC / OS-II内核不使用这些文件,但µC / CPU使用。
⑻编译器相关模块
这是一个可选模块,大部分情况下应该用不到。一些编译器提供了线程本地存储(TLS)的扩展,这些扩展提供了一个可变区域,线程可以在其中存储状态以使多线程环境更安全。这些功能的调整在uCOS-III \ TLS \ <tool>文件夹下的os_tls.c文件中执行,其中<tool>是工具制造商的名称或工具名称。
⑼配置头文件
配置文件在OS源码中分散在各个模块的Cfg文件夹中。配置文件的内容:
- os_cfg.h:用来定义要包含在应用程序中的µC / OS-III功能;
- os_cfg_app.h:指定µC / OS-III所需的某些变量和数据结构的大小,例如空闲任务堆栈大小、滴答时钟速率、消息池的大小等;
- cpu_cfg.h:配置应用程序可用的µC / CPU功能;
- lib_cfg.h:配置µC / LIB的可选项。
通过改变这些配置文件里的宏值,可以方便地裁剪OS的功能。