从ProtoThread开始到contiki的学习

缘起Protothreads,用STM32开发了两个程序用上了PT,里面包括做了十个左右的任务,键盘、192×64显示屏、两个485口Modbus通读,5路AD采样、故障判断等等。感觉对简化算法有很大的帮助,程序变得容易调试多了。最近没有什么任务,调试一下Contiki。

今天开始对Contiki的学习,程序本身用C语言写的,中文资料比较少,本着Hack的精神,读源代码,把它分解。

从官网上下了2.7的源代码,打开一看,解开包一看46M,肯定许多东西都不是我需要的。第一步我只想要一个操作系统。能运行Hello World就行。

看我来实现这个目标。先说一下我的环境:Puppy圣诞版,从2008年它诞生就开始,一直用到现在(Windows放到了虚拟机中了),里面装了gcc version 4.2.2……

最近用Exvim来写程序,分析源代码,原版的Helloworld.c是这样的

#include "contiki.h"

#include <stdio.h> /* For printf() */
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello world process");
AUTOSTART_PROCESSES(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();

  printf("Hello, world\n");
 
  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

直接在源目录make编译后,得到大小为158177的目标文件,运行正确

total 1416
drwxr-xr-x  3 root root     240 2015-08-01 10:48 .
drwxr-xr-x 46 root root     920 2013-11-06 00:15 ..
-rw-r--r--  1 root root 1158766 2015-08-01 10:48 contiki-native.a
-rw-r--r--  1 root root   74017 2015-08-01 10:48 contiki-native.map
-rw-r--r--  1 root root    2307 2013-11-06 00:15 hello-world.c
-rw-r--r--  1 root root    5622 2013-11-06 00:15 hello-world-example.csc
-rwxr-xr-x  1 root root  158177 2015-08-01 10:48 hello-world.native
-rw-r--r--  1 root root     125 2013-11-06 00:15 Makefile
drwxr-xr-x  2 root root    5520 2015-08-01 10:48 obj_native
-rw-r--r--  1 root root    1231 2013-11-06 00:15 README.md
-rw-r--r--  1 root root      93 2015-08-01 10:48 symbols.c
-rw-r--r--  1 root root      69 2015-08-01 10:48 symbols.h

我的第一个目标是里面的操作系统,能实现事件驱动就可以了。读源文件,保留sys下面的这些文件

-[F]whz_contiki {
 |-[F]sys {
 | |-arg.c
 | |-arg.h
 | |-autostart.c
 | |-autostart.h
 | |-cc.h
 | |-lc-addrlabels.h
 | |-lc-switch.h
 | |-lc.h
 | |-process.c
 | |-process.h
 | |-procinit.c
 | |-procinit.h
 | |-pt.h }
其中,arg.h被process.c所包含,但process.c中并没有使用arg.h中的函数,如果在process.c中把这行#include去掉,可以减少arg的两个文件。
改Hellowold.c为下面的程序:

#define AUTOSTART_ENABLE 1
#include "contiki.h"

#include <stdio.h> /* For printf() */
/*---------------------------------------------------------------------------*/
PROCESS(hello_world_process, "Hello world process");

AUTOSTART_PROCESSES(&hello_world_process,&hello_world_process,&hello_world_process);
PROCINIT(&hello_world_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
  PROCESS_BEGIN();
  printf("Hello, world\n");
 
  PROCESS_END();
}
改contiki.ini为:

#ifndef __CONTIKI_H__
#define __CONTIKI_H__
#include "contiki-version.h"
#include "sys/process.h"
#include "sys/autostart.h"
#include "sys/pt.h"
#include "sys/procinit.h"
#endif /* __CONTIKI_H__ */
改contiki_main.c为以下内容

#include <stdio.h>
#include <string.h>
#include "contiki.h"
/*---------------------------------------------------------------------------*/
int contiki_argc = 0;
char **contiki_argv;
int
main(int argc, char **argv)
{
  contiki_argc = argc;
  contiki_argv = argv;
  process_init();
  autostart_start(autostart_processes);
  return 0;
}
这样一个最小的系统就产生了。

已经能正常运行了,再编译一个正常版的Hello World,看一下文件的大小

其中的a.out为正常的printf("Hello World")文件的大小4375字节。

ks为Contiki操作系统下的文件大小为8718,估计光使用操作系统占用的大小为4k


我没有使用任何硬件平台,这样做的目的就是看一下操作系统的运行,及更深入的理解一下Contiki的接口,里面的宏定义的太多,Make文件很长,我希望能把里面的文件挑出来,用什么功能加入什么文件,最后定义几个宏就行了。


第二步想把PT中的三个例子用Contiki系统检验一下,等待我的好消息吧。


第三步把定时器加入


再有时间的话看一下联网了……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值