最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下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. 关于jsp页面中的小细节们

    细节一:利用jsp判断文本框的输入格式是否正确 也就是主要利用script标签进行判断,主要用到的是正则表达式(判断是否为整数): 再加上if语句的配合,就能够在文本框的格式不正确时,发出错误警告啦! ...

  2. Solr 入门配置

    大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗,并且它们由于沉重的数据库加载而拖垮你的应用的性能.这就是为什么转移负载到一个外部的搜索服务器是一个不错的注意,Apache ...

  3. abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3上(五十八)

    Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  4. ASP.NET Core - 选项系统之选项验证

      就像 Web Api 接口可以对入参进行验证,避免用户传入非法的或者不符合我们预期的参数一样,选项也可以对配置源的内容进行验证,避免配置中的值与选项类中的属性不对应或者不满足预期,毕竟大部分配置都 ...

  5. 使用GithubAction自动构建部署项目

    目录 1.1 项目准备 2.1 GithubAction设置 3.1 运行测试 4.1 小结 GitHub Actions 是一种持续集成和持续交付(CI/CD) 平台,可用于自动执行生成.测试和部署 ...

  6. 一文快速入门任务调度框架-Quartz

    前言 还不会 Quartz?如果你还没有接触过Quartz,那么你可能错过了一个很棒的任务调度框架!Quartz 提供了一种灵活.可靠的方式来管理和执行定时任务,让咱们的定时任务更加优雅.本篇文章将为 ...

  7. THM-被动侦察和主动侦查

    被动与主动侦察 在计算机系统和网络出现之前,孙子兵法在孙子兵法中教导说:"知己知彼,必胜不疑." 如果您扮演攻击者的角色,则需要收集有关目标系统的信息.如果你扮演防御者的角色,你需 ...

  8. API获取商品评论?

    前言 小伙伴们好,前两天因为个人原因耽误了内容的更新,在这里和所有的小伙伴道个歉,今天CC和大家唠唠商品评论的这个话题,大家在网上购物的决策会因为<商品评论的好坏>吗,相信绝大的一部分的小 ...

  9. Chrome浏览器插件 Undo Close Tab (恢复关掉的标签页)

    背景 如果您经常使用Chrome浏览器,也许有时候会意外关闭一个标签页,从而丢失您正在查看的内容.这时您可能会感到非常烦恼,并希望能够迅速找回这个标签页.当然,您可以通过点击浏览器历史记录中的条目来找 ...

  10. 二进制安装Kubernetes(k8s) v1.23.7 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.23.7 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更新 ...