再进行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里的源码

UCOS II 源码分析一的更多相关文章

  1. 【JUC】JDK1.8源码分析之ReentrantReadWriteLock(七)

    一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...

  2. angular源码分析:angular中脏活累活的承担者之$interpolate

    一.首先抛出两个问题 问题一:在angular中我们绑定数据最基本的方式是用两个大括号将$scope的变量包裹起来,那么如果想将大括号换成其他什么符号,比如换成[{与}],可不可以呢,如果可以在哪里配 ...

  3. AngularJS 源码分析1

    AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个 ...

  4. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  5. angular源码分析:angular中jqLite的实现——你可以丢掉jQuery了

    一.从function JQLite(element)函数开始. function JQLite(element) { if (element instanceof JQLite) { //情况1 r ...

  6. angularjs源码分析之:angularjs执行流程

    angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,l ...

  7. Hadoop RCFile存储格式详解(源码分析、代码示例)

    RCFile   RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件.   关键词:Reco ...

  8. 4 weekend110的textinputformat对切片规划的源码分析 + 倒排索引的mr实现 + 多个job在同一个main方法中提交

    好的,现在,来weekend110的textinputformat对切片规划的源码分析, Inputformat默认是textinputformat,一通百通. 这就是今天,weekend110的te ...

  9. Python_Selenium2Library源码分析

    I. Introduction Selenium2Library是robot framework中主流的测试网页功能的库, 它的本质是对webdriver的二次封装, 以适应robot框架. 百度上一 ...

  10. heapster源码分析——kubelet的api调用分析

    一.heapster简介 什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS.Kubernetes有个出名的监控agent---cAd ...

随机推荐

  1. 记录一次线上gitlab11.x升级gitlab14.x版本操作

    前言:gitlab11升级到14还是有挺多需要注意的坑,也算是做一次积累吧,升级前后,gitalb的WEB界面也变化了很多,升级过程需要注意的地方我放到最后说明,挺关键的 一.首先需要下载好要升级的包 ...

  2. 车企-TSP系统通用架构设计

    最近一年用于参与到了新能源车企的管理系统的开发,并且主要从事架构设计与重难点功能开发的工作,因此有了一些小心得,特此记录(PS:整体和甲方在需求上扯皮,以及协调所有供应商这些项目管理上的事情比做开发耗 ...

  3. Centos 7 配置Tomcat跳转Https

    前言:在网络安全盛行的时代下,有时业务为了安全需求要使用https协议,包括http.nginx.tomcat等,本篇简单分享一下tomcat跳转https配置. 1.环境 Centos 7.9 2. ...

  4. ArcGIS模型构建器ModelBuilder的使用方法

      本文介绍在ArcMap软件中,基于模型构建器(ModelBuilder)完成模型建立与使用的具体方法.   首先,在ArcMap软件中打开"ModelBuilder".   建 ...

  5. c++与linux详细计划,精确到每一天(仅80天)

    好的,以下是三个月中每一天的学习计划: 第一个月: 第1天:阅读C++教程,熟悉环境,了解基本语法和数据类型 第2天:编写Hello World程序,加深对C++环境的了解 第3天:学习函数的定义和调 ...

  6. ASP.NET Core - 选项系统之源码介绍

    .NET Core 选项系统的主要实现在 Microsoft.Extensions.Options 和 Microsoft.Extensions.Options.ConfigurationExtens ...

  7. [CTF]Caser-Pass-Tool1-C++工具

    刷pico遇到一个凯撒密码加密题,顺手写了个解密工具,但是暂时没有解决到边界字母的升降档问题 #include<iostream> using namespace std; int mai ...

  8. Centos7安装配置MySQL 5.6

    Centos7安装配置MySql 5.6 首先下载MySql5.6的安装包,具体安装方式分为yum安装与离线安装.在新版本的CentOS7中,默认的数据库已更新为了Mariadb,而非 MySQL. ...

  9. TypeScript 学习笔记 — 自定义类型:部分属性可选,反选 key,求对象交差并补集等(十三)

    目录 将部分属性变为可选属性 根据值的类型 反选 key 写法一:基础原理写法,使用不同的内置类型,Pick 和 Omit 写法二:基础原理写法,使用 Pick 内置类型 + 传参的方式 写法三:使用 ...

  10. [Linux]CentOS7 安装指定版本软件包

    以安装openssl-libs为例. 查看当前服务器中YUM源可安装的软件包版本 [root@iz2vc84t88x94kno0u49zwz ~]# yum list | grep openssl-l ...