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" ...
随机推荐
- js spin 加载动画(loading)
js spin 加载动画 最近做页面ajax加载是又用到loading动画,还好有一个spin.js 具体的包大家可以去http://fgnass.github.com/spin.js/下载, 如果想 ...
- 【Unity3D】生成工程报错解决—UnityEditor.HostView:OnGUI() Error building Player: Couldn't build player because of unsupported data on target platform.
错误 错误1:An asset is marked as dont save, but is included in the build: unityEditor.HostView:OnGUI() 错 ...
- Ruby 文件处理
#r read, #w write, #a append, #r+ 读写方式 从文件的头位置开始读取或写入, #w+ 读写方式,如果文件已存在清空该文件,不存在就创建一个新的文件, #a+ 如果文件存 ...
- ruby函数回调的实现方法
以前一直困惑ruby不像python,c可以将函数随意传递,然后在需要的时候才去执行.其实本质原因是ruby的函数不是对象. 通过查阅资料发现可以使用如下方法: def func(a, b) puts ...
- OracleBulkCopy的批量数据导入
private void button1_Click(object sender, EventArgs e) { OpenFileDialog afd = new OpenFileDialog(); ...
- Android中TabHost嵌套TabHost
在嵌套TabHost时,先后遇到了以下情况: 问题1:内部TabHos无显示,只显示了其中的一个Activity: 解决:按下文比对主子TabHos的布局文件和java文件并修改: 问题2:如上所做后 ...
- Delphi中编辑word
其他(28) //启动Word try wordapplication1.connect; except messagedlg('word may not be ins ...
- 用javascript 面向对象制作坦克大战(三)
之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射. 上代码前来张最新的类图: 3. 碰撞检测 前面我们已经完成了坦克的移动和地图的绘制,下面我们开始写碰撞检测. 3. ...
- Flume OG 与 Flume NG 的区别
1.Flume OG:Flume original generation 即Flume 0.9.x版本 Flume NG:Flume next generation ,即Flume 1.x版本 ...
- AAC 格式分析
一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Au ...