Contiki简介:
Contiki是一个小型、开源、极易移植的多任务操作系统。它专门设计以适用于一系列的内存受限的网络系统,包括从8位电脑到微型控制器的嵌入系统。Contiki只需几千字节的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。作为基础的内核以及大部分的核心功能是瑞典计算机科学研究所的网络内嵌系统小组的Adam Dunkels开发的。
51单片机简介:
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,前些年占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
背景:
最近闲来无事,把以前买的51开发板拿出来玩,榨干了51所有的片内外设后,开始把魔爪投向了OS。对比了当前比较成熟的RTOS和51可怜的性能,选择了使用Contiki。在精心裁剪的情况下,运行完整的Contiki内核,仅需100字节左右的RAM和1K字节左右的ROM。我的51开发板使用的MCU是STC89C52和STC90C516AD两种。分别有8K ROM 512B RAM和61K ROM 4K RAM。运行Contiki应该是毫无问题的。
移植综述:
Contiki的内核是由事件驱动的,event-process模型,内核提供了5种定时器(timer,stimer,etimer,ctimer,rtimer)。Contiki的最简移植,至少要移植event-process模型和timer,etimer定时器,并且实现和CPU体系结构相关的时钟模块。
其中event-process在process.c里实现,timer,etimer在timer.c和etimer.c里实现。时钟模块在clock.c里由自己实现,这也是移植要做的主要工作。如此,Contiki内核的基本结构清楚了。看截图
我们创建3个目录,cpu core platform。其中cpu目录下实现和体系结构紧密相关的代码,比如clock.c,rtimer-arch.c是rtimer定时器的具体实现。core是Contiki内核的实现,我目前已经把5种内核时钟全部移植过来了。platform放main函数和一些开发板上的设备驱动。
移植过程:
接下来,我们开始移植的主要工作----cpu目录下的代码实现。
先说clock.c。在这里我们要实现clock的初始化和clock中断服务程序。
void clock_init(void){
TMOD &= 0xF0;
TMOD |= 0x03; //设置定时器0模式3
TH0=TL0=0x05;//设置计数器初值
IE|=0x01<<1; //定时器0中断使能
IE|=0x01<<3;//定时器1中断使能
TR0=1;//定时器0开始计数
TR1=1;//定时器1开始计数
EA=1;//开中断
}
简单解释一下上面的程序,设置计数器初值为5,计数溢出值是256,则每250us(12T,12MHZ)中断一次。定时器0的模式3,除了占用定时器0的中断,还会占据定时器1的中断。因此我们可以得到2个8位定时器。其中我们使用定时器0作为clock时钟源,即Contiki的系统时基。具体介绍可以参看相关手册。