读uCOSIII源码笔记

来源:互联网 发布:东安格利亚大学知乎 编辑:程序博客网 时间:2024/06/10 05:35


首先谈一下自己读RTOS的粗略认识吧,刚开始接触单片机时使用的都是while(true),一个循环处理所有的任务。直到写了一个通过GPRS模块与上层服务通信(长连接)之后,才发现在while(true)中处理好恶心,老是掉线之后连接不上。可能是对AT指令的处理没有搞好,就开始各种找怎么解决,接触到了uC/OSIII,阅读了他提供的文档,阅读了源代码,慢慢看,感觉进步很多,用着用着就爱上了。

低复杂程度的系统通常是用foreground/background systems 或者super-loops,即while(true)。foreground为中断级别,background为任务级别。

uC/OS-III 是一个抢占式内核,一直处理准备好的最重要的任务。ISR通知或发送信息给高优先级的任务来处理,ISR结束后uC切换到高优先级的任务处理,处理完成之后,切换到低优先级任务处理。
uC/OS-III需要1K~4Kbytes的RAM,还需加上每个任务的堆栈地址。当使用real-time kernel设计了一个系统之后,基本不会使用while(true),我就是一个典型的例子。


特别说明一下Hook(钩子函数):一个允许用户扩展系统功能的函数。在钩子函数内添加具体实现就可以了。 


uC OSIII源码结构如下
1.用户功能任务代码。
2.MCU厂商提供的操作外设的库。
3.对使用的电路板上的MCU的各种功能的初始化和操作。
4.与MCU无关的OS代码。
5.与移植到特定MCU有关。
6.Micrium封装的CPU相关的功能。
7.通用功能的函数库。确保应用和编译器的可移植性,uC/CPU中有使用。
8.uC各项功能的配置文件。
 


uC/CPU Port:
cpu_core.c  :CPU相关初始化(时间戳,测量中断时间,CPUName),模拟CLZ(count leading zeros)指令,测量中断关闭时间方法等。
cpu_core.h :cpu_core.c的函数、变量声明。
cpu_def.h  :CPU模块使用的各种#define(大端小端字节序、堆栈的增长方向、Critical Section处理)
cpu.h  :CPU模块使用的类型定义、具体大端小端字节序、具体堆栈增长方向、具体Critical Section处理方法(CPU_CRITICAL_METHOD_STATUS_LOCAL,进入时需要在所所有的变量后面添加CPU_SR_ALLOC();)。
cpu_a.asm  :汇编方法实现CPU_IntDis、CPU_IntEn、CPU_SR_Save、CPU_SR_Restore、CPU_WaitForInt、CPU_WaitForInt、CPU_CntLeadZeros、CPU_CntTrailZeros)。
cpu_c.c  :针对特定CPU结构写的C函数BitBand、中断相关的操作)(在系统中没有用到...)。
cpu_cfg.h  :是否开启设置CPU_Name功能,是否开启CPU的时间戳功能,是否测量中断关闭时间、是否有CLZ指令的汇编实现

uC/OS Port:
os_cpu.h  :OS_TASK_SW()、OSIntCtxSw()宏声明、OSStartHighRdy()等方法声明。
os_cpu_a.asm  :PendSV_Handler()、OSStartHighRdy()的汇编实现。
os_cpu_c.c  :移植需要的:系统调用的钩子函数、创建任务时对堆栈格式的初始化,SysTick的初始化和中断处理。

os_app_hooks.c  :用户对OS调用的所有的钩子函数的实现,并且需要在OSInit()调用后设置对应的钩子函数(OSInit()将钩子函数的指针清空)
os_cfg.h :配置OS中使用的模块和特性。
os_cfg_app.h  :应用参数配置(例如:message pool大小,中断使用的堆栈大小,Idle任务堆栈大小,处理中断任务堆栈和队列大小,统计任务优先级、频率、堆栈大小,SysTick频率、任务优先级、堆栈大小、Spoke,软件定时器任务优先级、频率、堆栈大小、Spoke)。


os_var.c :OS全局变量(无内容)。
os_dbg.c  :Debugger用到的常量。
os_type.h  :根据CPU模块使用的数据类型typedef部分OS模块使用的数据类型。
os_cfg_app.c  :根据os_cfg_app.h中的配置,声明变量和数组(Idle任务堆栈,处理中断任务堆栈和队列,中断使用堆栈,message pool,统计任务堆栈,SysTick堆栈和Wheel数组,软件定时器堆栈和Wheel数组)。
os_prio.c  :管理bitmap table相关代码。

os.h  :OS的主要头文件(常量、宏、全局变量、方法原型等)。
os_core.c  :OS的核心函数(例如:OSInit()初始化uC , OSSched()任务级别调度 , OSIntExit() 中断级别调度,pend,post,Pend List,Ready List管理等)。
os_tick.c  :管理任务延时或者内核对象需要timeout的相关代码。
os_time.c  :任务延时代码、System Tick中断处理函数调用的OSTimeTick。
os_tmr.c :管理软件定时器。
os_task.c  :任务管理相关的代码(OSTaskCreate()  OSTaskDel()  OSTaskChangePrio()...)。
os_msg.c :处理OS_MSG_Q相关的代码、初始化OSMsgPool。
os_q.c  :管理message queue相关代码。
os_sem.c  :管理信号量(用于资源管理和同步)相关代码。
os_mutex.c  :互斥信号量相关代码。
os_mem.c :固定大小内存管理相关。
os_flag.c  :flag相关代码。
os_int.c :中断Deferred Post相关代码(当OS_CFG_ISR_POST_DEFERRED_EN == 1 (os_cfg.h))。
os_pend_multi.c  :任务等待多个信号量和队列相关代码。
os_stat.c :统计任务相关的代码。



Timestamp:使用DWT_CYCCNT,为系统时间戳(系统周期计数(clock cycles),与CPU的时钟频率相同)。
SysTick:使用SysTick timer,为系统延时(OSTimeDly())、定时(timeout)等提供服务。

0 0
原创粉丝点击