Contiki开发8:进程协作
嵌入式系统中,大部分的任务由多个进程协作完成,这时,进程需要消息通信和同步。本博文通过从shell输入命令”samplesht”,输出当前温湿度数据,展示Contiki系统下Monitor和Demo这2个进程的协作。
#1:从UART输入命令”samplesht”,并通知Monitor进程解析该命令;
#2:Monitor进程给Demo进程发消息----采集温湿度;
#3:Demo进程驱动SHT10,采集当前“温度+湿度+露点”;
t0:UART接收用户输入字符;
t1:UART接收到回车符后,ISR开始poll进程;
t2:Monitor进程解析命令,向Demo进程post消息;
t3:Demo进程从SHT10获取温湿度数据,通过UART输出;
t4:UART执行打印。
const static PC_CMD s_astPCCmd[] =
{
{"sample sht", CmdSampleSHT},
};
如上代码所示,将命令字符串”samplesht”和命令执行函数CmdSampleSHT()一起“注册”到结构体中。
/*---------------------------------------------------------------------------------------------*/
static void CmdSampleSHT(void)
{
SEND_OK_2_PC(); 1
demo_SampleSHT(); 2
}
执行函数CmdSampleSHT非常简单:
Line#1:通过UART向用户回复“OK”;
Line#2:调用Demo进程的接口函数,通知该进程采集温湿度数据。
/*---------------------------------------------------------------------------------------------*/
#define DEMO_EVENT_SAMPLE_SHT (PROCESS_EVENT_MAX + 1)
void demo_SampleSHT(void)
{
process_post(&demo_process, DEMO_EVENT_SAMPLE_SHT, NULL);
}
post消息的实现很简单,如上所示,调用Contiki的API函数process_post()即可,消息存储在队列中,具备缓存和排队,属于IPC通信的较好方式。
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(demo_process, ev, data)
{
PROCESS_BEGIN();
………………………………………………………….......
while (1)
{
PROCESS_YIELD();
………………………………………………………….......
if (DEMO_EVENT_SAMPLE_SHT == ev) 1
{
SamplePrintSHT(); 2
}
………………………………………………………….......
}
PROCESS_END();
}
Line#1:判断ev是否为“采集温湿度”的消息;
Line#2:如果消息为真,执行“采集和打印温湿度”。