UCOS II 源码分析一
再进行ucos操作系统源码分析前,先对ucos源码文件结构说个简单说明,只有掌握了源码文件结构才能在接下来的源码分析中逐渐感受到会当凌绝顶,
一览众山小,最后的感受就是RTOS也不是很神秘!下面以正点原子移植到stm32f4开发板上的ucos源码为例进行分析,关于如何将ucos移植到stm32的
详细教程可观看正点原子的官方stm32f4库开发指南。真的是保姆式教学,闲话不多说,切入正题:
你需要提前了解的技能:
阅读源码的工具:source insight或者vscode,这两款软件的优缺点对比,网上已经很多了,不做多说,这两款我都用过,目前主要用vscode
代码能力:需要提前掌握C语言的指针、结构体、内存管理、简单的ARM汇编指令、中断的理解
数据结构:基本的数组、栈、队列
任务通信机制:信号量、邮箱、消息队列、互斥锁等
如果以上都不会也没事(比如汇编我也不大会),边看边百度就可以。
ucosii(V2.91 版本)源码组织结构如下:UCOSII文件夹里面有三个文件夹,分别为CONFIG、CORE、PORT,这三个文件夹里就是源码了,主要是.c和.h文件
有一个特别的.asm文件,里面是汇编代码
UCOSII
CONFIG
includes.h
#ifndef __INCLUDES_H__ #define __INCLUDES_H__ #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #include <stdarg.h> #include "ucos_ii.h" #include "os_cpu.h" #include "os_cfg.h" #include <stm32f4xx.h> #endif
主要包含c语言标准库头文件和ucos相关的头文件,可以观察别人使用ucos时应用层代码都是#include "includes.h",说明此头文件是提供给用户使用的,当然了,ucos中的一些.c文件也可以使用,比如os_core.c文件也#include "includes.h"
os_cfg.h
#ifndef OS_CFG_H #define OS_CFG_H /* ---------------------- MISCELLANEOUS ----------------------- */ #define OS_APP_HOOKS_EN 0u /* Application-defined hooks are called from the uC/OS-II hooks */ /* --------------------- TASK STACK SIZE ---------------------- */ #define OS_TASK_TMR_STK_SIZE 128u /* Timer task stack size (# of OS_STK wide entries) */ /* --------------------- TASK MANAGEMENT ---------------------- */ #define OS_TASK_CHANGE_PRIO_EN 1u /* Include code for OSTaskChangePrio() */ #define OS_TASK_CREATE_EN 1u /* Include code for OSTaskCreate() */ /* ----------------------- EVENT FLAGS ------------------------ */ #define OS_FLAG_EN 1u /* Enable (1) or Disable (0) code generation for EVENT FLAGS */ #define OS_FLAG_ACCEPT_EN 1u /* Include code for OSFlagAccept() */ /* -------------------- MESSAGE MAILBOXES --------------------- */ #define OS_MBOX_EN 1u /* Enable (1) or Disable (0) code generation for MAILBOXES */ #define OS_MBOX_ACCEPT_EN 1u /* Include code for OSMboxAccept() */ /* --------------------- MEMORY MANAGEMENT -------------------- */ #define OS_MEM_EN 1u /* Enable (1) or Disable (0) code generation for MEMORY MANAGER */ /* ---------------- MUTUAL EXCLUSION SEMAPHORES --------------- */ #define OS_MUTEX_EN 1u /* Enable (1) or Disable (0) code generation for MUTEX */ /* ---------------------- MESSAGE QUEUES ---------------------- */ #define OS_Q_EN 1u /* Enable (1) or Disable (0) code generation for QUEUES */ #define OS_Q_ACCEPT_EN 1u /* Include code for OSQAccept() */ /* ------------------------ SEMAPHORES ------------------------ */ #define OS_SEM_EN 1u /* Enable (1) or Disable (0) code generation for SEMAPHORES */ #define OS_SEM_ACCEPT_EN 1u /* Include code for OSSemAccept() */ /* --------------------- TIME MANAGEMENT ---------------------- */ #define OS_TIME_DLY_HMSM_EN 1u /* Include code for OSTimeDlyHMSM() */ #define OS_TIME_DLY_RESUME_EN 1u /* Include code for OSTimeDlyResume() */ /* --------------------- TIMER MANAGEMENT --------------------- */ #define OS_TMR_EN 0u /* Enable (1) or Disable (0) code generation for TIMERS */ #define OS_TMR_CFG_MAX 16u /* Maximum number of timers */ #endif
上面只粘贴了一部分内容,正如其名,就是做了一些配置,全是宏定义,定义一堆常数,对比上面的includes.h文件可发现作者写代码真规范,把宏定义和include放在两个文件里,这样子暴露inlcudes.h文件给用户即可,实现信息的封装。里面主要是对任务堆栈、内存、通信机制、事件、定时器等所做的宏定义配置,这样只需修改此文件的常量即可实现对ucos对资源的配置管理
CORE
这个文件夹里的文件就是ucos的核心所在了,ucos提供的业务功能全在里面
os_core.c
os_flag.c
os_mbox.c
os_mem.c
os_mutex.c
os_q.c
os_sem.c
os_task.c
os_time.c
os_tmr.c
ucos_ii.c 这个文件比较特别,里面的内容是把CORE里所有的.c文件全部包含一遍,如果你的工程里包含了ucos_ii.c,则不能包含其他系统文件了,否则会报错;如果你把系统的其他C文件都包含到工程里了,则就不需要包含ucos_ii.c文件了。具体这个文件的用处我也不是很了解,但感觉跟编译器有关!
ucos_ii.h
PORT
此文件夹里包含的主要是和cpu相关的文件,移植到不同的单片机上需要修改这里的文件
os_cpu_a.asm
os_cpu_c.c
os_cpu.h
os_dbg_r.c
os_dbg.c
文件的组成结构就分析到这里了,后面有空会继续分析CORE和PORT里的源码