第一步: OSInit();//初始化uCOS_II.该函数位于OS_CORE.C,主要工作:
函数原型位于OS_CORE.C
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 */

函数原型位于OS_FLAG.C
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FlagInit(); /* 事件标志组初始化 Initialize the event flag structures */
#endif

函数原型位于OS_MEM.C
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
    OS_MemInit(); /* 内存初始化 Initialize the memory manager */
#endif

函数原型位于OS_Q.C
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
    OS_QInit(); /* 消息队列初始化 Initialize the message queue structures */
#endif

函数原型位于OS_CORE.C
    OS_InitTaskIdle(); /* 创建空闲任务(无条件)Create the Idle Task */
#if OS_TASK_STAT_EN > 0
    OS_InitTaskStat(); /* 创建统计任务Create the Statistic Task */
#endif

1:static  void  OS_InitMisc (void)
{
#if OS_TIME_GET_SET_EN > 0 
    //0L→代表这个整型常量为long型的  
    OSTime        = 0L; /* 32位系统时钟变量,标示系统运行时间 Clear the 32-bit system clock*/
#endif

OSIntNesting  = 0;  /* 中断嵌套次数 Clear the interrupt nesting counter */
    OSLockNesting = 0;  /* 调度器嵌套上锁次数 Clear the scheduling lock counter */

OSTaskCtr     = 0;  /* 任务计时器,标示系统创建了多少个任务 Clear the number of tasks*/

OSRunning     = FALSE; /* 标示内核是否运行 Indicate that multitasking not started*/
    
    OSCtxSwCtr    = 0; /* 系统任务切换次数 Clear the context switch counter */
    OSIdleCtr     = 0L; /* 空闲时间计数器 Clear the 32-bit idle counter */

#if (OS_TASK_STAT_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
    OSIdleCtrRun  = 0L;//1秒前空闲任务计数器
    OSIdleCtrMax  = 0L;//1秒内空闲任务计数器可达最大值
    OSStatRdy     = FALSE; /* 统计任务标示,即是否执行统计任务 Statistic task is not ready */
#endif
}

2:static  void  OS_InitRdyList (void)
{
    INT16U   i;
    INT8U   *prdytbl;

OSRdyGrp      = 0x00; /* Clear the ready list */
    prdytbl       = &OSRdyTbl[0];
    for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
        *prdytbl++ = 0x00;
    }

OSPrioCur     = 0;
    OSPrioHighRdy = 0;

OSTCBHighRdy  = (OS_TCB *)0;                                 
    OSTCBCur      = (OS_TCB *)0;
}

//空闲任务键表OSTCBFreeList建立
3:static  void  OS_InitTCBList (void)
{
    INT8U    i;
    OS_TCB  *ptcb1;
    OS_TCB  *ptcb2;

OSTCBList     = (OS_TCB *)0;                                 /* TCB Initialization                       */
    for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* Clear the priority table                 */
        OSTCBPrioTbl[i] = (OS_TCB *)0;
    }

//建立空闲任务列表
    ptcb1 = &OSTCBTbl[0];
    ptcb2 = &OSTCBTbl[1];
    for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* Init. list of free TCBs                  */
        ptcb1->OSTCBNext = ptcb2;
        ptcb1++;
        ptcb2++;
    }
//列表最后一个任务的OSTCBNext设置为空
    ptcb1->OSTCBNext = (OS_TCB *)0;                              /* Last OS_TCB                              */

//将一整块空闲列表交给指针OSTCBFreeList
    OSTCBFreeList    = &OSTCBTbl[0];
}

4:static  void  OS_InitEventList (void)//初始化ECB
{
#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
#if (OS_MAX_EVENTS > 1)
    INT16U     i;
    OS_EVENT  *pevent1;
    OS_EVENT  *pevent2;

pevent1 = &OSEventTbl[0];
    pevent2 = &OSEventTbl[1];
    for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks  */
        pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
        pevent1->OSEventPtr  = pevent2;
        pevent1++;
        pevent2++;
    }
    pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
    pevent1->OSEventPtr  = (OS_EVENT *)0;
    OSEventFreeList      = &OSEventTbl[0];
#else
    OSEventFreeList              = &OSEventTbl[0]; /* Only have ONE event control block        */
    OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
    OSEventFreeList->OSEventPtr  = (OS_EVENT *)0;
#endif
#endif
}

5:void  OS_FlagInit (void)
{
#if OS_MAX_FLAGS == 1
    OSFlagFreeList                 = (OS_FLAG_GRP *)&OSFlagTbl[0];  /* Only ONE event flag group!      */
    OSFlagFreeList->OSFlagType     = OS_EVENT_TYPE_UNUSED;
    OSFlagFreeList->OSFlagWaitList = (void *)0;
#endif

#if OS_MAX_FLAGS >= 2
    INT8U        i;
    OS_FLAG_GRP *pgrp1;
    OS_FLAG_GRP *pgrp2;

pgrp1 = &OSFlagTbl[0];
    pgrp2 = &OSFlagTbl[1];
    for (i = 0; i < (OS_MAX_FLAGS - 1); i++) {                      /* Init. list of free EVENT FLAGS  */
        pgrp1->OSFlagType     = OS_EVENT_TYPE_UNUSED;
        pgrp1->OSFlagWaitList = (void *)pgrp2;
        pgrp1++;
        pgrp2++;
    }
    pgrp1->OSFlagWaitList = (void *)0;
    OSFlagFreeList        = (OS_FLAG_GRP *)&OSFlagTbl[0];
#endif
}

6:void  OS_MemInit (void)
{
#if OS_MAX_MEM_PART == 1
    OSMemFreeList                = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list          */
    OSMemFreeList->OSMemFreeList = (void *)0;              /* Initialize last node                     */
    OSMemFreeList->OSMemAddr     = (void *)0;              /* Store start address of memory partition  */
    OSMemFreeList->OSMemNFree    = 0;                      /* No free blocks                           */
    OSMemFreeList->OSMemNBlks    = 0;                      /* No blocks                                */
    OSMemFreeList->OSMemBlkSize  = 0;                      /* Zero size                                */
#endif

#if OS_MAX_MEM_PART >= 2
    OS_MEM  *pmem;
    INT16U   i;

pmem = (OS_MEM *)&OSMemTbl[0];                    /* Point to memory control block (MCB)           */
    for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) {     /* Init. list of free memory partitions          */
        pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions                 */
        pmem->OSMemAddr     = (void *)0;              /* Store start address of memory partition       */
        pmem->OSMemNFree    = 0;                      /* No free blocks                                */
        pmem->OSMemNBlks    = 0;                      /* No blocks                                     */
        pmem->OSMemBlkSize  = 0;                      /* Zero size                                     */
        pmem++;
    }
    pmem->OSMemFreeList = (void *)0;                  /* Initialize last node                          */
    pmem->OSMemAddr     = (void *)0;                  /* Store start address of memory partition       */
    pmem->OSMemNFree    = 0;                          /* No free blocks                                */
    pmem->OSMemNBlks    = 0;                          /* No blocks                                     */
    pmem->OSMemBlkSize  = 0;                          /* Zero size                                     */

OSMemFreeList       = (OS_MEM *)&OSMemTbl[0];     /* Point to beginning of free list               */
#endif
}

7:void  OS_QInit (void)
{
#if OS_MAX_QS == 1
    OSQFreeList         = &OSQTbl[0];            /* Only ONE queue!                                    */
    OSQFreeList->OSQPtr = (OS_Q *)0;
#endif

#if OS_MAX_QS >= 2
    INT16U  i;
    OS_Q   *pq1;
    OS_Q   *pq2;

pq1 = &OSQTbl[0];
    pq2 = &OSQTbl[1];
    for (i = 0; i < (OS_MAX_QS - 1); i++) {      /* Init. list of free QUEUE control blocks            */
        pq1->OSQPtr = pq2;
        pq1++;
        pq2++;
    }
    pq1->OSQPtr = (OS_Q *)0;
    OSQFreeList = &OSQTbl[0];
#endif
}

/* 创建空闲任务(无条件)Create the Idle Task */
//变量在OS_CFG.H、uCOS_II.H中定义
8:static  void  OS_InitTaskIdle (void)
{
#if OS_TASK_CREATE_EXT_EN > 0
    #if OS_STK_GROWTH == 1
    (void)OSTaskCreateExt(OS_TaskIdle,
                          (void *)0,                                 /* No arguments passed to OS_TaskIdle() */
                          &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Top-Of-Stack                     */
                          OS_IDLE_PRIO,                              /* Lowest priority level                */
                          OS_TASK_IDLE_ID,
                          &OSTaskIdleStk[0],                         /* Set Bottom-Of-Stack                  */
                          OS_TASK_IDLE_STK_SIZE,
                          (void *)0,                                 /* No TCB extension                     */
                          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack  */
    #else
    (void)OSTaskCreateExt(OS_TaskIdle,
                          (void *)0,                                 /* No arguments passed to OS_TaskIdle() */
                          &OSTaskIdleStk[0],                         /* Set Top-Of-Stack                     */
                          OS_IDLE_PRIO,                              /* Lowest priority level                */
                          OS_TASK_IDLE_ID,
                          &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Bottom-Of-Stack                  */
                          OS_TASK_IDLE_STK_SIZE,
                          (void *)0,                                 /* No TCB extension                     */
                          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack  */
    #endif
#else
    #if OS_STK_GROWTH == 1
    (void)OSTaskCreate(OS_TaskIdle,
                       (void *)0,
                       &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
                       OS_IDLE_PRIO);
    #else
    (void)OSTaskCreate(OS_TaskIdle,
                       (void *)0,
                       &OSTaskIdleStk[0],
                       OS_IDLE_PRIO);
    #endif
#endif
}

/* 创建统计任务Create the Statistic Task */
9:static  void  OS_InitTaskStat (void)
{
#if OS_TASK_CREATE_EXT_EN > 0
    #if OS_STK_GROWTH == 1
    (void)OSTaskCreateExt(OS_TaskStat,
                          (void *)0,                                   /* No args passed to OS_TaskStat()*/
                          &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Top-Of-Stack               */
                          OS_STAT_PRIO,                                /* One higher than the idle task  */
                          OS_TASK_STAT_ID,
                          &OSTaskStatStk[0],                           /* Set Bottom-Of-Stack            */
                          OS_TASK_STAT_STK_SIZE,
                          (void *)0,                                   /* No TCB extension               */
                          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
    #else
    (void)OSTaskCreateExt(OS_TaskStat,
                          (void *)0,                                   /* No args passed to OS_TaskStat()*/
                          &OSTaskStatStk[0],                           /* Set Top-Of-Stack               */
                          OS_STAT_PRIO,                                /* One higher than the idle task  */
                          OS_TASK_STAT_ID,
                          &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* Set Bottom-Of-Stack            */
                          OS_TASK_STAT_STK_SIZE,
                          (void *)0,                                   /* No TCB extension               */
                          OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* Enable stack checking + clear  */
    #endif
#else
    #if OS_STK_GROWTH == 1
    (void)OSTaskCreate(OS_TaskStat,
                       (void *)0,                                      /* No args passed to OS_TaskStat()*/
                       &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],      /* Set Top-Of-Stack               */
                       OS_STAT_PRIO);                                  /* One higher than the idle task  */
    #else
    (void)OSTaskCreate(OS_TaskStat,
                       (void *)0,                                      /* No args passed to OS_TaskStat()*/
                       &OSTaskStatStk[0],                              /* Set Top-Of-Stack               */
                       OS_STAT_PRIO);                                  /* One higher than the idle task  */
    #endif
#endif
}

启动ucosii之OSInit()相关推荐

  1. 启动ucosii之四OSTaskCreate()

    函数原型来自OS_TASK.C /*********************************************************************************** ...

  2. STM32迷你板UCOSII系统移植

    写在前面: 所需要下载的UCOSII代码链接:https://pan.baidu.com/s/1D_IyXhODEa5oVUdDv-GJrQ 提取码:mte3 本文结构 1.UCOSII简介 2.UC ...

  3. 嵌入式实时操作系统ucos-ii_「正点原子NANO STM32开发板资料连载」第三十六章 UCOSII 实验 1任务调度...

    1)实验平台:alientek NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第三十六章 ...

  4. UCOS-II学习文档

    UCOS-II 一.实时操作系统的概念 1.1 操作系统 ​ 操作系统是一种系统软件,他在计算机硬件与计算机应用程序之间,通过提供程序接口,屏蔽了计算机硬件工作的一些细节,从提高了应用程序的开发效率. ...

  5. UCOSII操作系统(三)--系统启动过程

    1.初始化UCOSII (1)在调用UCOSII在任何的其他的服务之前,UCOSII要求首先调用初始化函数OSInit();这个函数的目的就是在整个系统启动之前,初始化所有的变量和数据结构. (2)其 ...

  6. 【ALIENTEK 战舰STM32开发板例程系列连载+教学】第五十八章 UCOSII实验1-任务调度

    第五十八章 UCOSII实验1-任务调度 前面我们所有的例程都是跑的裸机程序(裸奔),从本章开始,我们将分3个章节向大家介绍UCOSII(实时多任务操作系统内核)的使用.本章,我们将向大家介绍UCOS ...

  7. STM32学习笔记一一UCOSII(1)

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 1. 简介 UCOSII 是一个可以基于 ROM 运行的.可裁减的.抢占式 ...

  8. 基于STM32与ATT7022E多功能电力监测仪设计

    本设计是基于STM32与ATT7022E多功能电力监测仪的电路方案设计 程序编译器:keil 5 编程语言:C语言 [腾讯文档]C0016 网盘链接 近年来随着我国国民经济的高速发展,先进嵌入式处理器 ...

  9. [stm32][ucos][ucgui] 2、LED闪烁、串口、滑块、文本编辑框简单例程

    上一篇:[stm32][ucos] 1.基于ucos操作系统的LED闪烁.串口通信简单例程 * 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了7个任务             任务名  ...

最新文章

  1. 为什么单例模式是邪恶的(译)
  2. Qt undefined reference to,Error 255,找不到库函数的解决办法
  3. Micro Average vs Macro average Performance in a Multiclass classification setting
  4. (83)建立时间与保持时间时序分析技巧
  5. H.264视频质量评价算法(基于偏最小二乘法回归)
  6. error: ‘SA_INTERRUPT’ undeclared (first use in this function)
  7. Python画图之散点图(plt.scatter)
  8. Swift4 【常用宏定义与方法总结 2018】
  9. nRF52840学习-初识1-1
  10. 如何在kylo中添加数据源
  11. 京东在线客服话术汇总!
  12. 常说的监听某个端口,是什么意思?怎么理解?
  13. wireshark过滤规则
  14. VirtualBox虚拟机几种网络连接方式介绍
  15. 基于python的停车场管理系统的设计与实现/智能停车管理系统
  16. springboot毕设项目牙无忧6ayy4(java+VUE+Mybatis+Maven+Mysql)
  17. Table ... doesn‘t exist
  18. c语言程序设计实践万年历,c语言程序设计万年历-20210408030342.docx-原创力文档
  19. 北京航空航天大学公开课:应用数学分析 笔记:微积分发展史,牛顿,莱布尼茨,拉格朗日,欧拉,柯西,黎曼
  20. Asp.net WebApi跨域_se7en3_新浪博客

热门文章

  1. mysql Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nona
  2. openSSL命令、PKI、CA、SSL证书原理
  3. 360不用卸,照样上你QQ
  4. [知识图谱实战篇] 三.Python提取JSON数据、HTML+D3构建基本可视化布局
  5. [数据库] Navicat for MySQL事件Event实现数据每日定期操作
  6. HarmonyOS之JS/Java跨语言调试
  7. 【网络通信与信息安全】之深入分析一个TCP连接可以发多少个HTTP请求相关问题
  8. 数学 —— 巧用进制
  9. 1036:A×B问题
  10. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验