分析源码: 得先学会读文档, 函数前边的 note ;是了解该程序员的思想的途径。不得不重视 代码前边的 Notes,了解思想后,然后在分析代码时看他是如何具体实现的。
1、 ucosii/source/ucosii.h
全局变量(GLOBAL VARIABLES)的定义:
OS_EXT INT32U OSCtxSwCtr /* Counter of number of context switches记录操作系统切换上下文的次数*/
OSEventFreeList; event空闲链表
OSEventTbl[OS_MAX_EVENTS]; 全局event数组
OSCPUUsage; cpu使用率。
OSIdleCtrMax; 1秒钟之内空闲计数。
OSIdleCtrRun; 1秒内空闲任务空闲计数器
OSTime; /**/操作系统的当前时间
OSStatRdy Flag变量(标志位)指示当前任务是否rdy。
OSTaskStatStk[OS_TASK_STAT_STK_SIZE]; 统计任务的任务栈,(给统计任务规定的任务栈。)
OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE] 空闲任务的任务栈,(给空闲任务规定的任务栈。)
OSIntNesting /*Interrupt nesting level*/ 中断嵌套级别。作用:判断是否处于中断
OSLockNesting /*Multitasking lock nesting level*/ 锁嵌套级别,
OSPrioCur /*Priority of current task*/ 当前正在运行的任务的优先级
OSPrioHighRdy /* Priority of highest priority task*/ 最高优先级任务的优先级。
OSRdyGrp; /* Ready list group */
OSRdyTbl[OS_RDY_TBL_SIZE] /* Table of tasks which are ready to run */
OSUnMapTbl[256] 常数数组表和计算当前的OSPrioHighRdy有关。
OSRunning /*Flag indicating that kernel is running*/ OS如果没有完成初始化就为0,初始化ok可以开始调度任务了,就设置为1。
INT8U OSTaskCtr /* Number of tasks created */ //当前一共有几个任务。
OSIdleCtr /* Idle counter */ // 空闲计数
OSTCBCur /*Pointer to currently running TCB*/ // 指向当前任务的TCB的指针
OSTCBFreeList /* Pointer to doubly linked list of TCBs*/指向当前空闲TCB的数组的指针
也就是说我们系统有一个链表专门把处于空闲状态的tcb内存用数组连起来。
OSTCBHighRdy /*Pointer to highest priority TCB R-to-R*/
OSTCBList /*Pointer to doubly linked list of TCBs*/
OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS] /* /** OS_N_SYS_TASKS**系统创建的任务/ Table of TCBs */
//数组
OSMemFreeList; /*Pointer to free list of memory partitions */
OSMemTbl[OS_MAX_MEM_PART]; /* Storage for memory partition manager*/
OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS]; /* Table of TCBs*/
OS_EXT OS_TCB *OSTCBFreeList; /* Pointer to list of free TCBs*/
2、 ucosii/source/os_time.c
OSTimeDly () //任务执行时遇到的延时时,这个函数会把当前任务设置成非就绪态(操作就绪表),就是把当前任务挂起。
OSTimeDlyResume(INT8U prio) //恢复任务
ptcb->OSTCBDly = 0; //将任务中的ptcb->OSTCBDly = 0;
PEND和SUSPEND的区别:
PEND和(PEND_TO、PEND_OK)等相对应。pend关注的是当前任务在等待某个event(sem、mutex、等)
SUSPEND和我们的RDY对应,用来描述任务当前的状态,RDY表示任务处于就绪态,SUSPEND表示任务处于非就绪态(挂起态)。
DIY只能自己DIY自己,
3、 ucosii/source/os_task.c
1、INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
OS_EVENT_EN //只有一个事件
OS_EVENT_MULTI_EN //包含多个事件标志
#if (OS_EVENT_EN)
pevent = ptcb->OSTCBEventPtr; //只有一个事件
if (pevent != (OS_EVENT *)0)
{
pevent->OSEventTbl[y_old] &= ~bitx_old; /* Remove old task prio from wait list */
if (pevent->OSEventTbl[y_old] == 0)
{
pevent->OSEventGrp &= ~bity_old;
}
pevent->OSEventGrp |= bity_new; /* Add new task prio to wait list */
pevent->OSEventTbl[y_new] |= bitx_new;
}
#if (OS_EVENT_MULTI_EN > 0) // 包含多个事件标志
if (ptcb->OSTCBEventMultiPtr != (OS_EVENT **)0)
{
pevents = ptcb->OSTCBEventMultiPtr;
pevent = *pevents;
while (pevent != (OS_EVENT *)0)
{
pevent->OSEventTbl[y_old] &= ~bitx_old; /* Remove old task prio from wait lists */
if (pevent->OSEventTbl[y_old] == 0)
{
pevent->OSEventGrp &= ~bity_old;
}
pevent->OSEventGrp |= bity_new; /* Add new task prio to wait lists */
pevent->OSEventTbl[y_new] |= bitx_new;
pevents++;
pevent = *pevents;
}
2、INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
{
}
ucosii/source/os_core.c
INT8U OS_TCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt)
{
ptcb = OSTCBFreeList; //ptcb指针指向 FreeList 空,在freelist中早就开辟了任务块的大小。
//刚开始是指向第一个,再创建的话OSTCBFreeList加1;
}
节点间通过全局变量OSTCBList指针来挂接。OSTCBList指向一个双向链表,这个双向链表中的每一个元素都是一个已经被创建了个任务的TCB结构体, OSTCBList 永远指向最新创建的任务。 任务的插入的时候,直接用OSTCBList 。而双向链表的新元素插入方式是头插入。OSTCBList指向所有任务双链表的链表头,
3、OSTaskCreateExt()
4、INT8U OSTaskDel (INT8U prio) //删除任务,并不是真的删除这个任务,因为任务的TCB结构体是一个数组,数组是
//是事先定义好的,OSTCBFreeList 指针 只能往后移,不能往前移。一个任务一旦被创建,这个任务对应的内存格子就被占用了,当前任务的内存无法释放,让别的数据结构来使用。
ucosii任务状态:运行态(活动态)、就绪态、挂起态(等待一个event,比如调用diy函数,或者等待一个信号量)、休眠态(删除任务) 重视函数的 Notes 按照此思路分析源码。
ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from updating */
ptcb->OSTCBStat = OS_STAT_RDY; /* Prevent task from being resumed ucosii中就绪表是最重要的*/
ptcb->OSTCBStatPend = OS_STAT_PEND_OK;
5、 此时将 ptcb->OSTCBDly = 0;
void OS_CPU_SysTickHandler (void)中 有 任务切换。待会截图。
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)


7、 ptcb->OSTCBNext = OSTCBFreeList; /* Return TCB to free TCB list */
OSTCBFreeList = ptcb; //删除的节点可以回收,指针会挂接
OSTCBFreeList 之后在画图分析。 太累了。先回寝室了。
8、#if OS_TASK_DEL_EN > 0 //配置宏,如果不需要删除任务,可以将此配置宏配置为0;
INT8U OSTaskDelReq (INT8U prio)
(1)//让任务A申请去删除有资源未释放的任务B,他不能用于一个任务删除自身,
(2)这个函数工作时在任务A和B中都需要被调用,实现就是围绕 ptcb->OSTCBDelReq 是否与OS_ERR_TASK_DEL_REQ 相等 。 在任务A中给这个元素赋值,在任务B中通过查这个元素的值来决定是否要删除自己。
9、INT8U OSTaskResume (INT8U prio) //恢复挂起的的任务,
10、OSTaskSuspend (INT8U prio)
SUSPEND A TASK//和OSTaskResume (INT8U prio)函数配套使用//恢复挂起的的任务,
11、OSTaskQuery (INT8U prio, OS_TCB *p_task_data) // //得到一个任务的TCB的一份的拷贝,
12、OS_TaskStkClr (OS_STK *pbos, INT32U size, INT16U opt) //清除栈内存,
- Linux内核TCP MSS机制详细分析
前言 上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了.[2] ...
- Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeHierachy+DraweeController的分析
4.1.5.2 模型层DraweeHierachy继承体系以及各个类的作用 DraweeHierachy (I) --| SettableDraweeHierarchy (I) ------| Gen ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动
Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...
- kube-scheduler源码分析(1)-初始化与启动分析
kube-scheduler源码分析(1)-初始化与启动分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(二)
上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...
- Spring源码分析——BeanFactory体系之抽象类、类分析(一)
上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactor ...
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- [转] jQuery源码分析-如何做jQuery源码分析
jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...
随机推荐
- 整合 MyPerf4J 做Java性能监控和统计工具
快速启动MyPerf4J MyPerf4J 采用 JavaAgent 配置方式,透明化接入应用,对应用代码完全没有侵入. 打包 项目地址: https://github.com/LinShunKang ...
- Java 中的几种线程池,你之前用对了吗
好久不发文章了,难道是因为忙,其实是因为懒.这是一篇关于线程池使用和基本原理的科普水文,如果你经常用到线程池,不知道你的用法标准不标准,是否有隐藏的 OOM 风险.不经常用线程池的同学,还有对几种线程 ...
- 调用链监控 CAT 之 URL埋点实践
URL监控埋点作用 一个http请求来了之后,会自动打点,能够记录每个url的访问情况,并将以此请求后续的调用链路串起来,可以在cat上查看logview 可以在cat Transaction及Eve ...
- Swiper4.x使用方法
1.首先加载插件,需要用到的文件有swiper.min.js和swiper.min.css文件.可下载Swiper文件或使用CDN. <!DOCTYPE html> <html> ...
- NextCloud前端支持播放mov文件
默认情况下,NextCloud网盘是不支持播放 .mov文件的. 通过修改前端代码就可以实现. 如下 1 找到 apps/files_videoplayer/js/viewer.js 文件 2 搜索 ...
- 为了约会,PM的领导能力篇来啦!
之前我们花了很大力气阐述PM的过程能力成熟度,为的是让PM把项目管理得心应手,早点下班.可再完美的过程也要人来做啊!兄弟们要是不爽了,你还有心思约会么?那怎么才能管好组里的兄弟,让他们好好执行过程,早 ...
- Simulink 产品说明
Simulink 产品说明 仿真和基于模型的设计 Simulink® 是一个模块图环境,用于多域仿真以及基于模型的设计.它支持系统级设计.仿真.自动代码生成以及嵌入式系统的连续测试和验证.Simuli ...
- (五)图数据库数neo4j据备份与恢复
1.备份方式 neo4j目前有三种备份方式: (1)java在线备份,通过java程序可在neo4j启动状态下备份数据,也可远程备份(社区版本目前不支持) (2)neo4j-admin工具,可在neo ...
- DES加密算法应用:分组加密模式
通常,大多数的分组加密算法都是把数据按照64位分组的方式进行加密和解密.但是几乎所有的加密工作所涉及的数据量都远远大于64位,因此就需要不断地重复加密过程,直到处理完所有的分组.这种分组加密中所涉及的 ...
- C# -- 使用线程池 ThreadPool 执行多线程任务
C# -- 使用线程池 ThreadPool 执行多线程任务 1. 使用线程池 class Program { static void Main(string[] args) { WaitCallba ...