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

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

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

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

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

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

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

添加printf()如下:

 int
main(int argc, char **argv)
{
#if UIP_CONF_IPV6
#if UIP_CONF_IPV6_RPL
printf(CONTIKI_VERSION_STRING " started with IPV6, RPL\n");
#else
printf(CONTIKI_VERSION_STRING " started with IPV6\n");
#endif
#else
printf(CONTIKI_VERSION_STRING " started\n");
#endif /* crappy way of remembering and accessing argc/v */
contiki_argc = argc;
contiki_argv = argv; /* native under windows is hardcoded to use the first one or two args */
/* for wpcap configuration so this needs to be "removed" from */
/* contiki_args (used by the native-border-router) */
#ifdef __CYGWIN__
contiki_argc--;
contiki_argv++;
#ifdef UIP_FALLBACK_INTERFACE
contiki_argc--;
contiki_argv++;
#endif
#endif printf("contiki-main_function!-->\n");
process_init();
printf("process init over!------>\n");
process_start(&etimer_process, NULL);
printf("process_start now------->\n");
ctimer_init();
printf("ctimer_init()----------->\n");
rtimer_init();
printf("rtimer_init()----------->\n"); #if WITH_GUI
process_start(&ctk_process, NULL);
#endif printf("set_rime_addr()-------->\n");
set_rime_addr(); printf("netstack_init()-------->\n");
netstack_init();
printf("MAC %s RDC %s NETWORK %s\n", NETSTACK_MAC.name, NETSTACK_RDC.name, NETSTACK_NETWORK.name); #if WITH_UIP6
queuebuf_init(); memcpy(&uip_lladdr.addr, serial_id, sizeof(uip_lladdr.addr)); process_start(&tcpip_process, NULL);
#ifdef __CYGWIN__
process_start(&wpcap_process, NULL);
#endif
printf("Tentative link-local IPv6 address ");
{
uip_ds6_addr_t *lladdr;
int i;
lladdr = uip_ds6_get_link_local(-);
for(i = ; i < ; ++i) {
printf("%02x%02x:", lladdr->ipaddr.u8[i * ],
lladdr->ipaddr.u8[i * + ]);
}
/* make it hardcoded... */
lladdr->state = ADDR_AUTOCONF; printf("%02x%02x\n", lladdr->ipaddr.u8[], lladdr->ipaddr.u8[]);
}
#else
process_start(&tcpip_process, NULL);
#endif printf("serial_line_init()----------->\n");
serial_line_init(); printf("autostart_start()-=---------->\n");
autostart_start(autostart_processes); /* Make standard output unbuffered. */
setvbuf(stdout, (char *)NULL, _IONBF, ); select_set_callback(STDIN_FILENO, &stdin_fd);
// while(1) {
printf("loop....\n");
fd_set fdr;
fd_set fdw;
int maxfd;
int i;
int retval;
struct timeval tv; retval = process_run(); tv.tv_sec = ;
tv.tv_usec = retval ? : ; FD_ZERO(&fdr);
FD_ZERO(&fdw);
maxfd = ;
for(i = ; i <= select_max; i++) {
if(select_callback[i] != NULL && select_callback[i]->set_fd(&fdr, &fdw)) {
maxfd = i;
}
} retval = select(maxfd + , &fdr, &fdw, NULL, &tv);
if(retval < ) {
if(errno != EINTR) {
perror("select");
}
} else if(retval > ) {
/* timeout => retval == 0 */
for(i = ; i <= maxfd; i++) {
if(select_callback[i] != NULL) {
select_callback[i]->handle_fd(&fdr, &fdw);
}
}
}
printf("etimer_request_poll!------------->\n");
etimer_request_poll(); #if WITH_GUI
if(console_resize()) {
ctk_restore();
}
#endif /* WITH_GUI */
// }
printf("main_function over....--->\n"); return ;
}

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

 $./hello-world.native
Contiki-2.6--g01bd045 started
contiki-main_function!-->
process init over!------>
process_start now------->
ctimer_init()----------->
rtimer_init()----------->
set_rime_addr()-------->
Rime started with address 2.1
netstack_init()-------->
MAC nullmac RDC nullrdc NETWORK Rime
serial_line_init()----------->
autostart_start()-=---------->
Hello, world
loop....
etimer_request_poll!------------->
main_function over....--->

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

 autostart_start(autostart_processes);

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

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

  1. day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui

      Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui   本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 we ...

  2. jackson学习之五:JsonInclude注解

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. contiki Makefile.include 四个关注点<contiki学习之二>

    Contiki Makefile.include 笔记 约定:  makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关 ...

  4. js自己总结的小东西(打印出来方便学习)

    1.你对angular有哪些认识? 属于mvvm框架,现在非常的火,由谷歌开发出来并维护的框架,为了解决负责业务中ajax的开发痛苦,刚开始结果angular的时候,确实让我有一种耳目一些,原来代码还 ...

  5. 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

    最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...

  6. 3D打印GCODE文件学习(二)

    大家可以自己实践一下,那么怎么打开GCODE呢?很简单,只要在桌面上创建一个word文档,然后把“.”后面的docx改成GCODE,它会跳出一个是否更改的框,点击是就行了,然后右键,点击Edit wi ...

  7. 3D打印GCODE文件学习(一)

    我家有一个天威的入门级的3D打印机.它有一个配套的软件叫“Rrint-RiteCoLiDo Repetier-Host V1.5.5”,用来连接.控制打印机.同时它可以加载各种切片软件,对各种3D模型 ...

  8. 3D打印技术的学习

    1. 我们使用3D建模软件:123Ddesign来设计 123D design软件保存格式有2种,分别为123dx和stl格式 123dx格式:选择菜单栏中“Save”下的“To my compute ...

  9. 1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、212345等. 要求:”4”不能在第三位,”3”与”5”不能相连。

    private static String[] mustExistNumber = new String[] { "1", "2", "2" ...

随机推荐

  1. HDU 2063 过山车 (最大匹配,匈牙利算法)

    题意:中文题目 思路:匈牙利算法解决二分图最大匹配问题. #include <bits/stdc++.h> using namespace std; ; int mapp[N][N]; / ...

  2. oracle中怎么查看存储过程的源码

    今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...

  3. 【JS】<a>标签调用js中函数的几种方法

    我们常用的在a标签中有点击事件: a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而 ...

  4. android 应用页面与数据申请逻辑剥离;

    1.页面与数据申请剥离,数据申请框架可以灵活更换,解耦合: 2.对应页面的数据申请类中,将返回数据解析剥离,灵活更换数据返回及对应解析: 二.模块划分: 1.一些通用的工具类,可以考虑迁移到com.c ...

  5. ruby函数回调的实现方法

    以前一直困惑ruby不像python,c可以将函数随意传递,然后在需要的时候才去执行.其实本质原因是ruby的函数不是对象. 通过查阅资料发现可以使用如下方法: def func(a, b) puts ...

  6. jenkins 命令行 CLI jenkins-cli.jar

    部署好jenkins后,一般都是通过jenkins提供的web界面来操作jenkins. 而有些场景则需要通过命令来操作jenkins,例如通过脚本操作jenkins. 在jenkins提供的web界 ...

  7. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 list_should_have_no_selections(self, locator)

    def list_should_have_no_selections(self, locator): """Verifies select list identified ...

  8. js控制不同的时间段显示不同的css样式

    js控制不同的时间段显示不同的css样式 js函数,可以放到单独的js文件中也可以放到当前页的<head>标记之内 function getCSS(){        datetoday ...

  9. 警惕javascript代码中的“</script>”!

    之前在写<博客园自定义博客侧边栏公告的过滤漏洞>的时候遇到了一个javascript代码报错“语法错误”的问题,一直不得以解决,感谢Arliang发现了并为我进行了耐心的解释,现整理如下: ...

  10. 如何避免JavaScript的内存泄露及内存管理技巧

    发表于谷歌WebPerf(伦敦WebPerf集团),​​2014年8月26日. 高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果 ...