C

时间:2015-05-07 13:12:10

标签: c multithreading embedded dynamic-memory-allocation

我正在寻找在多线程系统中使用动态内存处理程序安全的提示。问题详情:

    用C语言编写的
  1. 将在带有RTOS(CooCox OS)的cortex-M3处理器上运行,
  2. 将使用
  3. TLSF memory allocator(如果我发现它们更适合,它们将是免费的和开源的,可能会使用其他分配器),
  4. 解决方案我正在寻找的是使用内存分配器安全地完成OS任务和中断。
  5. 到目前为止,我想到了两种可能的方法,但对于我来说,这些方法的细节还很少:

    1. 在调用allocator函数时禁用并启用中断。问题 - 如果我没有误会我无法在正常模式下使用中断禁用和启用,只能在特权模式下(所以如果我没有弄错,那只是在中断中),我需要也可以从运行时执行此操作 - 防止在内存处理程序操作期间进行中断和任务切换。
    2. 来自SWI的呼叫分配器。这个对我来说还是很不清楚。 1st - SWI与FIQ相同(如果是这样的话,FIQ代码需要在asm中写入 - 因为分配器是用C语言编写的)。然后对于从IRQ调用FIQ仍然有一些疑问(这种情况会发生 - 通常不会发生),但很可能这部分不会引起问题。
    3. 关于这种情况的可能解决方案的任何想法?

1 个答案:

答案 0 :(得分:0)

关于你的建议1和2:

  1. 在Cortex-M3上,您可以通过CMSIS intrinsics __disable_irq/_enable_irq函数随时在特权级别代码中启用和禁用中断。 特权级别不限于处理程序模式; 线程模式代码也可以在特权级别运行(并且在许多默认的小型RTOS中)。
  2. SWI和FIQ是传统ARM架构的概念。它们不存在于Cortex-M3中。
  3. 理想情况下,您不希望在中断处理程序中执行内存分配 - 即使分配器是确定性的,它仍可能需要大量时间;我可以想到你想要做的几个原因。

    最好的方法是修改tlsf代码,以便为每个具有外部链接的调用使用RTOS互斥锁。 Other libraries我已经在库中已经存在通常什么都不做的存根,但您可以使用自己的实现覆盖存根以将其映射到任何RTOS。

    现在你当然不能在ISR中使用互斥锁,但正如我所说,你可能也不应该在那里分配内存。如果你真的必须在中断处理程序中执行分配,那么启用/禁用中断是你唯一的选择,但是你会混淆RTOS提供的所有实时确定性行为。更好的解决方案是让您的ISR只是向线程上下文处理程序发出事件标志或信号量。这允许您使用所有RTOS服务和调度,并且与内存分配时间相比,从ISR到高优先级线程的上下文切换时间将是无关紧要的。

    另一种可能性是根本不使用此分配器,而是使用RTOS队列使用固定块分配器。您预先分配内存块(静态或动态),将每个块的开头的指针发布到队列上,然后分配您只需从队列接收指针,并释放回发队列。如果内存耗尽(队列为空),则可以阻止或阻塞队列(尽管不要阻塞在ISR中)。您可以为不同大小的块创建多个队列,并使用适合您需要的队列(当然,确保您回发到同一队列!)