您的位置:首页 > 其它

Contiki开发8:进程协作

2016-07-24 07:20 357 查看
Contiki开发8:进程协作

1 引言

嵌入式系统中,大部分的任务由多个进程协作完成,这时,进程需要消息通信和同步。本博文通过从shell输入命令”samplesht”,输出当前温湿度数据,展示Contiki系统下Monitor和Demo这2个进程的协作。



2 原理

2.1 程序执行流

#1:从UART输入命令”samplesht”,并通知Monitor进程解析该命令;

#2:Monitor进程给Demo进程发消息----采集温湿度;

#3:Demo进程驱动SHT10,采集当前“温度+湿度+露点”;

#4:Demo进程通过UART口打印当前温湿度数值。


2.2 时序逻辑

t0:UART接收用户输入字符;

t1:UART接收到回车符后,ISR开始poll进程;

t2:Monitor进程解析命令,向Demo进程post消息;

t3:Demo进程从SHT10获取温湿度数据,通过UART输出;

t4:UART执行打印。



3 实现

3.1  shell命令函数

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进程的接口函数,通知该进程采集温湿度数据。

3.2 给Demo进程post消息

/*---------------------------------------------------------------------------------------------*/

#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通信的较好方式。

3.3  Demo进程响应消息

/*---------------------------------------------------------------------------*/

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:如果消息为真,执行“采集和打印温湿度”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息