contiki SLIP代码分析

本文详细分析了Contiki OS中的SLIP协议实现,包括slip_radio_process线程的声明、加载和实体,以及输入回调函数的设置。重点讨论了如何通过input_callback指向slip_input_callback函数处理CMD输入,并解析了cmd_handlers[]宏定义和函数指针数组的使用,涉及到typedef、函数指针和可变参数宏。最后,解释了slip_radio_cmd_handler和cmd_handler_cc2520两个消息处理函数的功能。
摘要由CSDN通过智能技术生成

contiki SLIP代码分析

前言

    本文通过分析slip_radio代码,结合C语法,体会contiki系统的文件的编写风格,理解contiki中的SLIP协议

正文

对于Contiki OS,一个任务(线程)slip_radio的加载比较常见的方法是使用AUTOSTART_PROCESSES

对于一个线程,通常可以看到三部分

1,//线程声明PROCESS(xxxx_process, "xxxx process");

2,//线程加载AUTOSTART_PROCESSES(&xxxx_process);

3,//线程实体PROCESS_THREAD(xxxx_process, ev, data)

对于slip_radio_process,具体有

//线程声明

PROCESS(slip_radio_process, "Slip radio process");

//线程加载

AUTOSTART_PROCESSES(&slip_radio_process);

//线程实体

PROCESS_THREAD(slip_radio_process, ev, data)

PROCESS_THREAD(slip_radio_process, ev, data)
{
  static struct etimer et;
  PROCESS_BEGIN();

  init();//slip初始化
  NETSTACK_RDC.off(1);
#ifdef SLIP_RADIO_CONF_SENSORS
  SLIP_RADIO_CONF_SENSORS.init();    //传感器
#endif
  printf("Slip Radio started...\n");

  etimer_set(&et, CLOCK_SECOND * 3); //设置事件定时器

  while(1) {
    PROCESS_YIELD();

    if(etimer_expired(&et)) {
      etimer_reset(&et);
#ifdef SLIP_RADIO_CONF_SENSORS
      SLIP_RADIO_CONF_SENSORS.send();
#endif
    }
  }
  PROCESS_END();
}
 在slip_radio_process线程实体中,无操作是如下格式
 PROCESS_BEGIN();
 etimer_set(&et, CLOCK_SECOND * 3);
   while(1) {
 PROCESS_YIELD();
   if(etimer_expired(&et)) {
      etimer_reset(&et);
}

这里注意集中应用程序上的分析,暂不分析OS

初始化init();

在init()中可以看到

static void
init(void)
{
#ifndef BAUD2UBR
#define BAUD2UBR(baud) baud
#endif
  slip_arch_init(BAUD2UBR(115200));
  process_start(&slip_process, NULL);
  slip_set_input_callback(slip_input_callback); //设置输入回调函数
  //input_callback=slip_input_callback 映射
  packet_pos = 0;
}

第一初始化硬件UART 115200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值