如何处理嵌入式软件的并发控制
创始人
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

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

相关内容

热门资讯

当... 随着现代科技越来越发达,几乎每个年轻人都成为了社交平台的深度用户。 他们习惯了你给我的自拍照点赞,习...
苹... 目录1.苹果APPstore显示英文,如何调整为中文?2、通过QQ登录后,对方设备上显示用户的手机型...
是... 随着社交媒体的普及,微信已经成为人们日常生活中不可或缺的应用程序之一。微信作为一个即时通信软件,让人...
内... 昨晚我跟大家提到过内蒙古自治区关于网上报名证件照片核对要求部分宝物可能存在其他问题那么今天我就给大家...
砼... 砼软软件是一家专注混凝土行业智能管理、数字化转型解决方案的供应商,多年以来,公司始终致力于混凝土行业...
I... 我对Windows系统很恼火。 流氓软件泛滥成灾,各种弹窗广告令人防不胜防。 让人感到很不高兴。 有...
开... 如何开发iPad应用程序? 你有两种方法。 如果您有面向对象编程语言(例如 C++ 或 Java)的...
共... 在当今的社交软件中,共享位置功能已经成为了一个非常普遍且受欢迎的特性。这个功能可以让用户向朋友或家人...
V... VMware虚拟机对于喜欢体验不同系统的小伙伴是一个很好用的软件。该软件可以在不损坏原有系统的情况下...
文... 文华财经指标公式博易大师软件指标公式期货kd指标高手绝技风险提示:本指标公式仅作为知识分享,不构成任...
【... 工作中常会遇到这样的情况,格式需要经常转换,虽然WPS和office可以转换一些格式,但还是有很多格...
揭... 软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程。它是一项包括需求捕捉、需求分析、设计...
游... OPPO手机上可以在游戏软件商店中下载到光遇。具体的方法和步骤如下: 打开OPPO手机上的游戏软...
汽... 时不我待环顾全世界,汽车产业在几乎每个国家都被视作支柱产业。放眼中国,汽车行业机会很多,工作机会一大...
深... 深圳是中国软件开发行业的重要城市之一,拥有众多优秀的软件开发公司。下面我将为大家详细介绍几家值得推荐...
轻... Appstore下载安装如果三星手机需要下载安装软件应用,建议尝试以下步骤: 1. 使用手机功能表中...
一... 本文详细介绍了如何在苹果5s手机上安装微信应用商店(App Store)的方法。 打开手机主屏上的A...
精... 根据《国务院办公厅关于2024年部分节假日安排的通知》精神,结合我公司实际情况,现将2024年春节放...
谁... 根据您的描述,您想了解关于手机版的通达OA软件精灵和其他类似软件的信息。我们将对这些软件进行详细分析...
智... 点击上方蓝色字体,关注我们/电子电气架构技术创新交流群 /添加微信15021948198,申请加入汽...