0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IEC61508系统中的动态内存使用

麦克泰技术 来源:麦克泰技术 2025-04-11 15:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

IEC 61508标准强烈推荐使用静态内存管理方式。在安全应用设计中,我们都在遵循这个建议。但我们可能会需要这样的功能:

• 运行时配置

• 删除组件的编译时配置

• 更灵活的控制外部行为或硬件

• 平台作为完整的一代产品

这些功能需要动态内存管理解决方案。

IEC61508中推荐使用静态内存管理方式的原因与动态内存管理相关的编程错误导致的潜在风险相关,我们必须避免和发现这些编程错误,潜在风险包括:

1 内存碎片

2 没有可用内存

3 空闲内存丢失

4 内存释放到错误内存池

5 内存多次释放

6 释放后继续使用内存

7 使用时释放内存

一类解决方案只允许分配内存,这类解决方案通过避免内存重用来解决上述问题中的3-7,这是一种有效的解决方案,通常用于不同产品变体启动期间中的内存灵活配置,在运行期间保持内存布局不变。

当这类方法不能满足需求时,我们需要一种更通用的方法来系统地避免或检测所有列出的风险情况。

1内存碎片

内存碎片是一种效应,当我们使用不同的内存大小执行多个分配和释放周期时可能会产生这种效应。

在实时系统中,我们需要确定性和恒定的执行时间。使用改进的分配算法(如首次适配算法),执行时间严重将依赖于以前的内存活动,这对我们的系统设计是不利的。

避免内存碎片的方法是使用一个(或一组)固定大小的内存块池。好消息是专业的实时内核为用户提供了固定大小内存块的内存管理机制,用户可以使用实时内核提供的这些服务。在本文中,我们考虑实时内核的主函数接口。

作为参考,一个简单的使用序列为:

ptr =MemAlloc(pool);
/* use memory via ptr */
MemFree(pool, ptr);

在启动过程中调用:

pool= Create(mem, size, num);

2没有可用内存

如果没有足够的内存满足当前分配请求,内存分配函数会反馈相应信息(如NULL指针)。用户应该检查函数返回值并采取适当的措施。

ptr =MemAlloc(pool);
if(ptr ==NULL) {
 MemErrOutOfMemory(pool);
}
/* use memory via ptr */
MemFree(pool, ptr);

使用实时内核时,我们可以通过扩展内存分配函数,进一步避免丢失检查和失败处理的风险,使用阻塞等待空闲内存:

ptr =MemAllocWait(pool);
/* use memory via ptr */
MemFree(pool, ptr);
ptr =MemAllocWait(pool);

通过阻塞等待方式确保返回的指针是一个有效的内存块。强制性安全任务监视器将检测任务是否在定义的截止时间内获得足够的内存。

3内存释放到错误内存池

如果用户负责将内存释放到正确的内存池中(例如,内存池是释放内存的参数),可能会出错。我们可以通过向info区域添加额外的参数来避免这个错误。为了简单(快速)地访问这些数据,info区作为已分配内存的一部分。应用程序不能使用这部分数据,并且位于应用程序内存块引用的前面:

ab69f732-1681-11f0-9310-92fbcf53809c.png

改进后的内存使用顺序如下:

ptr =MemAllocWait(pool);
/* use memory via ptr */
MemFree(ptr);

4空闲内存丢失

所谓的“内存泄漏”发生在内存分配且被使用之后,但没有释放内存块的时候。此错误不容易检测,特别是当分配和释放操作将在不同的函数(或任务)中实现时。

在不知道应用程序细节的情况下,检测内存泄漏的一种方法是使用内存看门狗,看门狗的工作方式类似于通常使用的执行看门狗。

假设在内存分配过程中定义了一个看门狗时间,这迫使我们在这段时间内触发看门狗,以保持内存块有效。

我们将内存计时数据存储在info区域中。

为了检查所有分配的内存块的看门狗时间周期,我们引入了一个检查函数。下列伪代码可以帮助了解我们如何检查内存块。

voidMemCheck(pool)
{
 foreach'block'in'pool'do:
   if('block::timeout'isgreater than0) then:
      decrement'block::timeout'by1
   if('block::timeout'isequal to0) then:
     callMemErrTimeout(block)
}

我们系统安全自检过程中定期调用这个函数。使用序列如下所示。

ptr =MemAllocWait(timeout, pool);
MemUseTrigger(ptr);
/*use memory via ptr*/
MemFree(ptr);

如果错过了看门狗时间周期,我们可以在回调函数中执行适当的动作:

voidMemErrTimeout(ptr)
{
 /* action on timeout: */
 /* log diagnostic data */
 /* initiate safe state */
}

5内存多次释放

当在没有检测机制的情况下多次(错误地)释放一个内存块时,可能导致正在运行系统的奇怪行为。这种错误很难调试,必须避免。

在info区域中添加一个额外的冗余值,可以非常有效地处理这个问题。推荐使用内存池参数的补值,需在内存分配函数中将这两个值设置为匹配的一对。

内存释放函数可以检查这些冗余信息,将内存块放回相应的内存池中,然后破坏冗余信息。实现伪代码如下:

voidMemFree(ptr)
{
 if('ptr::pool'isequal to complement of'ptr::inv_pool') then:
    release memory block'ptr'to'ptr::pool'
   set'ptr::inv_pool'to'ptr::pool'
 else:
   callMemErrDoubleFree(ptr)
}

最后,我们可以在回调函数中为这种错误情况定义适当的操作:MemErrDoubleFree(ptr)。

6释放后继续使用内存

这个编程错误听起来不可思议,但在多任务环境中,这个错误可能存在,在最坏的情况下,很长一段时间都没有被发现。

为了检测这种情况,我们可以重用info区域中的数据冗余。在这种情况下,我们在使用内存块之前检查冗余是否损坏。为了使代码顺序尽可能简单,我们可以集成内存看门狗触发:

voidMemStartAccess(ptr)
{
 if('ptr::pool'is not equal to complement of'ptr::inv_pool') then:
    callMemErrUsedFree(ptr)
 else
    set'ptr::timeout'to'ptr::watchdog_time'
}

最后,在回调函数MemErrUsedFree(ptr)中为这种错误情况定义适当的操作。

在使用内存块之前,该检测机制将需要一个额外的函数调用。

ptr =MemAllocWait(timeout, pool);
MemStartAccess(ptr);
/* use memory block via ptr */
MemFree(ptr);

7使用时释放内存

这个编程错误与前面的错误属于同一类。在多任务环境中,可能释放了被中断任务占用的内存块。该任务重新运行时,其使用的内存已经被释放。

针对这个问题,我们可以使用一个对称函数的解决方案。对应MemStartAccess()函数,引入结束函数。这个新函数可以通知用户内存块不能使用了:

void MemEndAccess (ptr);

通过相应的阻塞函数来释放内存,我们可以避免这类编程错误。

void MemFreeWait (ptr);

对应的动态内存使用序列如下:

ptr =MemAllocWait(timeout, pool);
MemStartAccess(ptr);
/*use memory block via ptr*/
MemEndAccess(ptr);
MemFreeWait(ptr);

总结

在本文中,我们发现了一种在IEC61508系统中使用动态内存的方法,避免相应的编程错误并在检测到错误后做出响应。我们为这些安全功能付出了相应的代价:每个分配的内存块将占用额外内存空间,消耗了CPU运行时间。

尽管如此,还是建议在安全关键型系统中谨慎使用动态内存。

Flexible Safety RTOS是基于μC/OS-II+MPU机制实现的功能安全操作系统,提供了基于块的内存管理机制。麦

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66858
  • 动态内存
    +关注

    关注

    1

    文章

    25

    浏览量

    8218
  • 静态内存
    +关注

    关注

    0

    文章

    6

    浏览量

    1529

原文标题:IEC61508系统中的动态内存使用

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    动态内存管理模块的设计原理与实现

    Fense 通过设立一个双向链表(struct Head *stHead)来保存所有被分配的动态内存块的信息。链表的每个节点对应一个动态内存块,节点中包括此内存大小、分配发生时所在的
    的头像 发表于 06-30 08:05 2851次阅读
    <b class='flag-5'>动态内存</b>管理模块的设计原理与实现

    C语言知识总结:动态内存分配

    动态内存分配就 是指在程序执行的过程动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态
    发表于 10-24 15:52 1198次阅读

    C语言程序设计动态内存分配如何实现

    C语言程序设计动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 2061次阅读

    瑞萨电子功能安全IEC61508解决方案介绍(2)

      01  瑞萨功能安全IEC61508解决方案介绍(1) 在介绍瑞萨电子功能安全解决方案之前,我们来看一下IEC61508功能安全系统是如何根据IEC61508标准进行概念设计、详细
    的头像 发表于 12-27 14:00 2125次阅读
    瑞萨电子功能安全<b class='flag-5'>IEC61508</b>解决方案介绍(2)

    请问使用动态内存分配安全吗?

    想在C语言程序员之间开始一个激烈的,或者说有争议的讨论很简单,只需要问:“使用动态内存分配安全吗?”使用动态内存分配安全吗?在C语言程序开发动态内存分配允许程序在运行时向
    发表于 12-15 06:10

    使用动态内存分配安全吗

    安全吗?”为了更加安全稳定,美国军方禁止在C语言程序中使用malloc()使用动态内存分配安全吗?在C语言程序开发动态内存分配允许程序在运行时向系统申请
    发表于 12-15 07:44

    动态内存分配是什么意思

    所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程动态地分配或者回收存储空间的分配内存的方法。动态内存
    发表于 12-17 08:17

    动态内存错误的静态检测

    内存泄漏、空指针引用等动态内存错误在/,/LL等支持动态内存操作的程序普遍存在在程序动态内存
    发表于 06-10 16:29 52次下载
    <b class='flag-5'>动态内存</b>错误的静态检测

    动态内存管理在面向嵌入式实时系统的研究

    动态内存管理的基本任务就是有效地对动态内存进行分配、回收,并同时保证系统的快速性、可靠性和稳定性。当系统请求分配内存时,
    发表于 07-22 11:14 1384次阅读

    基于IEC61508开发功能安全的处理器详细介绍

    功能安全的电子系统是响应的系统。正如每一组输入所期望的那样。功能安全系统是针对定义良好的系统开发和验证的。特定市场功能安全标准。伞大多数专用功能的标准电子产品的安全发展是
    发表于 04-16 15:51 26次下载
    基于<b class='flag-5'>IEC61508</b>开发功能安全的处理器详细介绍

    嵌入式需要用到动态内存

    所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程动态地分配或者回收存储空间的分配内存的方法。动态内存
    的头像 发表于 07-27 08:11 3452次阅读

    嵌入式C语言中的动态内存管理和动态内存分配

    动态内存管理同时还具有一个优点:当程序在具有更多内存系统上需要处理更多数据时,不需要重写程序。
    发表于 08-15 17:16 2646次阅读

    嵌入式是否使用动态内存?

    嵌入式是否应该使用动态内存?
    的头像 发表于 02-28 17:03 2363次阅读

    Xilinx为IEC61508和ISO26262认证的安全应用降低风险并提高效率

    电子发烧友网站提供《Xilinx为IEC61508和ISO26262认证的安全应用降低风险并提高效率.pdf》资料免费下载
    发表于 09-13 11:33 1次下载
    Xilinx为<b class='flag-5'>IEC61508</b>和ISO26262认证的安全应用降低风险并提高效率

    瑞萨基于IEC61508的功能安全解决方案介绍(1)

    首先,我们将简单介绍符合IEC61508标准的功能安全,其次是功能安全应用示例,以及工程师在功能安全设计上所面临的挑战,最后分享瑞萨功能安全解决方案如何应对这些挑战。
    的头像 发表于 05-30 14:19 2470次阅读
    瑞萨基于<b class='flag-5'>IEC61508</b>的功能安全解决方案介绍(1)