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里的源码
UCOS II 源码分析一的更多相关文章
- 【JUC】JDK1.8源码分析之ReentrantReadWriteLock(七)
一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁 ...
- angular源码分析:angular中脏活累活的承担者之$interpolate
一.首先抛出两个问题 问题一:在angular中我们绑定数据最基本的方式是用两个大括号将$scope的变量包裹起来,那么如果想将大括号换成其他什么符号,比如换成[{与}],可不可以呢,如果可以在哪里配 ...
- AngularJS 源码分析1
AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个 ...
- angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)
昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...
- angular源码分析:angular中jqLite的实现——你可以丢掉jQuery了
一.从function JQLite(element)函数开始. function JQLite(element) { if (element instanceof JQLite) { //情况1 r ...
- angularjs源码分析之:angularjs执行流程
angularjs用了快一个月了,最难的不是代码本身,而是学会怎么用angular的思路思考问题.其中涉及到很多概念,比如:directive,controller,service,compile,l ...
- Hadoop RCFile存储格式详解(源码分析、代码示例)
RCFile RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件. 关键词:Reco ...
- 4 weekend110的textinputformat对切片规划的源码分析 + 倒排索引的mr实现 + 多个job在同一个main方法中提交
好的,现在,来weekend110的textinputformat对切片规划的源码分析, Inputformat默认是textinputformat,一通百通. 这就是今天,weekend110的te ...
- Python_Selenium2Library源码分析
I. Introduction Selenium2Library是robot framework中主流的测试网页功能的库, 它的本质是对webdriver的二次封装, 以适应robot框架. 百度上一 ...
- heapster源码分析——kubelet的api调用分析
一.heapster简介 什么是Heapster? Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS.Kubernetes有个出名的监控agent---cAd ...
随机推荐
- Spring------bean基础配置
Bean基础配置 Bean的别名配置: 在执勤已经定义好id的基础上,如果对该名称并不是很满意,但是又不是很想要去修改许多又利用到它的地方,可以选择在ApplicationContext.xml中配置 ...
- ChatGPT|一文读懂GPT-4!
前言 大家好,今天早上一早醒来,发现各大科技圈公众号平台开始刷屏OpenAI发布的新模型GPT4.0,看这个版本号就已经知道又是一大波特性的更新. 于是立马起来开始学习! GPT-4 发布视频(202 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门解析非结构化数据应用——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- Java BasePooledObjectFactory 对象池化技术
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类 一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象.池的用户可以 ...
- 集合-LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- kube-apiserver启动命令参数解释
在apiserver启动时候会有很多参数来配置启动命令,有些时候不是很明白这些参数具体指的是什么意思. 我的kube-apiserver启动命令参数: cat > /usr/lib/system ...
- [Java SE/JDK]Intellij IDEA中设置JDK版本
1 Intellij IDEA 修改JDK版本 第1步:配置JDK环境变量 装好JDK之后,要添加一个环境变量:JAVA_HOME 第2步:修改Idea配置 由Maven决定的版本 <build ...
- 【Vue】三
Vue组件 非单文件组件 一个文件包含多个组件 单文件组件 一个文件只包含一个组件,vue文件初始化:vueInit <template lang=""> <di ...
- 家用wife密码设置
1.在浏览器上面输入ip地址:http://192.168.1.1/或http://192.168.0.1/出现路由器登陆窗口输入用户名跟密码.用户名默认一般为:admin,密码为空或为:admin ...
- 基于Mongodb分布式锁简单实现,解决定时任务并发执行问题
前言 我们日常开发过程,会有一些定时任务的代码来统计一些系统运行数据,但是我们应用有需要部署多个实例,传统的通过配置文件来控制定时任务是否启动又太过繁琐,而且还经常出错,导致一些异常数据的产生 网上有 ...