如何通过互斥锁来安全地保护共享的 ADC 数据,同时多个任务能够实时读取、打印并控制 LED
扫描二维码
随时随地手机看文章
该项目展示了在基于 FreeRTOS 的系统(运行于 Arduino Uno 上)中实现安全的数据共享访问的实现方式。
多个任务同时读取、显示并处理一个 ADC 值,通过互斥锁确保数据的一致性,并防止出现竞争条件。
一个电位器模拟传感器的输入信号,而发光二极管则能清晰地显示系统状态。
项目概述
在多任务嵌入式系统中,若不进行数据保护就随意共享数据,可能会导致数据出现损坏或不一致的情况。
该项目使用 FreeRTOS 互斥锁来保护由三个独立任务共同访问的共享 ADC 变量。
启用 Core FreeRTOS 支持的方式为:
硬件设置
这个电位器能够生成从 0 到 1023 的模拟数值,以此来模拟真实的传感器信号。
系统架构
共享资源
•“adcValue”值由所有任务均可访问。
•该互斥锁确保在读写操作期间实现独占访问。
关键见解:
即使是一个单一的整数,在被多个抢占式任务访问时也必须得到保护。
任务职责
ADC 读数任务
每 50 毫秒读取一次模拟输入,并更新共享值
ADC 打印任务
安全地读取 ADC 值,并将其打印到串行监视器中。
LED 控制任务
在互斥保护下复制共享的 ADC 值,并根据阈值控制 LED 的状态。
LED 逻辑映射
这种映射能够即时提供传感器状态的直观反馈。
互斥锁设计
•类型:FreeRTOS 互斥锁(二进制模式,优先级继承功能已启用)
•受保护资源:adcValue
•目的:防止并发访问和数据竞争
为何选用互斥锁(而非信号量)?
互斥锁支持优先级继承功能,能够避免实时系统中的优先级倒置现象。
时间安排与日程规划
预期的序列输出
关键学习要点
•互斥锁如何防止竞争条件
•任务间传感器数据的安全共享
•协调具有不同优先级的多项任务
•由模拟输入驱动的实时 LED 控制
学习成果
该项目提供了一个清晰且实用的案例,说明了在实时嵌入式系统中互斥锁为何至关重要,以及在任务共享数据的情况下如何正确使用它们。
它与在基于专业实时操作系统的设计中所使用的实际传感器处理流程极为相似。
本文编译自hackster.io





