【BES2500x系列 -- RTX5操作系统】系统执行流程 -- 系统初始化 -- main函数 --(十一)

news2024/9/27 17:29:17

请添加图片描述

  • 💌 所属专栏:【BES2500x系列】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

  • 前言
  • 1 系统初始化
      • 1.1 系统启动(System Startup)
      • 1.2 系统 main 函数
  • 总结


<<【系列文章索引】>>

前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【BES2500x系列】专栏的11篇文章;
  今天开始学习BES2500x系列的一天💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【BES2500x系列】, 此专栏是我是夜阑的狗对BES2500x系列开发过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。


1 系统初始化

  前面学习了嵌入式系统启动的基本流程,可以分为 引导程序系统初始化程序 这两部分,并对引导程序 boot loader 进行了详细讲解。接下来就来 系统初始化程序 是怎么跑的吧。话不多说,让我们原文再续,书接上回吧。

请添加图片描述

1.1 系统启动(System Startup)

  mian 函数不再以一个线程的形式运行,因此在 main 函数运行之前,RTX5 不会干预系统的启动。main 函数运行之后,推荐按照以下的流程初始化硬件并启动内核:

  Step1、硬件的初始化和配置,包括外设,内存,引脚,时钟和中断系统。
  Step2、使用 CMSIS-Core 函数更新系统核心时钟。
  Step3、使用 osKernelInitialize 函数初始化 CMSIS-RTOS 内核。
  Step4、使用 osThreadNew 函数创建一个主线程(例如 app_mian ),然后在这个线程中创建和启动对象。当然也可以直接在main函数中创建和启动对象。
  Step5、使用 OSKernelStart 启动 RTOS 调度器,该函数会配置 system tick定时器以及初始化 RTOS 相关中断。如果这个函数运行成功,则不会在返回,因此该函数之后的代码将不会被执行。

  🚨 🚨 🚨 注意:在上述流程之后,不推荐应用程序修改NVIC的优先级和分组;在执行 osKernelStart 之前,只能调用 osKernelGetInfoosKernelGetState 和对象创建函数(osXxxNew)。

在这里插入图片描述

  • 代码
__WEAK void software_init_hook (void) {
    __asm (
      ".syntax unified\n"
      ".thumb\n"
      "movs r0,#0\n"
      "movs r1,#0\n"
      "mov  r4,r0\n"
      "mov  r5,r1\n"
      "bl   SystemCoreClockUpdate\n"
      "bl   osKernelInitialize\n"
      "ldr  r0,= __libc_fini_array\n"
      "bl   atexit\n"
      "bl   __libc_init_array\n"
      "mov  r0,r4\n"
      "mov  r1,r5\n"
      "bl   set_main_stack\n"
      "ldr  r0,=main\n"
      "movs r1,#0\n"
      "ldr r2,=os_thread_attr_main\n"
      "bl   osThreadNew\n"
      "bl   osKernelStart\n"
      "bl   exit\n"
    );
}
  • 参数/函数讲解

  这段代码是一个软件初始化钩子函数,使用了 __WEAK 关键字,表示这是一个弱符号,允许在其他地方重新定义同名函数。函数内部包含了一段嵌入式汇编代码,执行了一系列初始化操作,主要用于系统启动时进行一些必要的初始化工作。

序号汇编指令说明
1.syntax unified 和 .thumb指定汇编语法和指令集。在这里,使用了 Thumb 指令集。
2movs r0,#0movs r1,#0用于将寄存器 r0 和 r1 中的值设置为 0。
3mov r4,r0mov r5,r1将 r0 和 r1 中的值分别复制到 r4 和 r5 寄存器中。
4bl SystemCoreClockUpdate调用 SystemCoreClockUpdate 函数更新系统核心时钟。
5bl osKernelInitialize调用 osKernelInitialize 函数初始化操作系统内核。
6ldr r0,= __libc_fini_array加载 __libc_fini_array 的地址到寄存器 r0。
7bl atexit调用 atexit 注册退出处理函数。
8bl __libc_init_array调用 __libc_init_array 函数初始化 C 库数组。
9mov r0,r4将 r4 中的值分别复制回 r0 寄存器中。
10mov r1,r5将 r5 中的值分别复制回 r1 寄存器中。
11bl set_main_stack调用 set_main_stack 函数设置主栈。
12ldr r0,=main加载 main 函数的地址到寄存器 r0,并调用 osThreadNew 创建主线程。
13movs r1,#0将常量值 0 移动到寄存器 r1
14ldr r2,=os_thread_attr_main加载 os_thread_attr_main 的地址到寄存器 r2
15bl osThreadNew调用 osThreadNew 创建主线程,这个过程用于初始化操作系统的线程环境,将 main 函数作为新线程的入口点。
16bl osKernelStart调用 osKernelStart 启动操作系统内核。
17bl exit调用 exit 函数以退出程序

1.2 系统 main 函数

  执行完成这些创建好主线程后,就能来到 main 函数了,因为第一个线程os_thread_attr_main 就是 main,可以在 main.cpp 文件中看到该 main 函数。

在这里插入图片描述

  • 代码

  这里由于 main 函数代码过多,这里不就放出来了,只讲解一下其中的各个函数作用。

int main(void)
{
    uint8_t sys_case = 0;
    int ret = 0;
#if !defined(BLE_ONLY_ENABLED)
    app_wdt_open(15);
#else
    app_wdt_open(30);
#endif
	......省略后续
	......
}
  • 参数/函数讲解

  main 函数详细讲解,这些函数调用涉及到了系统的初始化、配置以及关机过程的一些操作:

序号参数/函数说明
1app_wdt_open(30)开启打开应用程序看门狗定时器,间隔为30秒;
2tgt_hardware_setup()硬件初始化,输入输出IO初始化;
3osThreadGetId()返回当前线程ID;
4hwtimer_init(void)初始化硬件定时器,用于在系统中进行定时操作或者时钟管理;
5hal_dma_set_delay_func设置了一个 DMA(Direct Memory Access,直接内存访问)延迟函数,它将 osDelay 函数作为参数传入。这通常是为了在 DMA 操作中引入延迟,以便与其他系统操作进行同步。
6hal_audma_open()初始化音频 DMA,即用于音频数据传输的 DMA 控制器。
7hal_gpdma_open()初始化通用 DMA(General Purpose DMA,通用目的 DMA),用于处理非音频数据的高速数据传输。
8norflash_api_init()初始化 NOR Flash 存储器,把 flash 中从 0 到NORFLASH_API_MODULE_ID_COUNT 的空间清零,以便系统能够正确地与 NOR Flash 进行通信和操作。
9hal_iomux_set_uart0()设置 UART0 的 I/O 多路复用(I/O Multiplexing),以确保 UART0 的引脚正确配置为 UART 功能,从而可以进行串口通信
10hal_trace_open打开了追踪功能,并指定了 UART0 作为传输通道。追踪功能通常用于在调试或日志记录时输出系统状态、错误信息等,简单点就是打开串口。
11hal_iomux_ispi_access_init()初始化 SPI(Serial Peripheral Interface,串行外设接口)的 I/O 多路复用,以确保 SPI 接口的引脚正确配置,并且可以被使用。
12hal_iomux_ispi_access_disable()禁用 SPI 接口的访问。可能在某些情况下,系统需要在初始化时先禁用 SPI 接口,待需要时再启用。
13pmu_open()初始化电源管理单元(PMU),以便系统能够正确管理电源,包括电池管理、供电管理等。
14analog_open()初始化模拟外设,例如模拟输入输出、模拟信号处理等。
15mpu_setup()设置 MPU(Memory Protection Unit,内存保护单元),以保护系统的内存不受未经授权的访问和修改。具体操作是先open mpu() 然后mpu_init_table() ,mpu_fast_ram_protect()
16srand(hal_sys_timer_get())设置了随机数发生器的种子,通常使用系统时钟来生成一个初始种子,以便在后续的随机数生成中产生不同的随机序列。
17app_audio_buffer_check()检查音频缓冲区的状态,以确保音频数据的准备和处理工作正常进行。
18app_init()应用程序的初始化函数,用于执行应用程序的各种初始化任务,例如初始化变量、配置参数等。
19system_shutdown_wdt_config(10)配置了系统的看门狗定时器(Watchdog Timer,WDT),设置了定时器的超时时间为10秒。看门狗定时器通常用于监视系统运行状态,如果系统出现异常或停滞,超过了设置的时间,系统会自动重启以恢复正常运行。
20app_deinit(ret)在应用程序结束时进行一些清理工作,
21hal_sw_bootmode_clear()清除软件引导模式(Software Boot Mode)的状态,以确保系统下次启动时不会处于特定的引导模式下。
22pmu_shutdown()关闭电源管理单元(PMU),以准备系统关机。

<<【系列文章索引】>>

请添加图片描述


总结

  感谢观看,这里就是 系统初始化 – main函数的讲解,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】

  • 🥇 【恒玄BES】

  • 🌼 【鸿蒙系统】

  • 💎 【蓝牙协议栈】

  • 🎃 【死机分析】

  • 👑 【Python脚本笔记】

  • 🚝 【Java Web项目构建过程】

  • 💛 【微信小程序开发教程】

  • 【JavaScript随手笔记】

  • 🤩 【大数据学习笔记(华为云)】

  • 🦄 【程序错误解决方法(建议收藏)】

  • 🔐 【Git 学习笔记】

  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OJ-0805

题目 参考 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int L1 scanner.nextInt();int L2 scanner.nextInt();int[] A new int[L1];int[] B new int[L2];fo…

算法回忆录(1)

1.编程求1*2*3*4*……*n的末尾有多少个0。 #include <stdio.h>// 计算 n! 中末尾的0的个数 int count_zeros_in_factorial(int n) {int count 0;for (int i 5; n / i > 1; i * 5) {count n / i;}return count; }int main() {int n;printf("请输入一个整数 n&…

代码随想录day34 || 62不同路径 63不同路径2 343整数拆分

动归5步法 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2&#xff0c;确定递推公式 3&#xff0c;dp数组如何初始化 4&#xff0c;确定遍历顺序 5&#xff0c;举例推导dp数组 62不同路径 力扣题目链接 题目描述&#xff1a; 一个机器人…

免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue图书(图书借阅)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…

分享一个基于Node.js和Vue的游戏点单陪玩系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

MQ面试篇

目录 传送门前言一、MQ优缺点二、MQ消息重复问题处理&#xff08;精品&#xff09;三、保证MQ消息不丢失四 、MQ百万消息持续积压问题五、如果保证MQ的高可用 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringB…

山东青岛高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

青岛高校大学智能制造实验室作为高校科研和人才培养的重要基地&#xff0c;一直致力于推动智能制造技术的研发和应用。为了提升实验室在智能制造领域的教学、科研和产业合作能力&#xff0c;实验室决定建设数字孪生可视化系统平台。 智能制造数字孪生项目旨在通过搭建一个全面…

C语言实现希尔排序和堆排序

目录 1.希尔排序 1.1基本思想 1.2希尔排序的特性总结 1.3希尔排序算法的实现 2.堆排序 2.1基本思想 2.2堆排序的特性总结 2.3堆排序算法的实现 1.希尔排序 1.1基本思想 希尔排序法的基本思想是&#xff1a;先选定一个整数(gap)&#xff0c;把待排序文件中所有记录分成…

自定义微信小程序源码系统 带网站的源代码包以及搭建部署教程

系统概述 自定义微信小程序源码系统是一套完整的解决方案&#xff0c;包含了微信小程序的源代码以及配套的网站源代码包。它为开发者提供了一个可定制、可扩展的开发平台&#xff0c;让开发者能够根据自己的需求和创意&#xff0c;快速构建出具有独特风格和功能的微信小程序。…

微力同步如何安装使用并使用内网穿透配置公网地址远程访问

文章目录 1.前言2. 微力同步网站搭建2.1 微力同步下载和安装2.2 微力同步网页测试2.3 内网穿透工具安装 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 私有云盘作为云存储概念的延伸&#xff0c;虽然谈不上多么新颖&#xff0c;但是其广…

CodeWave简介

CodeWave是网易自主研发的领先低代码平台&#xff0c;可快速搭建公司官网、项目管理、OA等各种企业信息化系统&#xff0c;助力企业数字化提质增效。产品特点&#xff1a;低门槛&#xff08;降低软件开发门槛&#xff0c;赋能非专业技术人员专职从事软件开发工作&#xff09;、…

要想赚钱,AI模型该大该小?贾扬清:论AI模型经济学的技巧

卖模型就像感恩节卖火鸡&#xff0c;快才能赚钱。 最近的AI社区&#xff0c;关于模型规模的讨论有些活跃。 一方面&#xff0c;此前在大模型开发奉为“圣经”的Scaling Law&#xff0c;似乎正在褪去光环。去年大家还在猜测GPT-5的规模“可能会大到想不到”&#xff0c;现在这…

2024华数杯C题解题思路及详细建模步骤分享+双语言代码

2024“华数杯”数模竞赛已经开赛啦&#xff0c;这次给大家带来的是今年华数杯C题解题思路&#xff0c;内容由我们团队的众多国奖学长学姐给大家出具高质量的解题思路&#xff0c;参考代码等&#xff0c;希望能助大家一臂之力。 问题1: 请问352 个城市中所有35200 个景点评分的最…

【Nuxt】约定式路由和 NuxtLink

约定式路由 手动创建&#xff1a; 或者还可以使用终端创建页面&#xff1a;nuxi-add-page npx nuxi add page about — about.vue npx nuxi add page about/index — about/index.vue <NuxtLink to"/"><button>Home</button></NuxtLink><…

25集 ESP32 C3 AI chat聊天工程代码流程-《MCU嵌入式AI开发笔记》

25集 ESP32 C3 AI chat聊天工程代码流程-《MCU嵌入式AI开发笔记》 我们打开Ai chat工程&#xff0c;用vscode。 main.c里面&#xff0c;重点看一下app_main函数。 Created with Raphal 2.3.0 开始 nvs_flash_init audio_hal_ctrl_codec audio init display init &#xff08…

AUTOSAR之AUTOSAR OS(下)

前言&#xff1a;在上篇中&#xff0c;我们主要描述了OSEK OS的相关内容以及AUTOSAR OS的OS Application对象的一些内容&#xff0c;包括Counter&#xff0c;Alarm&#xff0c;Enent&#xff0c;ISR&#xff0c;Task&#xff0c;Schudule Table等&#xff0c;本篇文章中&#x…

element-plus 菜单组件 index属性如何正确赋值?

element-plus 菜单组件 index属性如果直接填写字符串&#xff0c;就会报如下的错误 正确写法与错误写法 报错解释&#xff1a;Error parsing JavaScript expression: Unterminated regular expression. (1:2) 这个错误表明你在解析一个JavaScript表达式时遇到了一个未正确结束…

【人工智能专栏】 PCA Decomposition

PCA Decomposition 算法 去除平均值 。计算协方差矩阵 。计算协方差矩阵的特征值和特征向量 。将特征值排序 保留前N个最大的特征值对应的特征向量 。将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)。解释 为什么样本在“协方差矩阵C的最大…

元太电磁膜SUDE-10S19MI-01X驱动适配

屏规格书&#xff1a; dts配置&#xff1a; 首先要确保CONFIG_I2C_HID宏打开&#xff0c;i2c-hid-core.c 文件才能编译进去代码。规格书vendor product 分别为0x2d1f 和0x0165 来区别&#xff0c;不至于影响到整体的hid其他设备。 i2c-hid-dev10 { compatible "hid-…

WordPress主题 CeoMax-Pro_v7.6总裁主题资源下载类主题

CeoNova-Pro 主题是一款轻量级、且简洁大气、产品官网类主题&#xff0c;定位于高端产品官网、同时包含了知识付费、定制服务、问答社区、论坛交流、网址导航、以及付费产品购买下载等全方位覆盖。