嵌入式前后台(Bare-Metal RTOS-Like)架构详解

前后台(Bare-Metal RTOS-Like)架构

在嵌入式系统开发中,针对资源有限的STM32微控制器,前后台(Bare-Metal RTOS-Like)架构是一种轻量级的实时性设计方法,它模拟了实时操作系统(RTOS)的核心概念和机制,但无需完整的RTOS内核,降低了系统开销。以下是前后台架构的详细解析:

架构组成 前后台架构主要包含两大部分:

前台(Foreground):也称为“主循环”或“超级循环”,负责处理所有实时任务和事件。前台通常是一个无限循环,按照优先级顺序或轮询方式检查各个任务的状态,执行相应的处理逻辑。

后台(Background):包含一组异步运行的硬件中断服务程序(ISR)。当外部事件(如定时器中断、串口接收中断等)发生时,ISRs会被立即调用,快速响应并处理这些事件,然后返回前台继续执行。

任务调度与管理 在前后台架构中,任务调度相对简单:

实时任务:通过硬件定时器产生周期性中断,驱动前台主循环中的高优先级实时任务执行。例如,控制电机的PWM信号更新、传感器数据采集等。

非实时任务:在主循环中以较低优先级轮询执行,如数据显示、网络通信等。这类任务的执行时间可能受到实时任务的影响,但通常不会对系统整体实时性造成严重影响。

事件处理与同步 通过中断和全局变量等方式实现事件通知与同步:

中断触发:硬件事件(如按键按下、串口接收到数据等)触发相应中断,ISR快速处理并将事件标志置位,主循环检查这些标志以执行后续处理。

信号量/互斥量:虽然没有完整的RTOS内核支持,但可以通过自定义数据结构和算法模拟简单的信号量或互斥量机制,实现任务间的同步与互斥。

实际应用与C语言代码示例

前后台架构广泛应用于各类嵌入式系统,包括但不限于工业控制、智能家居、消费电子、物联网设备等。下面以STM32为基础,给出两个典型应用实例及其对应的C语言代码:

应用实例一:LED闪烁控制系统

以下是一个基于前后台架构的STM32嵌入式LED闪烁控制系统的C语言示例。该系统包括一个前台主循环和一个定时器中断服务程序,实现了LED每隔500毫秒交替亮灭的效果。假设使用STM32F103C8T6型号,并使用TIM2定时器。

#include "stm32f103xb.h"// 定义LED端口和状态标志
#define LED_PORT     GPIOB
#define LED_PIN      GPIO_PIN_5
volatile uint8_t led_state = 0;// 定时器中断服务程序(后台)
void TIM2_IRQHandler(void) {if (TIM2->SR & TIM_SR_CC1IF) { // 检查CC1中断标志TIM2->SR &= ~TIM_SR_CC1IF; // 清除中断标志// 翻转LED状态led_state ^= 1;}
}int main(void) {// 初始化RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB时钟RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟GPIOB->MODER |= GPIO_MODER_MODE5_0; // 设置PB5为输出TIM2->ARR = 9999;                     // 自动重装载值,设置定时周期(根据晶振频率计算)TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // 选择PWM模式1TIM2->CCER |= TIM_CCER_CC1E;         // 使能CC1通道TIM2->CCR1 = 4999;                   // 设置初始占空比为50%TIM2->DIER |= TIM_DIER_CC1IE;        // 使能CC1中断NVIC_EnableIRQ(TIM2_IRQn);           // 使能TIM2中断TIM2->CR1 |= TIM_CR1_CEN;            // 启动TIM2// 前台主循环(Foreground)while (1) {// 根据LED状态更新输出if (led_state) {LED_PORT->ODR |= LED_PIN;} else {LED_PORT->ODR &= ~LED_PIN;}}return 0;
}

应用实例二:按键响应与数据显示系统

下面是一个基于前后台架构的STM32嵌入式按键响应与数据显示系统的C语言示例。系统包括一个前台主循环、一个按键中断服务程序和一个定时器中断服务程序,实现按键检测、状态显示以及每隔1秒刷新LCD显示屏的功能。假设使用STM32F407VG型号,并使用EXTI线0(PA0)作为按键输入,TIM3定时器用于LCD刷新。

#include "stm32f4xx.h"
#include "lcd_driver.h"// 定义按键状态标志
volatile uint8_t button_pressed = 0;// 按键中断服务程序(后台)
void EXTI0_IRQHandler(void) {if (EXTI->PR & EXTI_PR_PR0) { // 检查EXTI0中断标志EXTI->PR = EXTI_PR_PR0; // 清除中断标志button_pressed = 1;     // 标记按键已被按下}
}// 定时器中断服务程序(后台)
void TIM3_IRQHandler(void) {if (TIM3->SR & TIM_SR_UIF) { // 检查更新中断标志TIM3->SR &= ~TIM_SR_UIF; // 清除中断标志lcd_refresh();           // 刷新LCD显示内容}
}int main(void) {// 初始化// ...(省略与LED闪烁系统类似的GPIO、TIM3和EXTI初始化)// 前台主循环(Foreground)while (1) {if (button_pressed) {// 处理按键事件button_pressed = 0;lcd_display("Button Pressed!");}}return 0;
}

小结

以上两个示例展示了前后台架构在STM32平台上的实际应用,分别实现LED闪烁控制和按键响应与数据显示功能。通过合理利用中断服务程序和前台主循环,可以构建出高效、实时的嵌入式系统,适用于多种资源受限的嵌入式应用场景。

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

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

相关文章

个人电脑本地部署LLM

普通电脑配置即可本地运行大模型,本地部署LLM最简单的方法 OLLAMA Ollama是一个开源框架,专门设计用于在本地运行大型语言模型(LLM)。它的主要功能是在Docker容器中部署和管理LLM,使得在本地运行大模型的过程变得非常…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) 数字型包含:整型int、浮点型float、布尔型bool、复数型complex 非数字型包含:字符串str、列表l…

CPPTest实例分析(C++ Test)

1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架,用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式,并且可以轻松添加新的输出格式。 CppTest下载地址:下载地址1  下载地址2 下面结合实例分析下CppTest如…

MAC系统升级问题记录

一、 场景 新购置一台MAC mini盒子作为开发使用,系统版本为macOS Sonoma 14.2, 由于是新机器,从新开始安装开发工具,从AppStore中获取XCode 15.3 版本,编译现有工程项目,报如下错误: SDK does not contai…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

传感器在机械自动化中的应用有哪些?

传感器在机械自动化领域扮演了非常关键的角色,它们是实现高效和精准控制的基础。传感器可以检测和测量机械系统中的各种物理量,如位置、速度、温度、压力等,并将这些物理量转换成电信号,以便控制系统能够进行分析和响应。以下是一…

vue使用外部的模板

在 Vue 2 中,如果你希望使用外部的 HTML 文件内容作为模板,有几种方法可以实现,但每种方法都有其局限性或需要注意的事项。下面是一些可能的方法: 1. 使用 AJAX 加载外部 HTML 你可以使用 AJAX 来异步加载外部的 HTML 文件&…

ARCGIS PRO3 三维模型OSGB转SLPK场景数据集

1.前言 因项目工作,需要将三维模型发布到arcgisserver上,但arcgisserver只支持slpk格式的模型,于是我开启了漫长的三维模型格式转换之旅,在这里记录下本人踩过的坑。 2.三维模型数据情况 2.1 模型大小:在20GB以上&a…

tcp inflight 守恒算法的自动收敛

inflight 守恒算法看起来只描述理想情况,现实很难满足,是这样吗? 从 reno 到 bbr,无论哪个算法都在描述理想情况,以 reno 和 bbr 两个极端为例,它们分别描述两种理想管道,reno 将 buffer 从恰好…

goroutinue和channel

goroutinue和channel 需求传统方式实现goroutinue进程和线程说明并发和并行go协程和go主线程MPG设置Go运行的cpu数 channel(管道)-看个需求使用互斥锁、写锁channel 实现 使用select可以解决从管道取数据的阻塞问题(无需手动关闭channel了)goroutinue中使…

Vue 3的性能优化策略

Vue 3有一些性能优化策略可以帮助提升应用的性能: 静态提升(Static Template Hoisting):Vue 3使用了模板编译提升技术,将模板编译为更高效的渲染函数。这个过程中,静态模板部分会被提升到编译阶段&#xff…

Rust 字符串基本使用教程及代码演示

文章目录 一、基本使用教程1、字符串类型String&str 2、创建字符串创建String创建&str 3、字符串操作索引切片格式化字符串比较 4、字符串和集合5、字符串的错误处理6、参考链接 二、代码演示1、代码演示2、执行结果 一、基本使用教程 在Rust中,字符串是编…

61、回溯-分割回文串

思路: 还是全排列的思路,列出每一种组合,然后验证是否是回文,如果是子串放入path中,在验证其他元素是否也是回文。代码如下: class Solution {// 主方法,用于接收一个字符串s并返回所有可能的…

油烟净化器控制食堂油烟排放:高效净化设备的必要性与实施策略

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 在食堂环境中,油烟排放是一个普遍存在且备受关注的问题。选择高效的油烟净化设备对于保障空气质量、改善生活环境…

智能变频三模正弦波控制器

智能变频三模正弦波控制器 前言一、图片介绍总结 前言 不敢动,完全不敢动。多做笔记,完全了解之后再说吧 一、图片介绍 轮毂电机 主角登场 淘宝关于这款控制器的介绍 当然不同的型号功能不同 学习线插上就会转,可以使用继电器控制通断。 电门…

mac资源库的东西可以删除吗?提升Mac运行速度秘籍 Mac实用软件

很多小伙伴在使用mac电脑处理工作的时候,就会很疑惑,电脑的运行速度怎么越来越慢,就想着通过删除mac资源库的东西,那么mac资源库的东西可以删除吗?删除了会不会造成电脑故障呢? 首先,mac资源库…

day03--react中setState的使用

一、setState state状态必须通过setState进行更新&#xff0c;且更新是一种合并&#xff0c;不是替换。 下面通过一个切换状态的例子说明 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewp…

解决ax = Axes3D(fig2)pycharm画3d图空白不显示问题

明明代码运行正确&#xff0c;却总是显示不出来 绘制出来的也是空白 改一下代码就好了 ax Axes3D(fig2) #原来代码 ax fig2.add_axes(Axes3D(fig2)) #改后代码 修改过后就可以显示了

深入了解MySQL:从基础到特性,全面解读关系数据库管理系统的历史与应用

文章目录 1. MySQL简介1.1 概述1.2 架构与兼容性1.3 开源与社区支持 2. MySQL的历史2.1 创始与初衷2.2 发展历程2.3 在Oracle的持续发展2.4 开源与商业结合 3. MySQL的核心特性4. MySQL在实际应用中的作用4.1 网站建设与内容管理4.2 商业智能与客户关系管理4.3 企业级应用与云集…

可视化软件开发

可视化软件开发纪要 当开发大型软件时&#xff0c;软件具有很多功能&#xff0c;很多模块揉到一起很难管理软件项目&#xff0c;所有重要的一点是如何解耦功能。比如在有限元软件中&#xff0c;网划分工具&#xff0c;求解器可以独立于界面软件&#xff0c;但是他们之间还是要…