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 ...
随机推荐
- 使用RPA有什么好处
通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...
- 一款基于js/jquery标签拖拽排序小组件
这是一个基于jQuery写的拖拽小组件,写了大概两三天,刚好可以在前端方面练练手.拖拽原理是使用绝对定位+鼠标元素位置实现. GitHub地址:https://water1996.github.io/ ...
- 全面了解 Redis 高级特性,实现高性能、高可靠的数据存储和处理
目录 高性能.高可用.高可扩展性的原理 持久化 RDB持久化 AOF持久化 持久化的配置 RDB配置 AOF配置 持久化的恢复 RDB的恢复 AOF的恢复 RDB和AOF的选择 持久化对性能的影响 数 ...
- 记录hive一次数据倾斜问题的解决以及思考总结
解决数据倾斜是大数据开发中比较重要的能力,这个现象指的是分布式集群中,由于数据分发的不当,导致某个节点要处理的错误过多,导致整个计算机任务迟迟结束不了,甚至可能节点出现OOM使得任务失败 处理数据倾斜 ...
- 剑指 offer 第 28 天
第 28 天 搜索与回溯算法(困难) 剑指 Offer 37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树. 你需要设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / ...
- GO实现Redis:GO实现Redis集群(5)
采用一致性hash算法将key分散到不同的节点,客户端可以连接到集群中任意一个节点 https://github.com/csgopher/go-redis 本文涉及以下文件: consistenth ...
- Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)
Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信) 前几天在 futureoflife 网站上有一封公开信,呼吁暂停大型人工智能 ...
- 聊聊spring中bean的作用域
前言 今天分享一下spring bean的作用域,理解bean的作用域能够在使用过程中避免一些问题,bean的作用域也是spring bean创建过程中一个重要的点. Spring bean的作用域类 ...
- 《Flask Web 开发指南 pt.2》
哈喽大家好,我是咸鱼 在<Flask Web 开发指南 pt.1>中,咸鱼跟大家介绍了 Flask 的由来--诞生于一个愚人节玩笑,简单介绍了一些关于 Flask 的概念,并且编写了一个简 ...
- Vue启用报错 RangeError: Invalid typed array length: -4095
近期开发的前端项目项目启用失败,记录下修复过程 RangeError: Invalid typed array length: -4095 错误原因:node版本问题,安装10.x.x 即可 重新安装 ...