嵌入式前后台(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模式1
    TIM2->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.mfbz.cn/a/577326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用JavaScript日历小部件和DHTMLX Gantt的应用场景(一)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足项目管理应用…

深入了解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 企业级应用与云集…

新媒体运营-----短视频运营-----PR视频剪辑----抠像及美颜磨皮

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1. 超级键抠像绿(蓝)幕背景2. 常规视频抠像3. 美颜磨皮 1. 超级键抠像绿(蓝)幕背景 如果我们的素材是在摄影棚进行…

【R语言实战】——kNN和朴素贝叶斯方法实战

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

.net8系列-04图文并茂手把手教你配置Swagger支持token以及实现Swagger扩展,Swagger代码单独抽离

前情提要 接上篇文章,我们当前已完成如下内容: 创建应用成功创建接口成功配置Swagger实现接口注释和版本控制 本文章主要内容为:配置Swagger支持token传值测试接口 快速上手-代码配置 添加如下代码 文件目录:\xiaojinWebAppl…

06_Scala流程控制

文章目录 [toc] 1.流程控制**小结:** **2. Scala中流程控制没有三元运算符****2.1 Scala中如果逻辑代码只有一行可以省略花括号****小结:** **3. 循环控制****3.1 for控制****3.2循环守卫 --> 循环表达式添加逻辑判断****3.3 循环步长 --> 表示循环…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

Flutter - 折叠面板

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 flutter 自定义折叠组件 支持三种类型和两种展示效果可自定义title和被折叠的内容 效果图 示例 import package:flutter/material.dart; import /jh_common/widge…

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言: 近年来,网络安全问题日益严峻,其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中,.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点,并提出相…

#ESP32S3N8R8(按键点灯)

一、按键对应端口为GPIO0&#xff08;上拉&#xff09; 二、代码 #include <stdio.h> #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "unistd.h"void app_main(void) {int co…

JavaSE字节缓冲流

欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的博客中&a…

ElasticSearch 安装(docker)

下载安装包 阿里云链接&#xff1a; elasticSearch.exe https://www.alipan.com/s/3A356NnmWaJ 提取码: 93da 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 安装步骤 1、首先…

【介绍下OneFlow概念清单】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

INA226模块驱动代码-STM32F103

模块&#xff1a; 平台:STM32F103C8T6 标准库 软件模拟IIC C文件&#xff1a; #include "ina226.h"//delay static void delay_nns(uint16_t D) //30纳秒ns 根据手册要用到IIC的HS高速模式 {while(--D); }void delay_nms(uint16_t ms) //毫秒 {uint16_t i;uint3…

Android Dalvik虚拟机JNI方法的注册过程分析

Dalvik虚拟机在调用一个成员函数的时候&#xff0c;如果发现该成员函数是一个JNI方法&#xff0c;那么就会直接跳到它的地址去执行。也就是说&#xff0c;JNI方法是直接在本地操作系统上执行的&#xff0c;而不是由Dalvik虚拟机解释器执行。由此也可看出&#xff0c;JNI方法是A…

欧科云链:为什么减半对比特币生态的影响正在逐步“减弱”?

出品&#xff5c;OKG Research 作者&#xff5c;Jason Jiang 欧科云链OKLink数据显示&#xff0c;比特币于区块高度840000&#xff08;北京时间2024年4月20日8:09&#xff09;成功完成第四次减半&#xff0c;比特币挖矿奖励正式由6.25BTC减少至3.125BTC。此次减半之后&#x…

微信小程序:11.本地生活小程序制作

开发工具&#xff1a; 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发&#xff0c;js传统模版在project.private.config中setting配置项中配置checkinalidKey&#xff1a;false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

Mysql_数据库事务

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__事务&#xff09; ⏱️ 创作时间&#xff1a;2024年04月26日 ———————————————— 这里写目…

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器&#xff0c;由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器&#xff0c;具有高精度和长期稳定性。SHT30采用I2C数字接口&#xff0c;可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

Pytorch 的神经网络 学习笔记

参照官方网址 Module — PyTorch 2.2 documentation 一. 介绍 1. torch.nn模块&#xff1a; torch.nn是PyTorch中专门用于构建神经网络的模块。它提供了构建深度学习模型所需的所有构建块&#xff0c;包括各种层类型&#xff08;如全连接层、卷积层、循环层等&#xff09;、…
最新文章