(学习日记)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

相关文章

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块