天涼好個秋.

Uart 通信的结构设计与生产者消费者模型

626 阅 0 评 IT手札

Uart 通信

工作的内容是嵌入式软件开发,没有操作系统的最底层软件开发工作,最近的项目需要使用 UART 通信,数据的接收使用中断方式。接收数据的构造是本文想说明的。

最初的思路

  • 在中断中不断将数据写入一个buffer。
  • 当达到某一截止条件(命令结束或者timeout)时,关闭中断并将接收结束flag置起。
  • 在man loop 中定期检测接收结束flag,当flag被置起读取buffer中的指令进行处理。
  • 在man loop 中将buffer中的命令处理完成后,将flag归位、初始化buffer并打开接收中断。

问题

这样的结构简单,容易实现,但由于运行中关闭了接收中断,特殊情况下会导致部分通信数据无法接收到。
为了解决这个问题向有经验的前辈请教,瞬间想通了。

生产者-消费者问题

生产者消费者问题是在操作系统课程上提及的经典IPC(Inter-Process Communication)问题(模型)。
假定有一个生产者,有一个消费者,通过一个环形缓冲区发生联系。生产者将生产出的产品放入缓冲区,消费者从缓冲区中取走产品。
关键的是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

将生产者-消费者模型应用到 UART 通信上

  • 在中断中不断将数据写入循环buffer,并维护一个wirte_pointer。
  • 当到达某一截至条件(命令结束或者timeout)时,将task_flag++。
  • 在 main loop 中判定 task_flag >0, 则取读取buffer里的数据,并维护一个read_pointer。
  • 将读取的数据处理后,将task_flag--。
  • 在操作buffer时根据wirte_pointer和read_pointer判断buffer的状态(空、满、有空余)。

生产者和消费者是线程同步的案例,在无操作系统的嵌入式系统上,中断和 main loop 可以(近似)看作是两个独立的线程,两者间的同步可以借鉴线程间同步的很多模型。

附录

  1. 生产者消费者问题

​​

EOF