UCOS II源码分析二
最近大家都沉浸在找到实习的快乐中,自我充电的时间相对减少了,今天重拾一下ucosii的学习,记录如下:
上一篇文章分析了ucosii源码文件组织结构以及简单介绍了各个文件夹里对应文件的功能,要是对ucosii源码文件组织结构还不了解的可以看上篇文章:
一、如何使用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源码分析二的更多相关文章
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- 框架-springmvc源码分析(二)
框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- 十、Spring之BeanFactory源码分析(二)
Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
- 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>
目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- spring源码分析(二)Aop
创建日期:2016.08.19 修改日期:2016.08.20-2016.08.21 交流QQ:992591601 参考资料:<spring源码深度解析>.<spring技术内幕&g ...
- ConcurrenHashMap源码分析(二)
本篇博客的目录: 一:put方法源码 二:get方法源码 三:rehash的过程 四:总结 一:put方法的源码 首先,我们来看一下segment内部类中put方法的源码,这个方法它是segment片 ...
- spark(1.1) mllib 源码分析(二)-相关系数
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4024733.html 在spark mllib 1.1版本中增加stat包,里面包含了一些统计相关的函数 ...
随机推荐
- 痞子衡嵌入式:MCUXpresso IDE下生成镜像文件的方法及其与IAR,MDK差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下生成镜像文件的方法及其与IAR,MDK差异. 痞子衡很久以前写过一篇文章 <ARM Cortex-M ...
- Spring--事务角色+事务属性
事务管理员 发起事务方,在Spring中通常指代业务层开启事务的方法 也就是相当于这个: 事务协调员 加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法 也就是相当于这个: 事务相关配 ...
- sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)
小志志和小峰峰的日常 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小志志和小峰峰特别喜欢一起讨论一些很好玩的问题. ...
- 卡特兰路径和q,t-enumeration 学一半的笔记
目录 卡特兰 The1st q-analogue of \(C_n\) The 2nd q-analogue of \(C_n\) /定义\(C_n(q)\) The q-Vandermonde co ...
- 能快速构建和定制网络拓扑图的WPF开源项目-NodeNetwork
大家好,我是沙漠尽头的狼,今天介绍一个WPF开源项目-NodeNetwork,它可以帮助我们快速构建和定制网络拓扑图. 一.前言 在现代软件开发中,数据可视化和可交互性越来越受到关注.为了实现这一点, ...
- mybatis-spring注解MapperScan的原理
很多开发者应该都知道,我们只使用@MapperScan这个注解就可以把我们写的Mybatis的Mapper接口加载到Spring的容器中,不需要对每个Mapper接口加@Mapper这个注解了,加快了 ...
- MySQL 索引的种类
我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 一.平衡多路查 ...
- 安装Windows10后电脑整体速度变慢
是不是觉得从旧版本Windows系统比如(Windows 7)升级到Windows10以后,感觉什么操作都变慢了.譬如打开文件夹,游戏加载速度变缓慢.尤其是腾讯WeGame软件进入游戏前的检测速度明显 ...
- WebSocket服务器
//创建websocket 服务器 ws_server.php //https://wiki.swoole.com/wiki/page/479.html //创建websocket服务器对象,监听0 ...
- Teamcenter_SOA开发:使用SOA登录Teamcenter
本文Teamcenter SOA使用C++参考SOA的例子进行编写,以下代码为登录Teamcenter,代码工程在Teamcenter四层环境下运行. SOA的库文件.样例文件.帮助文件在Teamce ...