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

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

相关内容

热门资讯

国... 随着获客和开售老本的回升,国际的企业越来越注重精细化治理,正在以全体效率的优化来补偿因人力老本升高所...
数... 展示机型:华为MateBook X系统版本:win10 数据库治理系统是系统软件。 有代表性的系...
下... Excel不是数据库软件。 选项中4种软件简介: Microsoft Office Access是由...
出... ● 2005年03月,深圳鼎识科技有限公司成立。 ● 2005年05月,鼎识科技RFID技术运行...
经... 经常出现的数据库治理系统重要有以下几种:Oracle Database、MySQL、Microsof...
手... 若经常使用的是vivo手机,可参考以下模式操作: 一、清算运转内存:1、调出后盾运转软件,一键减速清...
X... 曾经的巨头Windows XP,虽然面临微软的弃之不顾,但在中国依然领有宏大的用户个体。 如何在...
数... 系统软件。 数据库治理系统是一种操纵和治理数据库的大型软件,用于建设、经常使用和保养数据库,简称...
电... 比拟好的电脑安保软件有:腾讯管家、网络卫士、卡巴斯基、金山毒霸。 1、腾讯管家 腾讯电脑管家(Ten...
软... 1、软件开发是依据用户要求建造出软件系统或许系统中的软件局部的环节。 软件开发是一项包含需求捕捉...
全... 1. 启明星河:该公司在政府相关方面具备长处,其自主开发的入侵检测系统(IDS)和扫描器内行业内具备...
消... 本书详尽论述了消息化音视频设施与系统的基础常识,内容涵盖15章。 首先,它深化剖析了大屏幕投影、...
P... 《Premiere Pro CS6中文版规范教程》是2014年5月清华大学出版社出版的图书,作者是黄...
手... 1、Lexis Audio Editor 《手机音频编辑器 Lexis Audio Editor》是...
c... CorelDRAWGraphicsSuite是加拿大Corel公司的平面设计软件;该软件是Corel...
三... ①CPU:普通来说,CPU的主频越高,单核性能越强,建模操作越流利;CPU的外围数越多,多核性能越强...
收... 须要下载经常使用一些手机中比拟好用的收费的音频剪辑的软件的用户,在此可以找到以后最好用并且都是收费工...
c... 软件装置失败经常出现疑问有: 1、操作系统版本和兼容性疑问,大局部专业性质软件都明白规则了各个软件版...
学... 学习3d建模须要中下等的电脑性能。 学3d建模重要考验CPU和内存,假设不是3d建模,16G内存+固...
可... 该软件早期名为3DS,由于相似dos年代,须要记忆少量的命令,由于经常使用不便,后改为max,图形化...