1.在串口接收中断中接收到的数据写入环形缓冲区;唤醒解析线程(发出任务通知)或释放信号量。
2.开一个解析线程:
void AT_Parser()
{
while(1)
{
1.等待任务通知;
读环形缓冲区(将数据存起来);
2.常规解析(遇到\r\n才去解析);
解析数据包:
1)放入Data_Buf;
2)唤醒“等待网络数据的线程”
3.唤醒等待at命令的结果的线程;
}
}
但是在环形缓冲区中大部分时间是没有数据的,如果一直去读环形缓冲区很浪费资源。
引入休眠与唤醒的机制:
1)等待任务通知,休眠状态;如果被唤醒就去读环形缓冲区。
2)使用信号量或事件集。
3.环形缓冲区:
是全局的数组,但是限定了只有一个生成与一个消费者(不需要保护措施);
在中断函数中会去写环形缓冲区,只有一个解析数据的线程会去读环形缓冲区。
不能有多个线程去读或多个线程去写环形缓冲区;
如果有多个线程去读或多个线程去写环形缓冲区,就需要做好多种保护措施。
加了互斥量,A与B就都可以去调用uart_at_send发送函数;如果不加互斥量,A与B只有一个函数可以调用uart_at_send发送函数。
使用信号量表示资源。
二个线程与一个中断,大部分时间都是不占用系统资源的,代码效率比较高。
uart_at_send函数阻塞后,要向下继续执行,只能是三个情况中的一种:1.ok唤醒;2.error唤醒;3.超时退出;