Contiki开发8:进程协作

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:如果消息为真,执行“采集和打印温湿度”。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值