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

本文主要是介绍(学习日记)2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。


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

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

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

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

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

1、运行启动文件

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

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

2、系统初始化

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

void  OSInit (OS_ERR  *p_err)

系统初始化主要包括:

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

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

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

OSIntNestingCtr= (OS_NESTING_CTR)0;     /*清除中断嵌套计数器*/

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

OSRunning =  OS_STATE_OS_STOPPED;       /*未启动多任务处理*/

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

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. 初始化优先级列表

OS_PrioInit();  /*初始化优先级位图表*/

6. 初始化就绪列表

OS_RdyListInit();       /*初始化就绪列表*/

7. 初始化任务管理器

OS_TaskInit(p_err);   /*初始化任务管理器*/

8. 初始化空闲任务

OS_IdleTaskInit(p_err);    /* 初始化空闲任务  */       

9. 初始化时钟节拍任务

OS_TickTaskInit(p_err);   /* 初始化时钟节拍任务*/       

10. 操作系统配置初始化

OSCfg_Init();

3、定义启动任务

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

static  void  AppTaskStart (void *p_arg)

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

1. 板级硬件进行初始化

BSP_Init();

2. CPU初始化

CPU_Init();

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

3. 时钟初始化

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. 内存初始化

Mem_Init();

5. 创建各种任务

使用OSTaskCreate()函数来创建各个任务
OSTaskCreate()在之前的章节已介绍,声明如下:

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()函数来删除,声明如下:

void  OSTaskDel (OS_TCB  *p_tcb,OS_ERR  *p_err)

3、启动任务调度器

OSStart函数声明如下:

OSStart(&err);

之前章节已解释,此处不再概述
该函数思路就一个,把 最高优先级任务指针 赋值给 当前任务指针 ,然后将 最高优先级任务指针 指向下一个最高优先级任务

这篇关于(学习日记)2024.03.26:UCOSIII第二十三节:系统启动流程概览(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862483

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘