1986cba选秀

admin · 2008-10-01

  正在嵌入式软件中浮现并排挤潜正在的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.不成重入函数

  从技巧上讲,不成重入函数的成绩是逐鹿条目成绩的一个特例。 出于这个源由,由不成重入函数惹起的运转时舛误是好似的,也不会以可重现的格式产生——这使得它们同样难以调试。 可怜的是,与其余范例的逐鹿条目比拟,不成重入函数正在代码检察中也更难浮现。

  使函数可重入的要害是停息对外围存放器、全部变量(包罗静态部分变量)、漫长堆工具和同享内存地区的整个接见的抢占。嵌入式拓荒职员可能经由过程禁用一个或众个间断或经由过程获取和开释互斥锁来告竣,同享数据范例的细节平时断定了最佳处理计划。

文章推荐:

2022 年中国人工智能行业发展现状与市场规模分析 市场规模超 3000 亿元

该来的总要来! 切尔西老板将彻底退出英国市场

雷神黑武士四代开售:i7搭RTX3060不到9千元

智慧城市中 5G 和物联网的未来