行业动态

嵌入式软件舛误的五大启事
发布日期:2022-08-06 19:51    点击次数:81

 在嵌入式软件中缔造并解除潜伏的bug是一件费力的事变。要从窥察到的崩溃、挂起或别的策画外运行时动作追溯到基本启事,平日需求支出巨大的尽力和低廉的器材。嵌入式开发工程师们时常销毁寻找常见很是的启事——因为这些很是没法在试验室中等闲重现——而将其视为“用户舛误”或“小体系毛病”,然而,古板中的这些潜伏危急仍然一贯存在。

因而,这里有一个对付难以重现的固件舛误至多见的基本启事的指南。

1.堆碎片

嵌入式软件开发人员并未普及运用静态内存分派——这是有充分因由的,其中之一是堆碎片的成就。

经由过程 C 的 malloc() 标准库例程或 C++ 的 new 关键字创立的全体数据组织都存在于堆中。堆是 RAM 中事后肯定的最大大小的特定地区。最初,堆中的每个分派都市将残剩的“可用”空间削减沟通的字节数。

再也不需求的数据组织的存储可以或许经由过程调用 free() 或运用 delete 关键字前去到堆中。从实践上讲,这使得该存储空间可在后续分派时期重复运用。然则分派和删除的按次平日起码是伪随机的——导致堆变成一堆更小的碎片。

2.仓库溢出

每个顺序员都晓得仓库溢出是一件极度糟糕的事变™。 然则,每个仓库溢出的影响各不沟通。 损伤的性质和欠妥动作的时光齐全取决于破坏了哪些数据或指令以及怎么样运用它们。首要的是,仓库溢出与其对体系的负面影响之间的时光长度取决于运用破坏位从前的时光长度。

不幸的是,在嵌入式开发中,仓库溢出对嵌入式体系的影响远远逾越对台式计算机的影响。这有几个启事,蕴含:

嵌入式体系平日只能依附少量的 RAM; 平日没有可依附的虚拟内存(因为没有磁盘); 基于 RTOS 使命的固件策画行使多个仓库(每个使命一个),每个仓库的大小都必须足够大,以确保不会出现仅有的最坏环境仓库深度; 中缀处理惩罚顺序可以或许会查验测验运用这些沟通的仓库。

 

3.缺乏“volatile”关键字

未能运用 C 的“volatile”关键字标记某些范例的变量,可以或许会导致体系出现不少症状,这些症状只要在编译器的优化器配置为低级别或禁历时材干畸形事变。 volatile 限制符在变量声名时期运用,其目标是预防优化该变量的读取和写入。

请留心,除了确保对给定变量举行全体读取和写入之外,运用 volatile 还会经由过程增加额外的“序列点”来限制编译器。对多个 volatile 的拜访必须根据它们在代码中的写入按次执行。

4.较量条件

竞争条件是指两个或多个执行线程(可以是 RTOS 使命或 main() 加 ISR)的组合终局痛处每个指令交织的切确按次而变换的任何环境。

譬如,行业动态假设嵌入式开发人员有两个执行线程,其中一个定期递增全局变量 (g_counter += 1;),另外一个偶然重置它 (g_counter = 0;)。假设增量不克不迭一直以原子要领执行(即,在单个指令周期中),则此处存在竞争条件。计数器变量的两次更新之间的抵触可以或许永久不会或很少发生。然则当它这样做时,计数器实际上不会在内存中重置。这类影响可以或许会对体系孕育发生重大成果,尽管可以或许要等到实际碰撞后很长时分才会发生。

最好实际:可以或许经由过程萦绕必须以适合的抢占限制动尴尬刁难原子执行的代码的“关键部份”来预防竞争条件。为了预防奔忙及 ISR 的竞争条件,必须在别的代码的关键部份时期起码禁用一其中缀旗子灯号。在 RTOS 使命之间竞争的环境下,最好实际是创立特定于该同享工具的互斥锁,每个使命必须在进入临界区从前取得该互斥锁。请留心,依附特定 CPU 的功用来确保原子性着实不是一个好主张,因为这只会预防竞争条件,直到改观编译器或 CPU。

5.不成重入函数

从技能上讲,不成重入函数的成就是竞争条件成就的一个特例。 出于这个启事,由不成重入函数引发的运行时舛误是类似的,也不会以可重现的要领发生——这使得它们一样难以调试。 不幸的是,与别的范例的竞争条件比较,不成重入函数在代码反省中也更难缔造。

使函数可重入的关键是平息对外围寄存器、全局变量(蕴含静态部份变量)、速决堆工具和同享内存地区的全体拜访的抢占。嵌入式开发人员可以或许经由过程禁用一个或多其中缀或经由过程取得和释放互斥锁来实现,同享数据范例的细节平日选择了最好经管规划。



相关资讯