本小节开始介绍怎样在任务之间进行数据通信。
前面介绍了各个任务之间在执行流程上的行为同步,除了同步之外,任务之间或者中断与任务之间还有可能出于某些需要进行通信,例如给对方发消息,报告状态等待。 本小节介绍最简单的通信方案,使用全局数据。
主要内容
所谓使用全局数据通信,就是让多个任务共享全局数据。
如下图所求,两个任务需要通信时,前一任务可将要通信的数据写入到全局数据中,另一任务在需要时再进行读取。
但这里可能需要解决几个问题。
全局数据共享
多个任务在共享全局数据时,如前面章节所介绍的,需要使用一些资源共享的保护方案。
根据前面所介绍的内容,可使用关中断、信号量等机制保护。
数据缓存
全局数据可能需要缓存多次写入的值,否则如果只能写入一份,将会导致前面已写入的值被覆盖。
该缓存机制可以使用一些数据结构,比如环形队列、链表,甚至哪怕最简单的数组。
读写同步
需要加入某种通知或等待机制,来实现任务在读写资源时的同步。
例如,任务在需要读取数据时,先等待,直到另一任务发通知后已经写入有效数据后,再读取。
这种通知,可以使用本章所介绍的各种同步方案来实现。
示例
在课程中,我们演示了一个非常简单的例子。
static int count = 0;
static tSem syncSem;
/**
* 任务的运行代码
* @param param 任务初始运行参数
*/
void task1Entry (void *param) {
for (;;) {
count++;
tSemNotify(&syncSem);
task1Flag = 1;
tTaskDelay(1);
task1Flag = 0;
tTaskDelay(1);
}
}
/**
* 任务的运行代码
* @param param 任务初始运行参数
*/
void task2Entry (void *param) {
for (;;) {
tSemWait(&syncSem, 0);
xprintf("task2 count:%d", count);
}
}
这个例子中,定义了全局变量count。但是: