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" ...
随机推荐
- squid+nginx+apache
一.前言 二.编译安装 三.安装MySQL.memcache 四.安装Apache.PHP.eAccelerator.php-memcache 五.安装Squid 六.后记 一.前言,准备工作当前,L ...
- 【<td>】使<td>标签内容居上
<td>有一个叫valign的属性,规定单元格内容的垂直排列方式.有top.middle.bottom.baseline这四个值. 所以,让TD中的内容都居上的实现方法是: <td ...
- 【转】STL空间配置器
STL空间配置器(allocator)在所有容器内部默默工作,负责空间的配置和回收.STL标准为空间配置器定义了标准接口(可见<STL源码剖析>P43).而具体实现细节则由各编译器实现版本 ...
- 反转链表 --剑指offer
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反正后链表的头结点. #include<stdio.h> #include<malloc.h> typedef str ...
- JAVA和C/C++之间的相互调用。
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...
- 使用DDMS测试安卓手机APP的性能(android)
安装/配置: 通过另外一个工具也可以测试手机客户端APP的性能,这就是android开发包中的DDMS工具(Dalvik Debug Monitor Service),先来说一下android开发包的 ...
- C#汉字转换拼音技术详解
C#汉字转换拼音技术详解(高性能) 下面将源代码贴出.public static class ChineseToPinYin { private sta ...
- 建立简单的VLAN通信
http://minitoo.blog.51cto.com/4201040/786011(转载) 在路由器上做单臂路由实现VLAN间路由,也就是设置子接口和封装协议. 实现环境如下图: 在交换机上建立 ...
- MFC DLL 资源模块句柄切换[转]
以前写MFC的DLL的时候,总会在自动生成的代码框架里看到提示,需要在每一个输出的函数开始添加上 AFX_MANAGE_STATE(AfxGetStaticModuleState()).一直不明白这样 ...
- Apache Hadoop 镜像地址
HTTP http://apache.fayea.com/ http://apache.opencas.org/ http://mirror.bit.edu.cn/apache/ http://mir ...