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

FreeRtos——5、资源模型:临界区与共享资源

前言

在掌握了“数据流”和“控制流”之后,我们来到了嵌入式开发中最容易发生“翻车”的地带:资源竞争

如果你的代码在任务 A 里正在通过 I2C 发送 10 个字节,发到一半,任务 B(高优先级)强行插入并抢走 I2C 的控制权,去读取另一个传感器,那么 I2C 总线上的波形就会彻底崩掉。

1. 为什么你的 I2C/SPI 总线会无故死锁?

  • 重入冲突:外设驱动(如 HAL 库)内部通常有状态机,不能在未完成时被重入调用。

  • 优先级反转:任务 C(低)占着串口,任务 A(高)死等串口,结果任务 B(中)跑出来把任务 C 抢占了,导致 A 实际上在等 B。

  • 效率低下:频繁开关中断会导致系统失去实时性。

2. 知识点:保护资源的三种境界

第一重:原子操作与关中断(最硬核的锁)

  • 应用:修改一个简单的全局标志位或计数器。

  • 手段:taskENTER_CRITICAL()。它直接关闭所有可屏蔽中断。

  • 代价:整个世界都停了。如果这里逻辑太长,你的系统时钟滴答都会丢失。

第二重:互斥锁(Mutex)

  • 应用:保护硬件外设(I2C/SPI/文件系统)。

  • 手段:osMutexAcquire。它支持优先级继承,是 RTOS 中保护资源的正规军

第三重:守护任务模式(Gatekeeper) —— 老鸟的首选

  • 理念:“既然大家都要抢,那就谁也别直接碰,找个管家管起来”。

  • 优点:资源操作被完全串行化,不存在竞争,且方便添加缓存逻辑。

3. 实操:构建一个串口“守护任务”

场景:我们不再让每个任务都去调用HAL_UART_Transmit,而是建立一个PrintServer任务。

3.1 守护任务的实现

/* 定义日志消息结构 */ typedef struct { char *str; uint32_t value; } LogEntry_t; osMessageQueueId_t LogQueueHandle; //消息队列ID void StartLogGatekeeperTask(void *argument) { LogEntry_t log; LogQueueHandle = osMessageQueueNew(16, sizeof(LogEntry_t), NULL); //创建消息队列 for(;;) { // 阻塞等待:只有有人要打印时,管家才干活 if (osMessageQueueGet(LogQueueHandle, &log, NULL, osWaitForever) == osOK) { // 在这里统一操作硬件,不存在竞争 printf("[LOG] %s: %d\r\n", log.str, log.value); } } }

3.2 客户端任务的调用

void StartAppTask(void *argument) { LogEntry_t myLog = {"Temp", 25}; for(;;) { // 投递即走,不阻塞自己的逻辑去等串口发送,将要打印的Log写入队列 osMessageQueuePut(LogQueueHandle, &myLog, 0, 0); osDelay(1000); } }

4. 进阶:互斥锁保护 SPI 总线

如果你必须在多个任务里直接操作外设(比如复杂的屏驱),请使用互斥锁。

osMutexId_t SpiMutexHandle; void Init_Resources(void) { // 互斥锁必须在任务开始前创建 SpiMutexHandle = osMutexNew(NULL); } void Access_Spi_Device(void) { // 1. 拿钥匙 if (osMutexAcquire(SpiMutexHandle, osWaitForever) == osOK) { // 2. 独占操作硬件 // HAL_SPI_Transmit(&hspi1, data, size, 100); // 3. 还钥匙 osMutexRelease(SpiMutexHandle); } }

5. 思考:读写锁模型

有时候我们允许多个任务“读”参数(如配置信息),但只允许一个任务“写”。

  • 实操技巧:这种场景可以用计数信号量(Counting Semaphore)模拟,或者使用互斥锁保护一个读计数器。

  • 原则:写者必须拿到最高权限,读者可以并存。

6. 总结本章

保护共享资源,要么用“锁”把它保护起来,要么找个“管家”替你守着它。

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

相关文章:

  • 3.4 模型排名与Elo:Pairwise对比评估实战指南
  • 过知网AIGC检测用什么降AI软件?实测推荐这几款
  • 探讨2026年铁皮打球机,高口碑厂家怎么收费 - 工业品网
  • 2026年市面上比较好的方形横流冷却塔制造企业怎么选择,冷却塔填料/冷却水塔,方形横流冷却塔直销厂家怎么选择 - 品牌推荐师
  • 维普万方查AI太严?这两款降AI工具一次搞定
  • 2026年深圳口碑排名前十天御香山花园、万科臻山府、福田熙园房产销售推荐 - myqiye
  • 2026 年 WAF 技术演进:从规则匹配到 AI 行为分析的对抗实战
  • 2026年质量好的陕西MVR浓缩器/MVR浓缩器哪家便宜源头直供参考(真实参考) - 行业平台推荐
  • 春节出境游✅ 机场通关别再死等啦!
  • 陕西医科学校招生电话能了解什么内容?为你解惑 - 工业品牌热点
  • 基于DevEco鸿蒙开垃圾分类APP实现
  • 从此告别拖延!千笔ai写作,碾压级的AI论文工具
  • 2026年2月烟台旅行社推荐竞争格局深度分析报告 - 2026年企业推荐榜
  • 基于SSM的共享电动车管理系统[SSM]-计算机毕业设计源码+LW文档
  • 2026年比较好的石家庄商城小程序开发/石家庄APP小程序开发服务好评推荐机构 - 行业平台推荐
  • 【2026最新】HD Tune Pro下载安装全攻略:硬盘健康状态一键检测(附安装包) - sdfsafafa
  • 职场人写报告被查AI?这两款降AI工具解救你
  • Python 开发|企微外部群主动发消息实操指南
  • 2026年比较好的儿童房设计/女孩儿童房信誉优质供应参考(可靠) - 行业平台推荐
  • 2026年比较好的泡沫消防车/湖北干粉消防车厂家采购参考指南 - 行业平台推荐
  • 分期乐购物额度回收靠谱吗?详解安全流程与使用建议 - 团团收购物卡回收
  • 2026陕西舞蹈艺考怎么选?五大专业舞蹈培训机构助力统考与校考 - 深度智识库
  • 2026年分析比较不错的LED显示屏专业公司,选购攻略分享 - 工业推荐榜
  • 2026年靠谱的锰13钢板/太钢锰钢板高评分品牌推荐(畅销) - 行业平台推荐
  • 2026年比较好的铝方管吊顶/无缝铝方管厂家实力参考 - 行业平台推荐
  • 2026年市面上口碑好的冷链设备直销厂家选哪家?这些值得关注,二手市场/冷链设备/厨房设备/办公家具,冷链设备厂家排行 - 品牌推荐师
  • 2026年比较好的0甲醛攀岩墙/定制攀岩墙高评分品牌推荐(畅销) - 行业平台推荐
  • 钢板止水带市场观察:实力与口碑兼具的厂商,钢支撑/不锈钢止水钢板/止水钢板/钢板止水带/穿墙螺丝,钢板止水带公司排行榜 - 品牌推荐师
  • 2026年质量好的彩色电泳加工/电器电泳加工厂家实力参考 - 行业平台推荐
  • 2026年效果好的宁波制造业短视频运营/宁波短视频运营培训专业推荐公司 - 行业平台推荐