MCU嵌入式初始化架构

PC与MCU通信方案:USB CDC虚拟串口全面讲解 深入解析如何利用USB CDC技术实现PC与MCU间的高效通信,重点讲解虚拟串口的原理与配置流程,帮助开发者快速搭建稳定可靠的嵌入式通信方案。 阅读详情

typedef void (*mr_init_fn_t)(void);                                 /**< Auto initialization function */

#define MR_INIT_EXPORT(fn, level) \
    MR_USED const mr_init_fn_t _mr_auto_init_##fn MR_SECTION("mr_auto_init."level) = fn

#define MR_INIT_BOARD_EXPORT(fn)        MR_INIT_EXPORT(fn, "1")    /**< Exports a Board initialization function */
#define MR_INIT_DRV_EXPORT(fn)          MR_INIT_EXPORT(fn, "2")    /**< Exports a Driver initialization function */
#define MR_INIT_DEV_EXPORT(fn)          MR_INIT_EXPORT(fn, "3")    /**< Exports a Device initialization function */
#define MR_INIT_APP_EXPORT(fn)          MR_INIT_EXPORT(fn, "4")    /**< Exports an App initialization function */

static void start(void)
{

}
MR_INIT_EXPORT(start, "0");

static void end(void)
{

}
MR_INIT_EXPORT(end, "5.end");

/**
 * @brief This function is auto initialized.
 */
void mr_auto_init(void)
{
    /* Auto-initialization */
    for (const mr_init_fn_t *fn = &_mr_auto_init_start; fn < &_mr_auto_init_end; fn++) {
        (*fn)();
    }
}

这段代码提供了一个自动初始化系统的实现框架,使用C预处理器宏来简化和控制不同初始化阶段的函数导出。让我们逐步解析这段代码和相关的概念。

宏定义和类型

typedef void (*mr_init_fn_t)(void);

这行代码定义了一个名为 mr_init_fn_t 的类型,它是一个函数指针类型,指向无返回值、无参数的函数。

#define MR_INIT_EXPORT(fn, level) \ 
MR_USED const mr_init_fn_t _mr_auto_init_##fn MR_SECTION("mr_auto_init."level) = fn

这是一个宏定义,用于将指定的函数 fn 放入一个特定的编译器节(section)中。MR_USED 和 MR_SECTION 可能是特定于编译器的宏,用于确保函数指针不会被优化掉,并将它们放在特定的内存节中。节名由 "mr_auto_init." 和提供的 level 参数组成。

初始化阶段宏定义

接下来的宏定义是针对不同的初始化阶段:

#define MR_INIT_BOARD_EXPORT(fn)   MR_INIT_EXPORT(fn, "1") 
#define MR_INIT_DRV_EXPORT(fn)     MR_INIT_EXPORT(fn, "2")
#define MR_INIT_DEV_EXPORT(fn)     MR_INIT_EXPORT(fn, "3") 
#define MR_INIT_APP_EXPORT(fn)     MR_INIT_EXPORT(fn, "4")

这些宏定义简化了将函数分配到特定初始化阶段的过程。例如,MR_INIT_BOARD_EXPORT(fn) 会把函数 fn 放入名为 mr_auto_init.1 的节中,通常用于板级初始化。

示例函数和它们的注册

static void start(void)
{

}
MR_INIT_EXPORT(start, "0");

static void end(void)
{

}
MR_INIT_EXPORT(end, "5.end");

这里定义了两个静态函数 start 和 end,并通过 MR_INIT_EXPORT 宏将它们注册到特定的初始化段。start 函数被注册在最早的初始化阶段("0"),而 end 函数被放在一个名为 "5.end" 的特定阶段。

自动初始化函数

/**
 * @brief This function is auto initialized.
 */
void mr_auto_init(void)
{
    /* Auto-initialization */
    for (const mr_init_fn_t *fn = &_mr_auto_init_start; fn < &_mr_auto_init_end; fn++) {
        (*fn)();
    }
}

这个函数遍历从 _mr_auto_init_start 到 _mr_auto_init_end 的所有函数指针。这些符号(_mr_auto_init_start 和 _mr_auto_init_end)通常在链接脚本中定义,标记自动初始化函数列表的开始和结束。mr_auto_init 函数通过解引用每个函数指针并调用它来执行初始化任务。

总结

这种机制允许开发者按预定的顺序(由 level 参数控制)自动执行初始化函数,非常适合管理复杂系统中的启动顺序,如嵌入式设备或系统软件。每个初始化阶段可以根据需要(如硬件初始化、驱动加载、设备配置、应用启动等)分别进行管理。

嵌入式开发基石:RISC-V MCU BSP架构、启动流程与时钟管理实战 在嵌入式系统开发中,硬件抽象层(HAL)与板级支持包(BSP)是连接底层硬件与应用软件的关键桥梁。其核心原理在于通过标准化的接口和配置机制,封装芯片特定的寄存器操作与初始化序列,从而将开发者从繁琐的硬件细节中解放出来。这项技术的核心价值在于大幅提升代码的可移植性、可维护性及开发效率,使得同一套应用逻辑能够适配不同的微控制器(MCU)硬件平台。典型的应用场景包括基于RISC-V、ARM Cortex-M等架构的物联网设备、工业控制器及消费电子产品开发,开发者通过配置时钟树、管理内存布局、处理中断向量即可快速搭 阅读详情

相关推荐

嵌入式音频开发:I2S协议原理与Stellaris MCU实战配置指南

在嵌入式系统开发中,数字音频传输是构建智能音箱、物联网设备等产品的关键技术。I2S(Inter-IC Sound)作为一种专为音频设计的同步串行通信协议,其核心原理在于通过精确的时钟信号(SCLK、LRCLK)和数据线(SD)实现PCM音频数据的高保真、低延迟传输。该协议的价值在于其简洁高效的架构,完美契合音频信号对时序的严苛要求,广泛应用于各类需要实时音频处理的嵌入式场景。本文聚焦于I2S在Stellaris系列MCU上的工程实践,深入剖析其外设架构,特别是深度可配置的8级样本对FIFO和灵活的时钟系统,

一个2年工作经验的程序测试员 412

IAR Embedded Workbench中的MCU启动过程

有关MCU在IAR中的启动和初始化

m0_46605728的博客 415

嵌入式软件架构

嵌入式软件从整体上来看,架构设计很重要。这个题目也很大,逐步总结一下吧瑞萨的有篇文章写的不错,这里也参考了一下。

aiamia的博客 235

软考-系统架构师-嵌入式系统(一)

嵌入式系统是以应用为中心、以计算机技术为基础的专用计算机系统,具有可配置与可裁剪的软硬件特性。其分层架构包括硬件层(微处理器、存储器等)、抽象层(HAL/BSP)、操作系统层、中间件层和应用层。系统初始化遵循片级→板级→系统级的顺序,BSP和HAL是实现硬件无关性的关键。核心硬件部件包含微处理器、存储器、总线、看门狗电路和I/O接口等,其中看门狗用于系统容错,JTAG接口用于调试。嵌入式系统需满足功能、可靠性、成本、体积和功耗等严格要求,广泛应用于工业控制、军事、物联网等领域。

持续学习ing 1211

MCU端自动软件架构设计方案——Bootloader与应用程序设计

本文介绍了在MCU端设计Bootloader和应用程序的方案。Bootloader负责固件更新和应用程序加载的任务,通过外部触发条件检测和验证固件的完整性,实现可靠的固件更新。应用程序则负责实际的业务逻辑和功能实现,通过与Bootloader的接口进行通信,实现模块化的设计。以上代码示例仅为简化示意,并未包含完整的错误处理和异常情况处理。在实际开发中,需要根据具体需求进行完善和优化。希望本文对您在MCU端自动软件架构设计方案方面有所帮助!

IlagCompile的博客 456

嵌入式操作系统中芯片的启动过程是什么

以英飞凌家的 TC27x 系列 MCU 为例,上电后的默认取址位置是0x8FFF 8000,这就是他的Boot ROM在NorFlash中的地址。所以,一个Soc真正的启动过程,在BootRom之前,其实逻辑进行了很多的动作,如果开了安全模式,那干的工作就更多额。嵌入式软件代码需要一定的方式烧录到芯片中才能运行,除了物理刻蚀,无论是通讯端口的传输或者调试端口的烧录,都需要驱动程序的支持。1、BootRom的存储介质成本很高,一般降成本会考虑缩小BootRom的大小,因此BootRom的代码尽量缩小。

嵌入式技术开发 462

嵌入式之详解:startup.S文件

我们在实际嵌入式软件开发过程中,大多数都是直接使用,关于其内部底层以及汇编了解甚少。刚好把笔记记录在博客上,方便复习以及分享给需要帮助的人。本章将从两部分:1 MCU上电->执行startup.s;2 startup.s代码解析。不必担心,走你~```asm.align 2_start::声明这是一个Thumb指令集的函数。.align 2:将函数的起始地址对齐到2的倍数,即按字对齐。:声明为全局符号,这样其他文件可以引用它。:指定是一个函数。_start和。

weixin_48498880的博客 1895

从数据手册到代码:MCU 外设驱动开发指南

数据手册 C 代码时序图(Figure) ──翻译──→ read() / write() ← 第2层寄存器表(Table) ──翻译──→ .h 宏定义 ← 第0层上电时序 ──翻译──→ init() ← 第5层传输函数(公式) ──翻译──→ set_value() ← 第4层量程参数 ──翻译──→ set_range() / priv ← 第4/1层换一颗芯片,变的只是第0层和第2层,第3~5层的结构完全不变。

niuTyler的博客 49

AUTOSAR图解==>AUTOSAR_SWS_MCUDriver

AUTOSAR MCU驱动是AUTOSAR标准中微控制器抽象层(MCAL)的核心组件之一,提供了对微控制器硬件的底层访问能力。MCU驱动负责基本的微控制器初始化、时钟配置、RAM段初始化、电源管理和复位控制等功能。微控制器时钟初始化:包括PLL设置、时钟预分频器配置和时钟分配RAM段初始化:初始化指定的RAM内存区域电源模式管理:激活微控制器低功耗模式硬件复位服务:提供触发硬件复位的功能复位原因查询:获取上一次复位的原因。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1907

《嵌入式发展简史及概念》

《嵌入式发展简史及概念》

阿丑の三板斧 389

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

嵌入式工程师快速上手新MCU的实战心法与工作流

在嵌入式系统开发中,微控制器(MCU)是核心执行单元,其架构与外设驱动是工程师必须掌握的基础。理解MCU的工作原理,如内存映射、时钟树和中断机制,是进行高效底层编程和系统优化的关键。这些技术能显著提升代码执行效率与系统实时性,广泛应用于物联网设备、工业控制和消费电子等领域。面对紧急项目或新硬件平台时,如何快速构建有效知识体系并交付成果成为核心挑战。本文基于**MCU速通**和**实战编程**等热词,拆解了一套目标导向、分层击破的**四阶段工作流**,帮助工程师从战略侦察到深度开发,实现快速上手与高质量交付。

weixin_30655569的博客 375

海康工业相机BayerRG8转BGR8实战:手把手教你用OpenCV实现高效图像转换

本文详细解析了海康工业相机BayerRG8格式到BGR8格式的高效转换实战。针对工业视觉项目中高帧率、大分辨率场景下的性能瓶颈,文章对比了海康SDK原生方案与OpenCV多种转换方法的优劣,并提供了从基础实现到高级优化(如多线程流水线、内存管理、SIMD指令集应用)的完整代码示例与性能调优策略,帮助开发者构建稳定、高效的图像处理系统。

weixin_29237635的博客 524

复位失败频发?,深度剖析车规MCU C语言复位代码隐患与修复方案

解决车规MCU复位失败难题,深入解析C语言复位代码常见隐患。涵盖启动流程、寄存器配置与看门狗处理等关键环节,提供可落地的修复方案与最佳实践。提升系统稳定性,值得收藏。

AlgoChat的博客 998

从一个过气考渣的角度看LLM智能化测试用例生成

根据业务需求生成测试用例,会涉及到相关上下文的召回、用例生成等场景。除了用例生成之外,也可以考虑应用LLM进行用例评审。因此,本文将涉及以下内容。

software_test010的博客 830

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 397

AUTOSAR图解==>AUTOSAR_SRS_MCUDriver

AUTOSAR MCU驱动程序是微控制器抽象层(MCAL)的重要组成部分,提供对微控制器基本功能的访问和控制。其主要功能包括初始化服务、时钟管理、电源管理、RAM初始化和复位控制。MCU驱动程序位于MCAL层,直接访问硬件,并为上层模块(如ECU状态管理器)提供服务,实现硬件抽象。其架构包含初始化序列、时钟配置、PLL管理、RAM初始化和低功耗模式控制。MCU驱动程序的状态机描述了其工作模式和状态转换关系,确保系统的稳定运行。初始化流程包括系统启动、复位状态获取、MCU初始化、PLL状态检查、RAM初始化和

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2010

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

单芯片大容量内存MCU如何改变嵌入式GUI架构

嵌入式GUI的流畅度与资源占用始终是开发者关注的核心问题,传统MCU因内部SRAM容量有限,常需借助外部SDRAM存放帧缓冲,由此带来成本高、布线复杂、低功耗难做等工程挑战。随着大容量内存MCU的出现,片内直接集成数MB甚至数十MB的PSRAM或DDR类存储介质,配合高速内部总线,使得单芯片承载复杂GUI界面成为可能。这类方案不仅简化了存储层次,还从硬件架构上解决了帧缓冲带宽不足、外部总线干扰和待机功耗过高等痛点,为智能家居面板、手持仪器、可穿戴设备等产品提供了更稳定的技术底座。本文从存储介质演进、系统架构

weixin_29184371的博客 253

FPGA/IC 秋招笔试/面试题总结(续)

FPGA/IC 秋招笔试/面试题总结(续)来啦… 文章目录二十七、状态机1. Moore/Mealy状态机2.一、二、三段式状态机 二十七、状态机 1. Moore/Mealy状态机 (1)Moore状态机: 输出只由当前状态决定,即次态=f(现态。输入),输出=f(现态) Moore型状态机的输出信号是直接由状态寄存器译码得到的。 Moore型状态机检测序列1101如下 Moore型状态机输出函数只由状态变量决定,想要输出Z=1,必须S4状态形成,即寄存器中的1101都打进去后才可以。输出Z=1会在

Crazzy_M的博客 2万+

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

嵌入式C开发利器:varch框架解析与应用

嵌入式开发中,资源优化与功能实现常面临两难选择。varch框架通过模块化设计解决了这一痛点,其核心原理包括零动态内存分配、编译期类型检查等嵌入式优化技术。该框架将40多个常用功能封装为可独立使用的组件,从数据结构到解析器一应俱全,特别适合8位到32位MCU平台。在物联网网关、工业传感器等场景中,varch展现出卓越的资源效率和稳定性。通过分层架构设计和双轨制容器实现,开发者可以灵活应对不同硬件约束,同时享受类型安全和高性能的优势。

weixin_30923011的博客 612

Python爬虫实战:绕过Cloudflare反爬的最新技术与完整代码详解

在互联网数据采集领域,越来越多的网站开始部署CDN和安全防护服务,其中 Cloudflare 是最为广泛使用的防护方案之一。它不仅为网站提供DDoS防护,还能通过JS挑战、验证码和行为分析来识别并拦截爬虫。这给爬虫工程师带来了极大挑战——如何在不违反网站服务条款的情况下,实现有效的数据采集?本文将分享Python领域绕过Cloudflare反爬的最新技术方法,结合最新流行库与自动化浏览器,帮助你攻克这一难题。绕过Cloudflare反爬不是一蹴而就,需结合多技术、多策略,持续迭代。

2201_76125261的博客 2628

嵌入式开发必知:SRAM与SDRAM在MCU中的实战选型指南

本文深入解析了嵌入式开发中SRAM与SDRAM的核心差异、工作原理及实战选型策略。SRAM速度快、接口简单但成本高,适合用作MCU内部高速缓存;SDRAM容量大、成本低但需定期刷新和复杂时序控制,适用于需要大容量缓冲区的图形界面、音视频处理等场景。文章结合MCU型号(Cortex-M/A系列)、项目需求(速度、容量、功耗、成本)及软硬件复杂度,提供了清晰的选型决策指南和避坑建议,帮助开发者做出最优选择。

echo99的专栏 750

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MCU项目软件分层设计规范--以 MCU 项目为例

本文探讨嵌入式软件分层设计的重要性与落地方法,针对MCU裸机或RTOS项目提出六层架构方案:应用层(业务逻辑)、服务层(通用能力)、设备层(硬件抽象)、BSP层(板级支持)、平台层(底层环境)和组件层(可复用基础模块)。核心原则包括单一职责、接口清晰、隔离变化等,强调通过分层解决长期维护痛点——当硬件变更或业务调整时,能有效控制影响范围。

玄天693 307

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

从K210的GPIO到串口:一个嵌入式视觉模块的通信架构设计

本文深入探讨了基于K210嵌入式视觉模块的通信架构设计,重点解析了GPIO配置、串口通讯协议选型及数据包处理机制。通过详细的硬件外设操作指南和错误恢复策略,为开发者提供了构建稳定、高效通信系统的完整解决方案,确保在复杂工业环境下的可靠数据传输。

ik6789012的博客 184

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: STM32F030C8T6 DMA
下一篇: stateMachine状态机框架
Let's Chat Coding
博客等级 码龄3年 1020粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值