Preffered:访问共享资源时暂停所有任务或互斥? [免费RTOS]

Preffered: Suspend all tasks OR mutex when accessing shared resource ? [freeRTOS]

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

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

1。 很自然地,我的想法是使用 mutex/semaphores。但是.. 很多地方有条件的话会非常非常乱。

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

3。 另一个想法刚刚飞进了我的脑海。创建另一个专门处理 uart 的任务?但这就像为这个任务创建一个保留堆栈而丢弃大量内存:P

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

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

当 IO 线程运行时,它会轮询 IOrequest 队列以及与设备及其中断处理程序关联的所有 I/O queues/buffers/whatever。其中一个需要做一些事情,(因为一个单元已经发布到信号量),线程会做这件事。找不到任何事做是错误的。

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

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