分析源码: 得先学会读文档, 函数前边的 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)  //清除栈内存,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

源码分析 ucosii/source 任务源码详细分析的更多相关文章

  1. Linux内核TCP MSS机制详细分析

    前言 上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了.[2] ...

  2. Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeHierachy+DraweeController的分析

    4.1.5.2 模型层DraweeHierachy继承体系以及各个类的作用 DraweeHierachy (I) --| SettableDraweeHierarchy (I) ------| Gen ...

  3. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动

    Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  4. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动

    Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...

  5. kube-scheduler源码分析(1)-初始化与启动分析

    kube-scheduler源码分析(1)-初始化与启动分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...

  6. Spring源码分析——BeanFactory体系之抽象类、类分析(二)

    上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之 ...

  7. Spring源码分析——BeanFactory体系之抽象类、类分析(一)

    上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactor ...

  8. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  9. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

随机推荐

  1. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  2. 卷积神经网络CNN

    卷积神经网络,在图像识别和自然语言处理中有很大的作用,讲cnn的中文博客也不少,但是个人感觉说的脉络清晰清晰易懂的不多. 无意中看到这篇博客,写的很好,图文并茂.建议英文好的直接去看原文.英文不好的就 ...

  3. 从零开始学安全(四十)●上传文件MIME类型绕过漏洞防御

    MIME检测原理 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的. php示例代码: if($_FILES['userfile']['type' ...

  4. java_IO流

    IO流概述及分类 Reader  InputStream  OutputStream  Writer都是Object的直接子类 字节流: 字节输入流 InputStream(抽象类) |---File ...

  5. 20190421-那些年使用过的CSS预处理器(CSS Preprocessor)

    写在前面的乱七八糟的前言: emmm,不得不说,早上七点是个好时间,公园里跳广场舞的大妈,街边卖菜刀看报的大爷,又不得不说,广州图书馆是个好地方,该有的安静,该有的人气,听着楼下小孩子的声音,看着周围 ...

  6. Kail Linux的安装方法

    众所周知,kail 是一个基于Debian的Linux发行版,它的目标就是为了在一个实用的工具包里尽可能多的包含渗透和审计工具 kail就实现了这个目标,里面包含有很多关于安全测试的开源工具,如果现在 ...

  7. SSIS中xml的输入输出

    输出为XML的两种方法 1.用数据流, 将平面文件作为DES输出 在SQL里将要输出的数据查询成为单列的字符串: SELECT (SELECT * FROM A FOR XML ROOT('A'),E ...

  8. java有关 String char 常见问题 编辑中

    1 输入输出有关 Scanner 的next()方法 返回值是String 所以尝试获得char时 应该用input.next().charAt[0] 2 空值 String 中null是指 对象引用 ...

  9. Web前端教程-HTML及标签的使用

    目录 1. HTML简介 1.1. HTML文档基本结构 2. 标签 2.1. 标签语法 1.2. 标签的属性和值 1.3. 常见的标签 1. 基础标签 2. 格式标签 3. 表单标签 4. 框架标签 ...

  10. Kafka integration with Ganglia

    In this blog post I will show you kafka integration with ganglia, this is very interesting & imp ...