FreeRTOS队列好在哪里?--全局变量、环形缓冲区、队列

多个任务都想获取某一个变量的状态,这时应该怎么办?如何实现互斥访问?


全局变量

我们可以在这个c文件下定义一个全局变量,多个函数都可以获取这个变量的状态,从而完成自己的功能逻辑。但是这种多个任务同时操作共享资源的操作是不安全的!比如:从汇编的角度来讲(num++分成三步:读取到寄存器R0,R0进行自加运算,内存再读取回去),一旦在这三步中间被打断,这就是不安全的数据传输。

环形缓冲区

因此,我们引入环形缓冲区(RingBuffer),它的核心是使用双指针w和r表示下一个读/写位置,生产者读操作时只对r指针进行修改,消费者写操作只对w指针进行修改,这样就是安全的。
同时,环形缓冲区还有另外的优点。
解耦生产者和消费者:环形缓冲区作为生产者(producer)和消费者(consumer)之间的一个中间层,解耦了它们之间的直接依赖。生产者不需要等待消费者处理完数据后再继续工作,同样,消费者也不需要等待生产者产生数据。
但是,环形缓冲区还是不够好。

  • 如果多个任务都想来操作环形缓冲区的读、写指针怎么办?
  • 如果任务A完成某些实际操作,而任务B只是等待某个状态,那么每次任务B都获得与任务A相同的运行时间,是否对CPU资源造成一种浪费?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值