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()即可:
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学习之五>的更多相关文章
- day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui
Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui 本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 we ...
- jackson学习之五:JsonInclude注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- contiki Makefile.include 四个关注点<contiki学习之二>
Contiki Makefile.include 笔记 约定: makefile 包括Makefile.Makefile.xxx,并不单指Makefile 不对makefile的语法进行分析,仅仅关 ...
- js自己总结的小东西(打印出来方便学习)
1.你对angular有哪些认识? 属于mvvm框架,现在非常的火,由谷歌开发出来并维护的框架,为了解决负责业务中ajax的开发痛苦,刚开始结果angular的时候,确实让我有一种耳目一些,原来代码还 ...
- 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
最近在看算法,看到这个题,觉得挺经典的,收起. 分析: 1 .把问题归结为图结构的遍历问题.实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路 ...
- 3D打印GCODE文件学习(二)
大家可以自己实践一下,那么怎么打开GCODE呢?很简单,只要在桌面上创建一个word文档,然后把“.”后面的docx改成GCODE,它会跳出一个是否更改的框,点击是就行了,然后右键,点击Edit wi ...
- 3D打印GCODE文件学习(一)
我家有一个天威的入门级的3D打印机.它有一个配套的软件叫“Rrint-RiteCoLiDo Repetier-Host V1.5.5”,用来连接.控制打印机.同时它可以加载各种切片软件,对各种3D模型 ...
- 3D打印技术的学习
1. 我们使用3D建模软件:123Ddesign来设计 123D design软件保存格式有2种,分别为123dx和stl格式 123dx格式:选择菜单栏中“Save”下的“To my compute ...
- 1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列, 如:512234、212345等. 要求:”4”不能在第三位,”3”与”5”不能相连。
private static String[] mustExistNumber = new String[] { "1", "2", "2" ...
随机推荐
- HDU 2063 过山车 (最大匹配,匈牙利算法)
题意:中文题目 思路:匈牙利算法解决二分图最大匹配问题. #include <bits/stdc++.h> using namespace std; ; int mapp[N][N]; / ...
- oracle中怎么查看存储过程的源码
今天想找几天前写的存储过程的源码看看,发现自己熟悉的命令怎么都不好使,要不提示标示符错误要不就是提示未选定行,通过baidu得知type跟name变量要弄成大写的.. select text from ...
- 【JS】<a>标签调用js中函数的几种方法
我们常用的在a标签中有点击事件: a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而 ...
- android 应用页面与数据申请逻辑剥离;
1.页面与数据申请剥离,数据申请框架可以灵活更换,解耦合: 2.对应页面的数据申请类中,将返回数据解析剥离,灵活更换数据返回及对应解析: 二.模块划分: 1.一些通用的工具类,可以考虑迁移到com.c ...
- ruby函数回调的实现方法
以前一直困惑ruby不像python,c可以将函数随意传递,然后在需要的时候才去执行.其实本质原因是ruby的函数不是对象. 通过查阅资料发现可以使用如下方法: def func(a, b) puts ...
- jenkins 命令行 CLI jenkins-cli.jar
部署好jenkins后,一般都是通过jenkins提供的web界面来操作jenkins. 而有些场景则需要通过命令来操作jenkins,例如通过脚本操作jenkins. 在jenkins提供的web界 ...
- Selenium2Library系列 keywords 之 _SelectElementKeywords 之 list_should_have_no_selections(self, locator)
def list_should_have_no_selections(self, locator): """Verifies select list identified ...
- js控制不同的时间段显示不同的css样式
js控制不同的时间段显示不同的css样式 js函数,可以放到单独的js文件中也可以放到当前页的<head>标记之内 function getCSS(){ datetoday ...
- 警惕javascript代码中的“</script>”!
之前在写<博客园自定义博客侧边栏公告的过滤漏洞>的时候遇到了一个javascript代码报错“语法错误”的问题,一直不得以解决,感谢Arliang发现了并为我进行了耐心的解释,现整理如下: ...
- 如何避免JavaScript的内存泄露及内存管理技巧
发表于谷歌WebPerf(伦敦WebPerf集团),2014年8月26日. 高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果 ...