最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下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. Javaweb学习笔记第四弹

    JDBC API详解 1.DriverManager作用: 1.注册驱动 registerDriver 2.获取数据库连接 getConnection 参数:1.url jdbc:mysql://lo ...

  2. 服务器资源监测脚本(网卡、MEM、CPU)

    #-*- coding: utf-8 -*- #!/usr/bin/python ''' 用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ] 主选项和报告: ...

  3. PGF 概率生成函数 Probability generating function

    Probability Mass Function 离散随机变量的分布函数PMF 目录 随机结构举例 two classical combinatorial distributions PGF Pro ...

  4. 剑指 offer 第 1 天

    第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部 ...

  5. ES6中的解构赋值(数组,对象,嵌套,默认值)

    解构赋值 通过解构赋值,可以快速从对象或者数组中取出属性或者数值. 解构赋值 可以通过定位到数组或者对象的某一个位置,将值直接赋给一个或多个变量. const arr = ['dasha', 'ers ...

  6. 基于开源的 ChatGPT Web UI 项目,快速构建属于自己的 ChatGPT 站点

    作为一个技术博主,了不起比较喜欢各种折腾,之前给大家介绍过 ChatGPT 接入微信,钉钉和知识星球(如果没看过的可以翻翻前面的文章),最近再看开源项目的时候,发现了一个 ChatGPT Web UI ...

  7. 深入理解 python 虚拟机:字节码灵魂——Code obejct

    深入理解 python 虚拟机:字节码灵魂--Code obejct 在本篇文章当中主要给大家深入介绍在 cpython 当中非常重要的一个数据结构 code object! 在上一篇文章 深入理解 ...

  8. vue之过滤、筛选功能的实现

    目录 需求 代码 需求 给定一个列表(模拟数据),根据用户输入,自动筛选输入的内容并输出到屏幕 代码 <!DOCTYPE html> <html lang="en" ...

  9. 自编写二进制安装kubernetes脚本v2.0版本

    一键安装 二进制安装Kubernetes(k8s) v2.0 手动安装:https://github.com/cby-chen/Kubernetes 脚本安装:https://github.com/c ...

  10. MySQL(五)配置文件、系统变量与MySQL架构

    1 配置文件的使用 my.cnf配置文件 /etc/my.cnf: [root@hadoop103 ~]# cat /etc/my.cnf # For advice on how to change ...