说明: 本文依赖于 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. UVA 658 It's not a Bug, it's a Feature! (最短路,经典)

    题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了: ...

  2. IOS的XML文件解析,利用了NSData和NSFileHandle

    如果需要了解关于文档对象模型和XML的介绍,参看 http://www.cnblogs.com/xinchrome/p/4890723.html 读取XML 上代码: NSFileHandle *fi ...

  3. ubuntun安装ssh,并远程链接服务器操作

    SSH是一种以安全.加密方式连接远程主机或服务器的方法.SSH服务器接受从有SSH的客户机的连接,允许操作者象在本地一样地登录系统.你可以用SSH从远程运行shell和X程序. (1)安装SSH服务器 ...

  4. JTA事务管理--配置剖析(二)

    Spring引用Tomcat的 JTA事务     Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在Java EE应用程序服务器中一样,在Tomcat中使用JNDI查找JD ...

  5. UI特效--Android利用ViewFlipper实现屏幕切换动画效果

    .屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面.2.介绍ViewFilpper类ViewFl ...

  6. [LeetCode] Remove Element 分析

    Remove Element算是LeetCode的一道水题,不过这题也有多种做法,现就我所知的几种做一点讨论. 题目链接:https://leetcode.com/problems/remove-el ...

  7. CSS 3动画介绍

    原文:A Beginner’s Introduction to CSS Animation 译文:一个初学者对CSS动画的介绍 译者:dwqs 现在,越来越多的网站使用了动画,并且形式多样,如GIF. ...

  8. Python 学习笔记(四)正则、闭合、生成器

    (一)正则表达式 基本规则: ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b 匹配一个单词边界. \d 匹配一个数字. \D 匹配一个任意的非数字字符. x? 匹配可选的x字符.换句话说,就 ...

  9. 在windows7下配置PHP访问ICE中间件(ICE3.5.1+PHP5.4+Apache2.2 for vc9)

    按照ICE的官方文档(http://doc.zeroc.com/display/Ice/Using+the+Windows+Binary+Distribution#UsingtheWindowsBin ...

  10. 内核源码分析之进程地址空间(基于3.16-rc4)

    所谓进程的地址空间,指的就是进程的虚拟地址空间.当创建一个进程时,内核会为该进程分配一个线性的地址空间(虚拟地址空间),有了虚拟地址空间后,内核就可以通过页表将进程的物理地址地址空间映射到其虚拟地址空 ...