contiki-main.c 一 打印观察 <contiki学习之五>

说明: 本文依赖于 contiki/platform/native/contiki-main.c 文件。 

在项目工程目录下的hello-world.c 文件里面,有许多的宏,但没有最关键的main()函数出现,也无法知道这个 文件里的 "hello world"什么时候打印。那么只能根据makefile文件的框架和提示,进入到 contiki/platform/ 目录下一探明白。由于前面选择的是  contiki/examples/hello-world/  目录下的工程进行学习,那么这里也就进入到 contiki/platform/native/ 目录下并使用  find 命令查找下 main()即可:

1 find -name "*.c" | xargs grep "main"

当然,它存在于 contiki-main.c  这个文件中。下面将使用最廉价的printf() 来调试程序了。

-----------------------------------------------------------------------

注: 我暂时只关心 contiki-main.c文件中的    main() 函数。

------------------------------------------------------------------------

添加printf()如下:

  1 int
  2 main(int argc, char **argv)
  3 {
  4 #if UIP_CONF_IPV6
  5 #if UIP_CONF_IPV6_RPL
  6   printf(CONTIKI_VERSION_STRING " started with IPV6, RPL\n");
  7 #else
  8   printf(CONTIKI_VERSION_STRING " started with IPV6\n");
  9 #endif
 10 #else
 11   printf(CONTIKI_VERSION_STRING " started\n");
 12 #endif
 13
 14   /* crappy way of remembering and accessing argc/v */
 15   contiki_argc = argc;
 16   contiki_argv = argv;
 17
 18   /* native under windows is hardcoded to use the first one or two args */
 19   /* for wpcap configuration so this needs to be "removed" from         */
 20   /* contiki_args (used by the native-border-router) */
 21 #ifdef __CYGWIN__
 22   contiki_argc--;
 23   contiki_argv++;
 24 #ifdef UIP_FALLBACK_INTERFACE
 25   contiki_argc--;
 26   contiki_argv++;
 27 #endif
 28 #endif
 29
 30   printf("contiki-main_function!-->\n");
 31   process_init();
 32   printf("process init over!------>\n");
 33   process_start(&etimer_process, NULL);
 34   printf("process_start now------->\n");
 35   ctimer_init();
 36   printf("ctimer_init()----------->\n");
 37   rtimer_init();
 38   printf("rtimer_init()----------->\n");
 39
 40 #if WITH_GUI
 41   process_start(&ctk_process, NULL);
 42 #endif
 43
 44   printf("set_rime_addr()-------->\n");
 45   set_rime_addr();
 46
 47   printf("netstack_init()-------->\n");
 48   netstack_init();
 49   printf("MAC %s RDC %s NETWORK %s\n", NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name);
 50
 51 #if WITH_UIP6
 52   queuebuf_init();
 53
 54   memcpy(&uip_lladdr.addr, serial_id, sizeof(uip_lladdr.addr));
 55
 56   process_start(&tcpip_process, NULL);
 57 #ifdef __CYGWIN__
 58   process_start(&wpcap_process, NULL);
 59 #endif
 60   printf("Tentative link-local IPv6 address ");
 61   {
 62     uip_ds6_addr_t *lladdr;
 63     int i;
 64     lladdr = uip_ds6_get_link_local(-1);
 65     for(i = 0; i < 7; ++i) {
 66       printf("%02x%02x:", lladdr->ipaddr.u8[i * 2],
 67              lladdr->ipaddr.u8[i * 2 + 1]);
 68     }
 69     /* make it hardcoded... */
 70     lladdr->state = ADDR_AUTOCONF;
 71
 72     printf("%02x%02x\n", lladdr->ipaddr.u8[14], lladdr->ipaddr.u8[15]);
 73   }
 74 #else
 75   process_start(&tcpip_process, NULL);
 76 #endif
 77
 78   printf("serial_line_init()----------->\n");
 79   serial_line_init();
 80
 81   printf("autostart_start()-=---------->\n");
 82   autostart_start(autostart_processes);
 83
 84   /* Make standard output unbuffered. */
 85   setvbuf(stdout, (char *)NULL, _IONBF, 0);
 86
 87   select_set_callback(STDIN_FILENO, &stdin_fd);
 88 //  while(1) {
 89       printf("loop....\n");
 90     fd_set fdr;
 91     fd_set fdw;
 92     int maxfd;
 93     int i;
 94     int retval;
 95     struct timeval tv;
 96
 97     retval = process_run();
 98
 99     tv.tv_sec = 0;
100     tv.tv_usec = retval ? 1 : 1000;
101
102     FD_ZERO(&fdr);
103     FD_ZERO(&fdw);
104     maxfd = 0;
105     for(i = 0; i <= select_max; i++) {
106       if(select_callback[i] != NULL && select_callback[i]->set_fd(&fdr, &fdw)) {
107         maxfd = i;
108       }
109     }
110
111     retval = select(maxfd + 1, &fdr, &fdw, NULL, &tv);
112     if(retval < 0) {
113       if(errno != EINTR) {
114         perror("select");
115       }
116     } else if(retval > 0) {
117       /* timeout => retval == 0 */
118       for(i = 0; i <= maxfd; i++) {
119         if(select_callback[i] != NULL) {
120           select_callback[i]->handle_fd(&fdr, &fdw);
121         }
122       }
123     }
124     printf("etimer_request_poll!------------->\n");
125     etimer_request_poll();
126
127 #if WITH_GUI
128     if(console_resize()) {
129        ctk_restore();
130     }
131 #endif /* WITH_GUI */
132 //  }
133     printf("main_function over....--->\n");
134
135   return 0;
136 }

上面是我自己修改后的 main()函数,然后make运行后的结果如下:

 1 $./hello-world.native
 2 Contiki-2.6-1549-g01bd045 started
 3 contiki-main_function!-->
 4 process init over!------>
 5 process_start now------->
 6 ctimer_init()----------->
 7 rtimer_init()----------->
 8 set_rime_addr()-------->
 9 Rime started with address 2.1
10 netstack_init()-------->
11 MAC nullmac RDC nullrdc NETWORK Rime
12 serial_line_init()----------->
13 autostart_start()-=---------->
14 Hello, world
15 loop....
16 etimer_request_poll!------------->
17 main_function over....--->

从上面的打印信息来看,hello world 打印是在执行了下面这行代码后出现的:

1 autostart_start(autostart_processes);

既然如此,那就开始了---看看它们的流程。

Email: [email protected]

contiki-main.c 一 打印观察 <contiki学习之五>

时间: 2024-10-11 09:10:23

contiki-main.c 一 打印观察 <contiki学习之五>的相关文章

contiki Makefile.include 四个关注点&lt;contiki学习之二&gt;

Contiki Makefile.include 笔记 约定:  makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关注几个需要点. 首先要说明,Makefile.include是被用户的工程目录下的"Makefile"      include之,这个是必须要做的. Makefile.include 从上到下,顺序检索. 关注点一: 最开始,编译系统会检查用户是否定义了 contiki 源码根目录.检查

Java并发学习之五——线程的睡眠和恢复

本文是学习网络上的文章时的总结,感谢大家无私的分享. 1.Thread类的sleep方法,可以使线程睡眠.此方法接收一个整数作为参数,表示线程暂停运行的毫秒数.在调用sleep方法后,当时间结束时,JVM会安排他们CPU时间,线程会继续按指令执行. 另一种可能是使用一个有TimeUnit列举元素的sleep方法,使用线程类的sleep方法让当前线程睡眠,但是它接收的参数单位后会转成毫秒的. 2.当你调用sleep()方法,Thread离开CPU并在一段时间内停止运行.在这段时间内,他是不消耗CP

PGM学习之五 贝叶斯网络

本文的主题是"贝叶斯网络"(Bayesian Network) 贝叶斯网络是一个典型的图模型,它对感兴趣变量(variables of interest)及变量之间的关系(relationships)进行建模.当将贝叶斯模型与统计技术一起使用时,这种图模型分析数据具有如下几个优势: (1)    贝叶斯学习能够方便的处理不完全数据.例如考虑具有相关关系的多个输入变量的分类或回归问题,对标准的监督学习算法而言,变量间的相关性并不是它们处理的关键因素,当这些变量中有某个缺值时,它们的预测结

mysql学习之五:sql语句学习3

好吧,大家觉得这种字体还是比较好看,所有我们就换这种字体了. INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) 我们也可以指定所要插入数据的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 DELETE 语句用于删除表中

3D打印技术的学习

1. 我们使用3D建模软件:123Ddesign来设计 123D design软件保存格式有2种,分别为123dx和stl格式 123dx格式:选择菜单栏中“Save”下的“To my computer”,弹出对话框,点击保存就可以保存为123dx格式文件 stl格式:选择菜单栏中“Export as 3D(导出供三维打印)”下的“stl”,弹出对话框,如果有“combine objects(组合对象)” 选项,再前面的方框处单击打上√,点击OK,弹出第二个对话框,输入文件名,点击“保存”即可完

spring boot 学习之五(日志配置)

想直接看这里的我建议先看了我的spring boot 学习之四.因为日志的配置要用到properties. 先了解一下springBoot的日志系统然后再进行配置. springboot默认采用的是slf4j+logback.之前的web模块已经添加过了相关日志的依赖 private static final Logger logger = LoggerFactory.getLogger(LogConfig.class); 我们调用这个对象即可进行日志记录,日志记录默认是打印出来的,我们可以调用

Esper学习之五:EPL语法(一)

上篇说到了Esper的Context,要是不了解的同学请参看<Esper学习之四:Context>,看过的同学如果还是不理解的话可以给我评论,我将会尽可能的解答.之前有些同学问我Context和Group by有什么区别,其实如果只是很简单的用Context,那么确实没太大区别,无非是在Context下select可以不包含group by修饰的属性.但是Group by明显没有Context强大,很多复杂的分组Group by是没法做到的.不过在能达到同样效果的情况下,我还是建议使用Grou

[WebView学习之五]:调试Web Apps

上一篇我们学习了([WebView学习之四]:迁移到Android4.4版本的WebView),今天我们来继续学习. (博客地址:http://blog.csdn.net/developer_jiangqq),转载请注明. Author:hmjiangqq Email:[email protected] 如果你正在Android4.4或者更高的版本上面测试你的Web应用程序(Application),你可以使用Chrome开发工具进行远程调试你的Web页面,该方法同时也支持Android低版本.

linux 内核学习之五 system_call过程分析

一   使用gdb工具跟踪分析一个自添加的系统调用 应用程序的进程通常在用户空间下运行,当它调用一个系统调用时,进程进入内核空间,执行的是kernel内部的代码,从而具有执行特权指令的权限,完成特定的功能. 在上次实验的基础上修改test.c,添加自己实现的setuid系统调用,部分代码修改如下: int uid_c() { int i=65535,k=0; i=getuid(); printf("current user id is:%d\n",i); setuid(200); k=