(学习日记)2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新)

写在前面:

由于时间的不足与学习的碎片化,写博客变得有些奢侈。

但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。

既然如此

不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。

标题的结构如下:"类型":"知识点"------"简短的解释"

部分内容由于保密协议无法上传。

点击此处进入学习日记的总目录

2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新)

  • 三十七、UCOSIII:系统启动流程概览
    • 1、运行启动文件
    • 2、系统初始化
      • [1. 初始化钩子函数相关的代码](#1. 初始化钩子函数相关的代码)
      • [2. 把中断嵌套计数器设为0](#2. 把中断嵌套计数器设为0)
      • [3. 设置多任务处理器的状态](#3. 设置多任务处理器的状态)
      • [4. 将锁定计数器、当前任务指针、最高优先级任务指针、当前优先级数值、最高优先级数值、优先级记录数值设为0](#4. 将锁定计数器、当前任务指针、最高优先级任务指针、当前优先级数值、最高优先级数值、优先级记录数值设为0)
      • [5. 初始化优先级列表](#5. 初始化优先级列表)
      • [6. 初始化就绪列表](#6. 初始化就绪列表)
      • [7. 初始化任务管理器](#7. 初始化任务管理器)
      • [8. 初始化空闲任务](#8. 初始化空闲任务)
      • [9. 初始化时钟节拍任务](#9. 初始化时钟节拍任务)
      • [10. 操作系统配置初始化](#10. 操作系统配置初始化)
    • 3、定义启动任务
      • [1. 板级硬件进行初始化](#1. 板级硬件进行初始化)
      • [2. CPU初始化](#2. CPU初始化)
      • [3. 时钟初始化](#3. 时钟初始化)
      • [4. 内存初始化](#4. 内存初始化)
      • [5. 创建各种任务](#5. 创建各种任务)
      • [6. 删除启动任务自身](#6. 删除启动任务自身)
    • 3、启动任务调度器

三十七、UCOSIII:系统启动流程概览

本章是糅杂了笔者自己的感悟,从debug调试的视角来粗略一览系统启动流程,特点是快速上手、快速回忆,需要对之前各个函数都有一定的了解。

1、运行启动文件

在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数Reset_Handler

复位函数的最后会调用C库函数__main__main函数的主要工作是初始化系统的堆和栈,最后调用C中的main()函数,从而去到C的世界。

2、系统初始化

进入系统初始化函数OSInit(),OSInit()声明如下:

c 复制代码
void  OSInit (OS_ERR  *p_err)

系统初始化主要包括:

1. 初始化钩子函数相关的代码

c 复制代码
OSInitHook();   /*初始化钩子函数相关的代码*/

2. 把中断嵌套计数器设为0

c 复制代码
OSIntNestingCtr= (OS_NESTING_CTR)0;     /*清除中断嵌套计数器*/

3. 设置多任务处理器的状态

c 复制代码
OSRunning =  OS_STATE_OS_STOPPED;       /*未启动多任务处理*/

4. 将锁定计数器、当前任务指针、最高优先级任务指针、当前优先级数值、最高优先级数值、优先级记录数值设为0

c 复制代码
OSSchedLockNestingCtr = (OS_NESTING_CTR)0;/*清除锁定计数器*/

OSTCBCurPtr= (OS_TCB *)0;       /*将OS_TCB指针初始化为已知状态  */
OSTCBHighRdyPtr = (OS_TCB *)0;

OSPrioCur = (OS_PRIO)0;                 /*将优先级变量初始化为已知状态*/
OSPrioHighRdy                   = (OS_PRIO)0;
OSPrioSaved                     = (OS_PRIO)0;

5. 初始化优先级列表

c 复制代码
OS_PrioInit();  /*初始化优先级位图表*/

6. 初始化就绪列表

c 复制代码
OS_RdyListInit();       /*初始化就绪列表*/

7. 初始化任务管理器

c 复制代码
OS_TaskInit(p_err);   /*初始化任务管理器*/

8. 初始化空闲任务

c 复制代码
OS_IdleTaskInit(p_err);    /* 初始化空闲任务  */       

9. 初始化时钟节拍任务

c 复制代码
OS_TickTaskInit(p_err);   /* 初始化时钟节拍任务*/       

10. 操作系统配置初始化

c 复制代码
OSCfg_Init();

3、定义启动任务

系统在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。

启动任务声明如下:

c 复制代码
static  void  AppTaskStart (void *p_arg)

启动任务主要包括如下内容:

1. 板级硬件进行初始化

c 复制代码
BSP_Init();

2. CPU初始化

c 复制代码
CPU_Init();

在CPU初始化中,需要初始化时间戳、最大关中断时间测量 和 CPU 名字

3. 时钟初始化

c 复制代码
cpu_clk_freq = BSP_CPU_ClkFreq();/* Determine SysTick reference freq. */
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
OS_CPU_SysTickInit(cnts); /*Init μC/OS periodic time src (SysTick).*/

4. 内存初始化

c 复制代码
Mem_Init();

5. 创建各种任务

使用OSTaskCreate()函数来创建各个任务

OSTaskCreate()在之前的章节已介绍,声明如下:

c 复制代码
void  OSTaskCreate (OS_TCB        *p_tcb,
                    CPU_CHAR      *p_name,
                    OS_TASK_PTR    p_task,
                    void          *p_arg,
                    OS_PRIO        prio,
                    CPU_STK       *p_stk_base,
                    CPU_STK_SIZE   stk_limit,
                    CPU_STK_SIZE   stk_size,
                    OS_MSG_QTY     q_size,
                    OS_TICK        time_quanta,
                    void          *p_ext,
                    OS_OPT         opt,
                    OS_ERR        *p_err)

6. 删除启动任务自身

使用OSTaskDel()函数来删除,声明如下:

c 复制代码
void  OSTaskDel (OS_TCB  *p_tcb,
                 OS_ERR  *p_err)

3、启动任务调度器

OSStart函数声明如下:

c 复制代码
OSStart(&err);

之前章节已解释,此处不再概述

该函数思路就一个,把 最高优先级任务指针 赋值给 当前任务指针 ,然后将 最高优先级任务指针 指向下一个最高优先级任务

相关推荐
就叫你天选之人啦3 分钟前
GBDT系列八股(XGBoost、LightGBM)
人工智能·深度学习·学习·机器学习
瞎某某Blinder31 分钟前
DFT学习记录[5]电子结构分析+光学分析
linux·python·科技·学习·生活·matplotlib·帅哥
우 유34 分钟前
【STUDY】日语学习ing
学习
困死,根本不会36 分钟前
蓝桥杯 Python 备考全攻略:从入门到进阶的学习路线
笔记·python·学习·算法·蓝桥杯
BFT白芙堂44 分钟前
高精度仿真引领机器人学习:以 Franka Research 3 为核心的 PolaRiS 评估框架深度解析
人工智能·学习·机器人·人机交互·具身智能机器人·franka
嘉琪0011 小时前
Day6 完整学习包(async/await)——2026 0318
前端·javascript·学习
想你依然心痛1 小时前
教育数字化:ONLYOFFICE在在线课堂与协作学习中的一站式解决方案
学习·onlyoffice·平台·在线学习
稽稽稽稽不如人1 小时前
《从零开始的java从入门到入土的学习生活——JavaWeb后端篇》Chapter18——JavaWeb后端篇学习记录——AOP 面向切面编程
java·学习·生活
sjg200104141 小时前
GoFrame学习随便记4(待续)
学习
lucky_chaichai1 小时前
学习《以openclaw为例介绍AI Agent的运作原理》
人工智能·学习