最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下ucosii的学习,记录如下:

上一篇文章分析了ucosii源码文件组织结构以及简单介绍了各个文件夹里对应文件的功能,要是对ucosii源码文件组织结构还不了解的可以看上篇文章:

UCOS II源码分析一

一、如何使用ucosii

俗话说,一位合格的煮饭工程师,不仅要学会煮饭,还要学会电饭锅的组成原理以及实现原理,这样煮饭时才能稳如老狗(面试造火箭,工作拧螺丝)。开个玩笑,言归正传:我们先学会如何使用ucosii,在学习其原理。这里先简单介绍下如何使用

OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
OSStart();
1、OSInit():初始化ucos
2、OSTaskCreate创建任务
3、开始运行ucos

二、OSInit()函数分析

首先,在单片机编程中,大家最熟悉的就是各种初始化设置,比如使用单片机,需要IO、时钟、中断、以及外设(如各种传感器)等的初始化工作,毫无疑问,使用ucosii也需要对它进行初始化工作,它的初始化工作已经封装成一个函数提供给我们了:OSInit(),下面即是分析这个初始化函数到底初始化了什么。这个函数在源码文件夹CORE文件夹里,我们可以找到一个名字叫os_core.c的源码文件,打开它(我用的是vscode,你也可以使用source insight,怎么方便怎么来)映入眼帘的就是文件注释:意思就是ucosii源码可以白嫖,但请不要白嫖的太过分。

/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* CORE FUNCTIONS
*
* (c) Copyright 1992-2009, Micrium, Weston, FL
* All Rights Reserved
*
* File : OS_CORE.C
* By : Jean J. Labrosse
* Version : V2.91
*
* LICENSING TERMS:
* ---------------
* uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research.
* If you plan on using uC/OS-II in a commercial product you need to contact Micri�m to properly license
* its use in your product. We provide ALL the source code for your convenience and to help you experience
* uC/OS-II. The fact that the source is provided does NOT mean that you can use it without paying a
* licensing fee.
*********************************************************************************************************
*/

将近2000行的代码,看着都可怕,定位到我们想深入了解的函数 OSInit(),函数前作者非常规范的很简洁的写了函数注释,有一些自动生成代码注释的插件,如Doxygen Documentation Generator和Visual Assist x等,我用的vscode编辑器,安装了Doxygen Documentation Generator插件,直接在源文件里输入/**敲回车即可直接生成注释文档,效果如下:

/**
* @file main.c
* @author your name (you@domain.com)
* @brief
* @version 0.1
* @date 2022-06-01
*
* @copyright Copyright (c) 2022
*
*/

方便的不行,一名优秀的程序员,注释还是得好好写一写的。谁也不想让别人读自己的代码时,说一句:oh,shit!又跑题了,言归正传, OSInit()函数注释如下:

/*
*********************************************************************************************************
* INITIALIZATION
*
* Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
* creating any uC/OS-II object and, prior to calling OSStart().
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/

大致意思就是:

1、这个函数是对ucos做初始化工作

2、这个函数必须在创建任务前调用

3、这个函数必须在调用OSStart()前调用

这不是刚好吻合前面提到的如何使用ucosii

OSInit();
OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
OSStart();

三、真正的OSInit()函数源码

void  OSInit (void)
{
OSInitHookBegin(); /* Call port specific initialization code */ OS_InitMisc(); /* Initialize miscellaneous variables */ OS_InitRdyList(); /* Initialize the Ready List */ OS_InitTCBList(); /* Initialize the free list of OS_TCBs */ OS_InitEventList(); /* Initialize the free list of OS_EVENTs */ #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
OS_FlagInit(); /* Initialize the event flag structures */
#endif #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)
OS_MemInit(); /* Initialize the memory manager */
#endif #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u)
OS_QInit(); /* Initialize the message queue structures */
#endif OS_InitTaskIdle(); /* Create the Idle Task */
#if OS_TASK_STAT_EN > 0u
OS_InitTaskStat(); /* Create the Statistic Task */
#endif #if OS_TMR_EN > 0u
OSTmr_Init(); /* Initialize the Timer Manager */
#endif OSInitHookEnd(); /* Call port specific init. code */ #if OS_DEBUG_EN > 0u
OSDebugInit();
#endif
}

晚上11点了,来不及分析了,先打好框架,以后有空再分析,溜了溜了

3.1 OSInitHookBegin()

我又回来了,接着上次的地方继续学习ucosii的源码

说实话,OSInit()函数里包含了一系列的初始化函数,代码书写之规范很值得模仿。OSInitHookBegin这个函数在os_cpu_c.c文件里,这个文件开头就有文件注释如下:

/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
*
* (c) Copyright 2006, Micrium, Weston, FL
* All Rights Reserved
*
* ARM Cortex-M3 Port
*
* File : OS_CPU_C.C
* Version : V2.86
* By : Jean J. Labrosse
*
* For : ARMv7M Cortex-M3
* Mode : Thumb2
* Toolchain : RealView Development Suite
* RealView Microcontroller Development Kit (MDK)
* ARM Developer Suite (ADS)
* Keil uVision
*********************************************************************************************************
*/

比较重要的是

For       : ARMv7M Cortex-M3
Mode : Thumb2

意思是这个文件是针对ARMv7架构,M3内核,指令集使用的是Thumb2(具体这几个概念是啥可自行百度),这里简单介绍一下:

进入OSInitHookBegin函数后即可看到函数注释

/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (BEGINNING)
*
* Description: This function is called by OSInit() at the beginning of OSInit().
*
* Arguments : none
*
* Note(s) : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/

注释说了,调用这个钩子函数时应该失能中断,但我看源码里也没有进行关中断呀,不理解不理解,有知道的小伙伴可以留言点拨一下,不甚感激

OSInitHookBegin函数源码如下:

#if OS_TMR_EN > 0
static INT16U OSTmrCtr;
#endif #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookBegin (void)
{
#if OS_TMR_EN > 0
OSTmrCtr = 0;
#endif
}
#endif

函数里等于啥也没干,就把OSTmrCtr 赋值为0,前提是使用定时任务时。注意OSTmrCtr 变量是static变量,主要用来在定时任务中做++操作,具体ucos的定时功能详解以后再分析,这里就浅尝辄止,只需知道OSTmrCtr是一个统计变量,做++操作。那么问题了,众所周知, static全局变量默认初始化就是0,那么为什么在操作系统初始化时多此一举再赋值呢?我想作者是为了考虑系统可能会出现异常复位的情况,这样就很有必要将定时器计数器清零。

至此,OSInitHookBegin函数作用如下:

1、将定时器变量OSTmrCtr清0;

2、是钩子函数,所谓钩子函数意思就是用户可以调用,用户想在哪里想在什么时候调用都可以,比如将定时器复位,就可以调用它。用户也可以在这个钩子函数里加入其他功能代码。

3.2 OS_InitMisc()

3.3 OS_InitRdyList()

3.4 OS_InitTCBList()

3.5 OS_InitEventList()

3.6 OS_FlagInit()

3.7 OS_MemInit()

3.8 OS_QInit()

3.9 OS_InitTaskIdle()

3.10 OS_InitTaskStat()

3.11 OSTmr_Init()

3.13 OSInitHookEnd()

3.14 OSDebugInit()

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

  1. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  2. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  3. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  4. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  5. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

  6. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  7. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  8. spring源码分析(二)Aop

    创建日期:2016.08.19 修改日期:2016.08.20-2016.08.21 交流QQ:992591601 参考资料:<spring源码深度解析>.<spring技术内幕&g ...

  9. ConcurrenHashMap源码分析(二)

    本篇博客的目录: 一:put方法源码 二:get方法源码 三:rehash的过程 四:总结 一:put方法的源码 首先,我们来看一下segment内部类中put方法的源码,这个方法它是segment片 ...

  10. spark(1.1) mllib 源码分析(二)-相关系数

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4024733.html 在spark mllib 1.1版本中增加stat包,里面包含了一些统计相关的函数 ...

随机推荐

  1. 使用RPA有什么好处

    通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...

  2. Linux & 标准C语言学习 <DAY14>

    一.头文件     头文件可能会被任意源文件包含,意味着头文件中的内容可能会在多个目标文件中存在,要保证合并时不要冲突     重点:头文件只编写声明语句,不能有定义语句         1.头文件应 ...

  3. 用户地址管理---新增、设置默认地址、根据id查询所有地址、查询默认地址、查询指定用户的全部地址

    导入用户地址簿相关功能代码 需求分析: 地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息.同一个用户可以有多个地址信息,但是只能有一个默认地址. 用户的地址信息会存储在a ...

  4. 改进 hibernate-validator,新一代校验框架 validator 使用介绍 v0.4

    项目介绍 java 开发中,参数校验是非常常见的需求.但是 hibernate-validator 在使用过程中,依然会存在一些问题. validator 在 hibernate-validator ...

  5. IO 流分类

    更多内容,前往 IT-BLOG 一.File File 类(磁盘操作)可以用于表示文件和目录的信息,但是它不表示文件的内容.递归地列出一个目录下所有文件: 1 public static void l ...

  6. JS逆向实战12——某店 captchaToken 参数 加密

    今天爬取的是网站需要模拟登陆 目标网站 aHR0cHM6Ly9wYXNzcG9ydC55aGQuY29tL3Bhc3Nwb3J0L2xvZ2luX2lucHV0LmRv 浏览器抓包分析 随便输入一堆假 ...

  7. Rainbond的 Gateway API 插件制作实践

    Gateway API 作为新一代的流量管理标准,对原有 Ingress 的扩展不规范.移植性差等问题做出了改进.从兼容K8s生态和优化网关体验出发,Rainbond 支持以插件的形式扩展平台网关能力 ...

  8. 网络调试助手|网络调试助手(CM精装版) V4.1.0 绿色版

    http://www.winwin7.com/soft/16987.html#xiazai 网络调试助手软件功能 1.支持UDP,TCP协议2.支持单播/广播,集成TCP服务器和客户端3.支持ASCI ...

  9. 方差分析2——双因素方差分析(R语言)

    双因素方差分析(Double factor variance analysis) 有两种类型:一个是无交互作用的双因素方差分析,它假定因素A和因素B的效应之间是相互独立的,不存在相互关系:另一个是有交 ...

  10. 统计数据异常值的处理——R语言

    在数据分析工作中,面对收集而来的数据,数据清洗是首要环节.异常值(outlier)是数据清洗的重要环节,异常值可能直接会导致后面的数据分析.建模工作出现偏差,下面就给大家介绍一下如何处理数据中的异常值 ...