分析源码: 得先学会读文档, 函数前边的 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. Centos7+LVS-DR+keepalived实验(包含sorry-server、日志、及HTTP-GET的健康检测)

    目录检索 一.简介 1.lvs-dr原理请参考原理篇 2.keepalived原理请参考原理篇 3.基于lvs-dr+keepalived故障切换架构图如下: 二.部署 1.环境 2.准备RS的web ...

  2. ACCP8.0 HTML标签

    ACCP8.0 HTML标签 第一章1.HTML超文本标记语言2.网页<html></html>3.网页头部<head></head>4.网页标题< ...

  3. js中let和var的区别 不懂得加QQ 2270312758

    js中使用let定义变量的时候,是需要使用严格模式的,我看到网上有的博客说:如果在不使用严格模式的情况下,使用let会报错,但是在实验的过程中,我直接定义了let变量而且也没有使用严格模式,并没有报任 ...

  4. 2016年第七届蓝桥杯javaB组 试题 答案 解析

    1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...

  5. Android Studio教程06-布局,监听器以及基本控件

    目录 2. 监听器 3. 布局 3.1. 布局分类 (1). Linear Layout (2). Relative Layout (3). ListView (4). Grid View 4. 其他 ...

  6. typescript中的泛型

    泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C#和Ja ...

  7. PM意识升级2.0

    上一篇<质量:“PM,你怎么可以放弃我?!”>,我们匡正了PM的一个意识:质量是PM的底线和目标,也算是PM意识升级的1.0.同时提出,只有“正确的做正确的事”才是保证质量,且成本相对最低 ...

  8. rabbitmq之确保消息不丢失

    1.背景引入 在使用消息中间件(rabbitmq)时,令开发者最头痛的就是防止消息丢失问题,而消息丢失可能发生的位置主要为三种,分别为(1)消息发送到MQ中消费者消费未成功时突然宕机:(2)消息发送到 ...

  9. NPM -- 初探--01

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  10. ORACLE 查询某表中的某个字段的类型,是否为空,是否有默认值等

    最近写的功能中有这样一个小功能,根据数据库查询此库中是否有某表,如果有,查询某表下面的某个字段的详细信息 其中一种是... select ATC.OWNER, atC.TABLE_NAME, ATC. ...