我正在寻找在多线程系统中使用动态内存处理程序安全的提示。问题详情:
到目前为止,我想到了两种可能的方法,但对于我来说,这些方法的细节还很少:
关于这种情况的可能解决方案的任何想法?
答案 0 :(得分:0)
关于你的建议1和2:
__disable_irq
/_enable_irq
函数随时在特权级别代码中启用和禁用中断。 特权级别不限于处理程序模式; 线程模式代码也可以在特权级别运行(并且在许多默认的小型RTOS中)。 理想情况下,您不希望在中断处理程序中执行内存分配 - 即使分配器是确定性的,它仍可能需要大量时间;我可以想到你想要做的几个原因。
最好的方法是修改tlsf代码,以便为每个具有外部链接的调用使用RTOS互斥锁。 Other libraries我已经在库中已经存在通常什么都不做的存根,但您可以使用自己的实现覆盖存根以将其映射到任何RTOS。
现在你当然不能在ISR中使用互斥锁,但正如我所说,你可能也不应该在那里分配内存。如果你真的必须在中断处理程序中执行分配,那么启用/禁用中断是你唯一的选择,但是你会混淆RTOS提供的所有实时确定性行为。更好的解决方案是让您的ISR只是向线程上下文处理程序发出事件标志或信号量。这允许您使用所有RTOS服务和调度,并且与内存分配时间相比,从ISR到高优先级线程的上下文切换时间将是无关紧要的。
另一种可能性是根本不使用此分配器,而是使用RTOS队列使用固定块分配器。您预先分配内存块(静态或动态),将每个块的开头的指针发布到队列上,然后分配您只需从队列接收指针,并释放回发队列。如果内存耗尽(队列为空),则可以阻止或阻塞队列(尽管不要阻塞在ISR中)。您可以为不同大小的块创建多个队列,并使用适合您需要的队列(当然,确保您回发到同一队列!)