gpt4 book ai didi

c - 首选 : Suspend all tasks OR mutex when accessing shared resource ? [freeRTOS]

转载 作者:行者123 更新时间:2023-11-30 15:18:13 25 4
gpt4 key购买 nike

假设我们有一个 C 代码,其中有一个函数将 char[s] 作为参数,并将其存储在环形缓冲区中。环形缓冲区又从该 C 代码中的中断处理程序中读取。一个字符/中断通过 uart 传输。

我们有几项任务。在很多情况下,他们想通过 uart 进行写入。由于环形缓冲区是共享资源,我们必须注意不要让任务同时写入它。

1.很自然地,我的想法是使用互斥体/信号量。然而..这会非常非常困惑,因为很多地方都有条件。

2.另一个想法告诉我暂停该区域内的所有任务。但是......这对于系统来说并不是真正有效。在那个级别暂停任务感觉也不好。我宁愿只玩任务中的任务。

3.另一个想法突然出现在我的脑海中。创建另一个专门处理 uart 的任务?但这就像为了为此任务创建保留堆栈而丢弃大量内存:P

您会推荐这三个建议中的哪一个?

最佳答案

我使用一个线程来处理所有 I/O(好的,除了 SD 卡)。该 IO 线程等待信号量。任何需要注意的中断处理程序(例如,它已在自己的私有(private)环形缓冲区中排队)都会向信号量发出信号。任何其他需要 I/O 操作的线程都会将请求排队到单个线程安全的“IOrequest”队列并向信号量发出信号。

当 IO 线程运行时,它会轮询 IOrequest 队列以及所有 I/O 队列/缓冲区/与设备及其中断处理程序关联的任何内容。其中一个需要做一些事情(因为一个单元已被发布到信号量),并且线程会执行此操作。找不到任何事情可做是一个错误。

使用一个线程进行 I/O 管理可以简化与中断处理程序之间的队列交互。如果只有一个线程和一个中断处理程序使用队列等,那么设计会更容易。调试更加容易,因为您只需要查看一个线程。

为了便于调试,值得使用额外的堆栈:)

关于c - 首选 : Suspend all tasks OR mutex when accessing shared resource ? [freeRTOS],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31613202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com