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