如何处理嵌入式软件的并发控制
创始人
2025-12-27 15:06:03
0

随着代码规模日益增大,以及基于RTOS的多线程技术,使得嵌入式软件开发越来越关注“并发控制和线程安全”。

当多个执行线程(指正在运行代码的任意上下文,包括线程和中断服务程序)需要访问相同的共享资源时(包括软件数据和硬件资源),就可能因为竞态而导致错误。这种错误容易制造,但很难找到,从设计上保证正确性收益更大。

竞态的产生

当一个共享资源被多个执行线程“非原子性”访问时,一个执行线程的操作被另一个执行线程打断而带来错误就叫“竞态”,共享资源包括硬件设备和软件实体。

最明显的共享是全局变量,如果定义如下数组,它被多个线程读和写,这将成为最易理解的竞态。

int g_aiGlobalBuf[100];

另一种不太明显的共享是由不可重入函数造成的,如果多个线程调用了下面的函数,那么同样产生竞态。

void ProcGlobalBuf(int iPos, int iVal)
{
  g_aiGlobalBuf[iPos] = iVal;
}

硬件资源被多个线程使用也会引入竞态,如下面的函数(使用伪代码)被2个线程同时调用,那么第一个线程的数据可能还没有发送完毕就被第二个线程的数据“覆盖”。

void SendByDMA(const void *p_vBuf, int iSize)
{
    DMA.StartAddr = p_vBuf;
    DMA.Count = iSize;
    EnableDMA();
}

一句话:任何被多个执行线程使用的资源都可能产生“竞态”。

并发控制规则

规则一:只要可能,就应该避免资源的共享。

如果没有并发访问,就不会有竞态的产生。因此,设计代码应该具有最少的共享。这种思想的最明显应用是避免使用全局变量。如果我们将资源放在多个执行线程都会找到的地方,则必须有足够的理由。

例如硬件资源的分配中,串口只能由线程1调用,网口只能由线程2调用,LCD只能由线程3调用,那么这3种硬件资源的竞态一开始就杜绝了,同理可以应用到软件资源上。

规则二:引发竞态的共享资源必须加锁

然而,在计算机的世界里共享就是现实的生活,在单个执行线程之外共享硬件或软件资源的任何时候,因为另外一个线程可能产生对该资源的不一致观察,就必须显示地管理对该资源的访问。

像只读数据(如芯片的序列号)对于任何访问它的执行线程看来都是一致的,那么竞态是不可能发生的。

基于RTOS的嵌入式环境下对共享资源的加锁一般有3种途径:关中断、使用信号量、禁止任务切换。

关中断应用于2种情况:

  • 如果任务代码和中断程序共享资源,或者共享资源访问时间很短(如操作一个变量);

  • 如果仅线程之间访问一些共享资源且操作时间不太长,禁止任务切换可以胜任;其他情况下都将使用信号量。

规则三:被多线程调用的函数必须是可重入

一个函数是否是可重入的判断规则:

一个可重入函数一般用原子的方法使用变量,除非这些变量存储在调用这个函数的堆栈中或这些变量是任务的私有变量。

一个可重入函数一般不调用其他的不可重入的函数。

一个可重入函数一般不用非原子的方法使用硬件。

锁的使用规则

当我们创建一个可被并行访问的对象时,应该同时定义用来控制访问的锁。锁定模式必须在一开始就安排好,否则其后的改进将会非常困难。

如果某个获得锁的函数要调用其他同样试图获取这个锁的函数,我们的代码就会死锁,即不允许锁拥有者第二次获得这个锁;如果试图这么做,系统将持起。

提供给外部调用的函数必须显示地处理锁定,在编写那些假定调用者已处理了锁定的内部函数时,我们自己应该显示地说明这种假定,否则几个月后再回头来看这些代码时,很难记清在调用某个特定函数时是否需要拥有锁。

尽可能避免出现需要多个锁的情况,实在需要多个锁就要防止死锁的发生:始终以相同的顺序获得锁,并且了解其他代码操作锁的做法;先获取自己局部锁,再获取其他锁;在拥有锁时尽量避免线程被挂起,那样会导致实时性下降,甚至永久性挂起系统。

原文:https://blog.csdn.net/jiangjunjie_2005/article/details/30713585

文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

相关内容

热门资讯

上... 照片来源:John TonUnsplash本文原载于《上海文学》2019年第12期迷宫里的直播牛莉莉...
海... 海景摄影一直是我最喜爱的题材。在澳洲、新西兰和新加坡的旅行中,我无数次在半夜出发,只为捕捉清晨海面上...
5... 你是不是经常为找不到好看的小说而烦恼?觉得很多阅读APP都需要付费才能阅读全文?今天就给大家介绍5款...
初... 图片来源:Tuchong Creative♪ 作者|江源♪ 来源|真实故事计划(ID:zhenshi...
短... 因为我运营着一个短视频社区,社区里有些刚刚起步的朋友不知道有什么工具可以用来制作视频视频制作软件教程...
安... 前不久谷歌正式发布了新一代的安卓6.0系统,大大提升了安卓系统的体验,与此同时越来越多的新手机、旗舰...
会... 在会声会影中完成视频编辑后,您可以保存项目文件。保存项目文件对于视频编辑非常重要。保存工程文件同时也...
快... 我的猫会说话。它跳上床,踩在我的头上,问:“铲屎官,你卧室里还有一只猫?”“天哪!我跟你说过多少次了...
S... 今天我为你挑选了sayatoo 卡拉OK 字幕 中文版大小:1.6G12345131236语言 中文...
相... 首先我先介绍一下站长目前的状况。内容是王,外链是皇帝,内链是妃子,关键词是宰相,代码是将军,结构是城...
老... ∆ 点击上面的【Youke Liao】一起学习吧~今天老板给我安排了新的工作,加上上周安排的工作,前...
南... 注:全文很长。先简单介绍一下紫荆花,后面是徐姐写的紫荆花教程,很详细,推荐收藏,最后一段故事是紫荆花...
小... 近日,有用户反映,在电视上蜜蜂市场下载软件时,弹出“该应用已下架”的提示,尤其是小米电视用户。这到底...
小... 小米盒子 MDZ-09-AA 和 MDZ-09-AK 刷机固件 - 刷机固件 - EMMC 克隆备份...
地... 视频编辑软件EDIUS 6.02使用体验及功能与技巧介绍我在地方教育电视台工作,前几年一直用Cano...
蜗... 本文最初由 What's Worth Buying 的用户创建:此 ID 已协调前言故事要从2016...
免... 在做短视频运营的时候,是不是经常羡慕别人几百万的视频流量和几千万的变现?但他的视频流量平平无奇,更不...
金... 财务工作离不开财务软件,财务岗位招聘时会把“熟练操作财务软件”或“精通一款财务软件”作为基本招聘要求...
自... 我们做自媒体的时候,很多人都会选择做视频,有的人是做真人快手刷粉丝软件教程,给一些知识培训,一些常识...
新... 最近为了配合新型冠状病毒的防控工作,一直宅在家里,趁着这个时间学习了一下如何使用PRcc2018制作...