嵌入式编程之战:裸机VS实时系统

原创 云深之无迹 2025-02-18 10:00

嵌入式系统开发可以分为 裸机(Bare Metal) 和 RTOS(实时操作系统) 两种方式。

裸机开发意味着 没有 RTOS,程序直接运行在 MCU 上,所有任务调度 完全由开发者手动管理。裸机开发适用于 简单任务,低功耗系统,小型嵌入式设备,但当任务复杂到一定程度,就需要 RTOS 来管理。

裸机编程是 不依赖 RTOS,直接操作 MCU 硬件 的开发方式,通常采用:✅ 主循环(Super Loop)
✅ 中断驱动(Interrupt Driven)
✅ 状态机(State Machine)

int main() {    hardware_init();  // 硬件初始化(GPIO、UART、I2C、SPI)    while (1) {  // 主循环        task1();  // 处理传感器数据        task2();  // 处理按键输入        task3();  // 处理显示屏刷新    }}

这个编程起来就非常的简单,如程序所示。

说说裸机的问题->

  1. 任务管理困难:多个任务需要手动安排执行顺序 .因为是从头运行到尾部,一些子任务复杂,就要占用大量的CPU时间,下面的任务就执行不了。

  2. 实时性差:任务执行时间不可预测,容易卡死。这条就是1的后半段,后面的一些任务就饿死了。

  3. 同步与通信难:多个任务共享资源时,容易发生数据竞争。裸机之间的信息传输是需要global变量,这就有很多意想不到的问题,比如数据竞争什么的。

  4. 代码难以维护:任务逻辑复杂后,裸机程序难以维护。这个我觉得不是裸机的问题,纯粹就是写多了,都复杂。


这里总结了一些场景和用途

✅ 简单的单任务/少任务嵌入式系统 → 适合裸机
✅ 复杂的多任务、实时性要求高的系统 → 需要 RTOS

主循环(Super Loop),简单系统,如 LED 控制、按键扫描

void main() {    hardware_init();  // 硬件初始化    while (1) {        led_task();        button_task();        uart_task();    }}

这种代码最喜欢🌶

中断驱动(Interrupt Driven),事件驱动系统,如 UART、ADC 采集

void USART_IRQHandler() {      char data = USART_ReceiveData();      process_data(data);  }

✅ 减少 CPU 负担,数据来了才处理
❌ 任务间通信难,如果多个中断抢占,容易丢失数据,因为中断来的 时候,当前的数据是放在栈里面。

定时器 + 任务调度,定期任务,如 100ms 采集传感器数据

void TIM2_IRQHandler() {    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {        sensor_read_task();        display_update_task();        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    }}

✅ 定期任务调度,提高实时性
❌ 任务增多时,定时器调度难以管理。也就是说定时器的时间戳给每个子任务使用。

状态机(State Machine),按键检测、设备模式切换

typedef enum { IDLE, PROCESSING, ERROR } SystemState;SystemState current_state = IDLE;
void main() {    while (1) {        switch (current_state) {            case IDLE:                  if (button_pressed()) current_state = PROCESSING;                break;            case PROCESSING:                  process_task();                current_state = IDLE;                break;            case ERROR:                error_handle();                break;        }    }}

✅ 适用于复杂逻辑(如工控、状态机管理)
❌ 状态增多时,代码可读性下降

void Task1(void *argument) {    while (1) {        printf("任务 1 运行\n");        vTaskDelay(1000);    }}
void Task2(void *argument) {    while (1) {        printf("任务 2 运行\n");        vTaskDelay(2000);    }}
void main() {    xTaskCreate(Task1, "Task1"512NULL1NULL);    xTaskCreate(Task2, "Task2"512NULL2NULL);    vTaskStartScheduler();}

然后我们就可以写这种任务

RTC外设有什么用? 昨天不是写了一个RTC吗?我一直对定时器情有独钟,那我们就分析一下设计一个时钟怎么做?

闹钟应用通常需要 精准的时间管理、低功耗运行、定时唤醒,最佳选择是 MCU 内部的 RTC(Real-Time Clock)外设。

如果是设计一个引爆器,就是裸机了,感觉港剧里面的起爆器太low了,剪线?笑死,我把所有的传感器都加上,复杂的判断条件,精通的定时,谁都别想活。

  1. 初始化 RTC

  2. 设置 RTC 闹钟

  3. 进入低功耗模式

  4. RTC 到时间触发中断,唤醒 MCU

  5. 播放蜂鸣器 / LED 提示

  6. 等待用户停止闹钟

流程大概就是这样吧?

#include "stm32f4xx.h"
void RTC_Alarm_IRQHandler(void) {    if (RTC->ISR & RTC_ISR_ALRAF) {        RTC->ISR &= ~RTC_ISR_ALRAF// 清除闹钟标志位        printf("闹钟响了!\n");        buzzer_on();  // 打开蜂鸣器    }}
void RTC_SetAlarm(uint8_t hour, uint8_t min, uint8_t sec) {    RTC->ALRMAR = (hour << 16) | (min << 8) | sec;  // 设置闹钟时间    RTC->CR |= RTC_CR_ALRAIE;  // 使能闹钟中断}
void main() {    RTC_Init();  // 初始化 RTC    RTC_SetAlarm(7, 30, 0);  // 设置闹钟 7:30:00    enter_low_power_mode();  // 进入低功耗模式}

✅ 闹钟触发后 MCU 唤醒,执行 buzzer_on() 响铃
❌ 只能管理一个闹钟,多个闹钟需要手动写代码管理

我们来看看RTOS,

  1. 创建 RTC 任务

  2. 任务循环监听 RTC 时间

  3. 管理多个闹钟列表

  4. RTC 触发闹钟,发送任务通知

  5. 任务处理响铃逻辑

  6. 支持低功耗模式


#include "FreeRTOS.h"#include "task.h"#include "queue.h"
TaskHandle_t AlarmTaskHandle;
typedef struct {    uint8_t hour;    uint8_t min;    uint8_t sec;} AlarmTime_t;
QueueHandle_t xAlarmQueue;  // 闹钟队列
void RTC_Alarm_IRQHandler(void) {    BaseType_t xHigherPriorityTaskWoken = pdFALSE;    xTaskNotifyFromISR(AlarmTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken);    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);}
void AlarmTask(void *pvParameters) {    AlarmTime_t alarm;    while (1) {        if (xQueueReceive(xAlarmQueue, &alarm, portMAX_DELAY)) {            printf("闹钟响了!时间:%02d:%02d:%02d\n", alarm.hour, alarm.min, alarm.sec);            buzzer_on();        }    }}
void main() {    xAlarmQueue = xQueueCreate(5, sizeof(AlarmTime_t));  // 创建闹钟队列    xTaskCreate(AlarmTask, "AlarmTask", 512, NULL, 1, &AlarmTaskHandle);    vTaskStartScheduler();}

✅ 支持多个闹钟,闹钟时间可以存入队列
✅ 任务管理,优先级可控,实时性高
✅ 可以在 buzzer_on() 之后,延迟一定时间自动关闭蜂鸣器

总结一下

评论 (0)
  • 全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,凭借AS1163独立智能驱动器(SAID)成为中国领先的智能集成系统产品汽车制造商宁波福尔达智能科技股份有限公司(“福尔达”)环境动态照明应用的关键供应商。此次合作标志着汽车技术发展的一个重要时刻,充分展现了AS1163在优化动态照明应用系统成本方面的多功能性和先进性能。该产品支持传感器集成,拥有专为车顶照明设计的超薄外形,并能提升车内照明系统的性能。AS1163是一款先进的智能LED驱动器,能够与开放系统协议(OSP)网络无缝
    艾迈斯欧司朗 2025-03-20 14:26 100浏览
  • 4月8-11日,第91届中国国际医疗器械博览会(CMEF)将在国家会展中心(上海)举办。这场全球瞩目的医疗科技盛宴以“创新科技,智领未来”为主题,旨在全方位展示医疗科技的最新成果,与来自全球的行业同仁一道,为全球医疗健康领域带来一场科技与商贸交融的产业“盛宴”。飞凌嵌入式作为专业的嵌入式技术解决方案提供商,一直致力于为医疗器械行业提供丰富的、高可靠性的嵌入式硬件主控解决方案。届时,飞凌嵌入式将为来自全球的观众带来适用于IVD、医疗影像、生命体征监测等医疗设备的嵌入式板卡、显控一体屏产品以及多款动
    飞凌嵌入式 2025-03-20 11:46 39浏览
  • 为有效降低人为疏失导致交通事故发生的发生率,各大汽车制造厂及系统厂近年来持续开发「先进驾驶辅助系统」ADAS, Advanced Driver Assistance Systems。在众多车辆安全辅助系统之中,「紧急刹车辅助系统」功能(AEB, Autonomous Emergency Braking)对于行车安全性的提升便有着相当大的帮助。AEB透过镜头影像模块与毫米波雷达感测前方目标,可在发生碰撞前警示或自动刹车以降低车辆损伤以及乘员伤害。面临的挑战以本次分享的客户个案为例,该车厂客户预计在
    百佳泰测试实验室 2025-03-20 15:07 105浏览
  • PCIe 5.0应用环境逐步成形,潜在风险却蠢蠢欲动?随着人工智能、云端运算蓬勃发展,系统对于高速数据传输的需求不断上升,PCI Express(PCIe)成为服务器应用最广的传输技术,尤其在高效能运算HPC(High Performance Computing)及AI服务器几乎皆导入了最新的PCIe 5.0规格,使得数据传输的双向吞吐量达到了128GB/s,让这两类的服务器能够发挥最大的效能。不过随着PCIe 5.0的频率达到16GHz,PCB板因为高频而导致讯号衰减加剧的特性,使得厂商面临很
    百佳泰测试实验室 2025-03-20 13:47 104浏览
  • 流感季急诊室外彻夜排起的长队,手机屏幕里不断闪烁的重症数据,深夜此起彼伏的剧烈咳嗽声——当病毒以更狡猾的姿态席卷全球,守护健康的战争早已从医院前移到每个人的身上。在医学界公认的「72小时黄金预警期」里,可穿戴设备闪烁的光芒正穿透皮肤组织,持续捕捉血氧浓度、心率变异性和体温波动数据。这不是科幻电影的末日警报,而是光电传感器发出的生命预警,当体温监测精度精确到±0.0℃,当动态血氧检测突破运动伪影干扰……科技正在重新定义健康监护的时空边界。从智能手表到耳机,再到智能戒指和智能衣物,这些小巧的设备通过
    艾迈斯欧司朗 2025-03-20 15:45 173浏览
  •         在当今电子设备高度集成的时代,电路保护显得尤为重要。TVS管(瞬态电压抑制二极管)和压敏电阻作为一种高效的电路保护器件,被广泛应用于各种电子设备中,用以吸收突波,抑制瞬态过电压,从而保护后续电路免受损坏。而箝位电压,作为TVS管和压敏电阻的核心参数之一,直接关系到其保护性能的优劣。箝位电压的定义        箝位电压指瞬态保护器件(如TVS二极管、压敏电阻)在遭遇过压时,将电路电压限制在安全范围内的
    广电计量 2025-03-20 14:05 97浏览
  • 本文内容来自微信公众号【工程师进阶笔记】,以工程师的第一视角分析了飞凌嵌入式OK3506J-S开发板的产品优势,感谢原作者温老师的专业分享。前两周,有一位老朋友联系我,他想找人开发一款数据采集器,用来采集工业现场的设备数据,并且可以根据不同的业务场景,通过不同的接口把这些数据分发出去。我把他提的需求总结了一下,这款产品方案大概有以下功能接口,妥妥地一款工业网关,在网上也能找到很多类似的产品方案,为啥他不直接买来用?再跟朋友深入地聊了一下,他之所以联系我,是因为看到我在公众号介绍过一款由飞凌嵌入式
    飞凌嵌入式 2025-03-20 11:51 122浏览
  • 近日,保定飞凌嵌入式技术有限公司(以下简称“飞凌嵌入式”)携手瑞芯微电子股份有限公司(以下简称“瑞芯微”)正式加入2025年全国大学生嵌入式芯片与系统设计竞赛(以下简称“嵌入式大赛”),并在应用赛道中设立专属赛题。本次嵌入式大赛,双方选用基于瑞芯微RK3588芯片设计的ELF 2开发板作为参赛平台,旨在通过此次合作,促进产教融合,共同推动嵌入式系统创新人才的培养。全国大学生嵌入式芯片与系统设计竞赛是一项A类电子设计竞赛,同时也是被教育部列入白名单的赛事,由中国电子学会主办,是学生保研、求职的公认
    飞凌嵌入式 2025-03-20 11:53 87浏览
  • 如同任何对我们工作方式的改变,新的工作方式必然会遇到许多必须面对的挑战。如果不解决组织在实施精益六西格玛过程中面临的障碍以及如何克服它们的问题,那么关于精益六西格玛的讨论就不算完整。以下列举了组织在成功实施精益六西格玛时常见的几个障碍,以及克服它们的方法:1)对精益六西格玛方法论缺乏理解。抵触情绪通常源于对精益六西格玛方法论的不了解,以及不相信它能真正发挥作用。这种情况在所有层级的人员中都会出现,包括管理层。虽然教育培训可以帮助改善这一问题,但成功的项目往往是打消疑虑的最佳方式。归根结底,这是一
    优思学院 2025-03-20 12:35 106浏览
  • 家电“以旧换新”政策的覆盖范围已从传统的八大类家电(冰箱、洗衣机、电视、空调、电脑、热水器、家用灶具、吸油烟机)扩展至各地根据本地特色和需求定制的“8+N”新品类。这一政策的补贴再叠加各大电商平台的优惠,家电销售规模显著增长,消费潜力得到进一步释放。晶尊微方案为升级换代的智能家电提供了高效且稳定的触摸感应和水位检测功能,使得操作更加便捷和可靠!主要体现在:水位检测1健康家电:养生壶、温奶器、加湿器的缺水保护安全2清洁电器:洗地机、扫地机器人的低液位和溢液提醒3宠物家电:宠物饮水机的缺水提醒/满水
    ICMAN 2025-03-20 15:23 149浏览
  • 贞光科技代理的品牌-光颉科技高精密薄膜电阻凭借0.01%的超高精度,在AI服务器电源模块中实现了精确电压分配、优化功率因数和减少热损耗,显著提升系统能效和可靠性。在当今的数字时代,人工智能(AI)服务器已成为数据中心的核心。随着AI应用的激增,服务器的性能和能效需求也在不断提高。电源模块作为服务器的关键组件,其性能直接影响整个系统的效率和可靠性。本文将探讨光颉科技高精密薄膜电阻,特别是其0.01%的精度,如何在AI服务器电源模块中提升能效。电源模块在AI服务器中的重要性电源模块负责将输入电源转换
    贞光科技 2025-03-20 16:55 160浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦