当前位置: 首页 > news >正文

基于STM32F103系列芯片与EC200T 4G模块的远程升级系统:多程序切换防变砖,清晰升...

stm32 IAP升级 OTA升级 野外设备远程升级 自建FTP服务器升级 多App备份 切换,防变砖 芯片 stm32f103系列 4G模块 EC200T 程序简介:一个bootloader程序 多个主程序程序可相互切换 主程序A 出厂前烧录,永不更改,用于升级失败后,做应急程序使用,保障单片机不变砖 主程序B 日常运行,可升级替换 主程序C 功能与主程序B相同 三个主程序间可通过上位机远程控制,切换运行 单片机通过4G模块远程下载服务器上的BIN文件,通过BIN文件数据自动判断程序应该烧录的flash位置进行升级,升级成功后自动跳转到新程序。 本程序升级流程清晰,多重防范措施避免单片机因为升级而变砖,保证系统正常运行。 无论你想要通过什么方式升级,只需要自己修改数据的接收方式,搭配我的固件处理代码,可有效保证系统稳定运行。 可以得到 bootloader和app的源码,上位机EXE文件,详细的说明书文档(附带如何自己搭建FTP服务器)

FreeRTOS 事件组(Event Group)模块功能说明

=====================================

一、模块定位

事件组是 FreeRTOS 任务间、任务与中断之间“多对多”同步的轻量级原语。它把“单个 32 bit 变量”抽象成“最多 24 个独立事件位”,通过“位或、位与、位清除、位等待”四种原子语义,让多个任务可以以“任意位匹配”或“全位匹配”方式聚合/等待事件,从而替代传统“多个二值信号量”方案,减少 RAM 占用与上下文切换次数。

二、核心能力

  1. 位生命周期管理
    • 创建:支持静态、动态两种内存模型;初始化时所有位清零。
    • 删除:自动唤醒所有阻塞在该事件组上的任务,返回 0 并释放内存(仅动态)。
  1. 位状态机
    • 置位:xEventGroupSetBits() / xEventGroupSetBitsFromISR()
    – 任务级立即生效;ISR 级通过 Timer-Daemon 异步代理,保证非确定性操作不在中断内执行。
    • 清位:xEventGroupClearBits() / xEventGroupClearBitsFromISR()
    – 同样提供同步/异步两种语义。
    • 读位:xEventGroupGetBits() / xEventGroupGetBitsFromISR()
    – 快照式读取,返回调用时刻的完整 24 bit 值。
  1. 多任务同步原语
    • 单事件等待:xEventGroupWaitBits( …, xWaitForAllBits=pdFALSE )
    – 任意一位匹配即返回,可按参数选择“退出时自动清位”。
    • 多事件同步:xEventGroupSync()
    – 先置本位,再等待其余合作任务把约定好的“汇合位”全部置 1;成功返回前自动清掉汇合位,实现一次性屏障。
    • 超时管理:统一使用 TickType_t 精度,内部与 xTaskResumeAll() 联动,保证挂起调度器期间不丢失时钟节拍。
  1. 线程安全策略
    • 临界区:任务级 API 进入临界段前调用 vTaskSuspendAll(),禁止调度而非关中断,使 ISR 仍可响应。
    • 懒代理:ISR 级 API 仅把“位操作”封装成一条 Daemon 命令,真正的置位/清位在 Timer 任务上下文完成,彻底消除关中断时间不确定性。
  1. 性能优化
    • 位运算替代链表搜索:当事件组值已满足等待条件时,直接跳过插入等待列表步骤,减少 1~2 次上下文切换。
    • 无锁快照:GetBitsFromISR 采用 portSETINTERRUPTMASKFROMISR() 单指令屏蔽优先级低于 configMAX_SYSCALL 的中断,实现“读-快照”原子性。

三、典型应用场景

  1. 外设状态聚合
    将 DMA 完成、CRC 正确、帧头匹配三个中断事件映射到 bit0~bit2,协议栈任务只需一次 xEventGroupWaitBits( …, BIT0|BIT1|BIT2, pdTRUE, pdTRUE, timeout ) 即可“等齐”后继续解析,替代三个信号量。
  1. 多任务屏障同步
    三个 Worker 任务分别计算矩阵分块;每块算完后调用 xEventGroupSync( …, TASKxBIT, ALLBITS, portMAX_DELAY );主控任务可设置超时,若某 Worker 死锁则触发异常恢复。
  1. 低功耗唤醒掩码
    把 RTC 闹钟、外部中断线 0、无线接收帧 三个唤醒源映射到事件组;Idle 钩子中调用 xEventGroupWaitBits( …, pdFALSE, pdFALSE, xExpectedIdleTime ),可实现“任意唤醒源”一次性退出 Tickless Idle,减少多次唤起的功耗。

四、配置与裁剪

• 事件位数量:由 configUSE16BIT_TICKS 决定;0 时 24 位可用,1 时 8 位可用。

• Daemon 依赖:当且仅当 configUSE_TIMERS==1 时才提供 FromISR 异步 API;若关闭软件定时器,则 ISR 只能“上锁+立即清位”或自行实现延迟工作队列。

• Trace 支持:通过 configUSETRACEFACILITY 打开 EVENTGROUPxxx 宏,可对接 Segger SystemView、Percepio Tracealyzer 等可视化工具。

五、使用约束

  1. 位意义由应用全权定义,内核仅保证“原子置/清/等待”语义,不会解释任何位含义。
  2. 事件组不具备“计数”能力,若需要“事件累计”请选用计数信号量或队列。
  3. xEventGroupSync 成功返回后,汇合位已被自动清除;若任务需再次使用,必须重新置位。
  4. 同一事件组上混合“中断置位 + 任务清位”时,务必使用 FromISR 版本,避免在 ISR 中直接清位导致优先级反转。

六、快速集成步骤

① 在 FreeRTOSConfig.h 中确认

#define configUSE16BIT_TICKS 0 // 24 位事件位

#define configUSE_TIMERS 1 // 打开 Daemon,支持 FromISR

stm32 IAP升级 OTA升级 野外设备远程升级 自建FTP服务器升级 多App备份 切换,防变砖 芯片 stm32f103系列 4G模块 EC200T 程序简介:一个bootloader程序 多个主程序程序可相互切换 主程序A 出厂前烧录,永不更改,用于升级失败后,做应急程序使用,保障单片机不变砖 主程序B 日常运行,可升级替换 主程序C 功能与主程序B相同 三个主程序间可通过上位机远程控制,切换运行 单片机通过4G模块远程下载服务器上的BIN文件,通过BIN文件数据自动判断程序应该烧录的flash位置进行升级,升级成功后自动跳转到新程序。 本程序升级流程清晰,多重防范措施避免单片机因为升级而变砖,保证系统正常运行。 无论你想要通过什么方式升级,只需要自己修改数据的接收方式,搭配我的固件处理代码,可有效保证系统稳定运行。 可以得到 bootloader和app的源码,上位机EXE文件,详细的说明书文档(附带如何自己搭建FTP服务器)

② 创建句柄

EventGroupHandle_t xEG = xEventGroupCreate();

③ 中断内通知

xEventGroupSetBitsFromISR( xEG, BITDMADONE, &xHigherPriorityTaskWoken );

④ 任务侧等待

EventBits_t uxBits = xEventGroupWaitBits( xEG,

BITDMADONE | BITCRCOK,

pdTRUE, // 退出时清位

pdTRUE, // 全位匹配

pdMSTOTICKS(50) );

if( (uxBits & (BITDMADONE | BITCRCOK)) == (BITDMADONE | BITCRCOK) )

{ /处理合并事件/ }

通过以上机制,事件组在仅消耗 28 字节 RAM(StaticEventGroup_t)的前提下,即可替代传统“N 个信号量 + M 次同步”方案,显著降低资源占用与 CPU 负载,是 FreeRTOS 高内聚、低耦合设计哲学的典型体现。

http://www.jsqmd.com/news/505430/

相关文章:

  • 开源还是商业?关于Geo源码系统的那点事儿,一次说明白
  • 二阶RC等效电路锂电池模型仿真系统功能说明
  • 如何通过Obsidian PDF++实现PDF高亮样式的个性化定制指南
  • 12、深入解析STL中的multiset:高效处理重复元素的利器
  • 苹果“应用追踪透明度”:掌控隐私,重塑广告生态
  • 投影矩阵:从高维数据到低维空间的智能降维艺术
  • Selenium+ChromeDriver 126实战:如何自动截取带登录态的长页面(附懒加载处理技巧)
  • 如何快速解锁QQ音乐加密格式:QMCDecode的完整使用指南
  • 建议收藏,我转行AI大模型了!原因很简单…
  • Excel VBA 核心概念全解析:宏、模块、过程的区别与联系(含 SpreadJS Web 替代方案)
  • Sentinel学习
  • git 怎么导出提交历史,文件是乱码
  • 173.6亿元!2032年半导体材料回收市场规模锁定,资源再生产业迎来新增长极
  • 教程】利用MATLAB绘制分布式电源配电网模型图,详解故障点设置与短路波形显示,实现电压电流的...
  • ms-swift保姆级教程:从安装到微调,小白也能轻松上手
  • Llava-v1.6-7b医疗应用:医学影像报告自动生成系统
  • 全球隐私控制(GPC):隐私保护新利器的机遇与挑战
  • SEO_10个提升网站排名的实用SEO技巧分享(80 )
  • Vivado 2023.1与VCS/Verdi 2022版本跨版本联合仿真实战指南
  • Transformer跨界玩转多模态:MulT模型在语音+视频+文本分析中的5个实战技巧
  • 金仓数据库在文档型数据迁移中的技术观察:基于MongoDB协议兼容与安全治理的政务金融实践
  • 为什么ResNet-50能解决梯度消失?深入图解残差连接原理
  • B样条vs贝塞尔:游戏角色动画该选哪种曲线?Unity性能实测对比
  • 避坑指南:多组学相关性热图绘制常见的5个数据预处理错误及解决方法
  • AI4S重塑药物研发:药物研发中的AI应用,外包还是自主掌握?
  • DAMOYOLO-S模型鲁棒性测试:对抗样本攻击与防御初探
  • 即席查询框架选型指南:从Presto到ClickHouse的7种方案对比(2023版)
  • AI小程序定制开发:河南企业如何选择靠谱的技术服务商?
  • Cogito-V1-Preview-Llama-3B辅助C语言学习:代码注释生成与基础概念讲解
  • 轻资产创业实战:KISSABC 智能化云仓与数字化系统如何赋能合作伙伴稳健经营?