Contiki移植

转载请注明出处

摘要

本文介绍了如何将contiki移植到一个新的平台上,并运行起contiki提供的shell。以nuc140为例,说明了移植的步骤和方法。

正文

1. contiki的目录结构

contiki下有app, core,cpu,platform,examples,tools,doc几个目录。

app: 放置contiki提供的应用,例如shell,http server等等

core: 放置contiki的核心内容,调度(sys),网络协议栈(net),文件系统(cfs),驱动的抽象层(dev)等等

cpu:放置与cpu相关的文件,包含启动程序,片上驱动,contiki与cpu架构有关的内容。例如clock,rtime-arch等等

platform:放置与系统平台相关的文件,包含,contiki的main程序,contiki的配置文件,系统平台的驱动程序等等。

examples:放置对应平台开发的应用程序

doc: 文档产生

tools:  针对不同的平台

其中移植主要修改的是三个目录

  • cpu: 添加芯片

  • platform: 添加平台

  • examples: 添加应用

2. 移植步骤

以NuTiny-EVB-NUC140为例,介绍如何移植contiki。NuTiny-EVB-NUC140是新唐的一块micro评估板,上面有一个nuc140的最小系统,我自己又在上面加了nrf24l01无线收发器,dh11温湿度传感器,sr04超声波测距器,组成了一个简单的平台。

a. 添加芯片:

在cpu目录下添加nuc140目录。

nuc140目录下添加如下内容:

wps_clip_image-19707

cmsis_boot: nuc140的启动代码,不同的芯片不同,新唐提供

cmsis_core: nuc140的内核代码,是cortex-m0的,arm提供

cmsis_lib: nuc140的片上驱动,新唐提供

stdio/syscall:是一些简化了的libc库,使用toolchain太大

gun.ld: 链接内存加载文件

Makefile.nuc140: makefile文件

mtarch.h:暂时不使用

clock.c: contiki的时钟,原型见clock.h,这个clock的实现与芯片架构有关,需要在此实现,主要是为contiki提供tick

rtimer-arch.c/rtimer-arch.h: 不使用rtimer可不实现,只留下空函数,为了通过编译。

Makefile.nuc140的说明:

makefile的结构已经在另外一文说明[1],这里主要说明makefile的内容:

定义要编译要进入的目录:

CONTIKI_CPU_DIRS = . syscalls cmsis_core example stdio\

    cmsis_boot cmsis_boot/startup\

cmsis_lib cmsis_lib/Src/Driver cmsis_lib/Include/Driver cmsis_lib/Include/System

定义要编译的文件

CONTIKI_TARGET_SOURCEFILES += startup_NUC1xx.c system_NUC1xx.c \

core_cm0.c syscalls.c printf.c\

DrvGPIO.c DrvSYS.c DrvTIMER.c DrvUART.c \clock.c rtimer-arch.c

定义编译器

CC  = arm-none-eabi-gcc

LD   = arm-none-eabi-gcc

AS  = arm-none-eabi-gcc

NM  = arm-none-eabi-nm

AR   = arm-none-eabi-ar

OBJCOPY  = arm-none-eabi-objcopy

STRIP    = arm-none-eabi-strip

SIZE     = arm-none-eabi-size

定义编译选项

CFLAGSNO = -mthumb -mcpu=cortex-m0  -Wall -fsigned-char -fno-builtin  -ffunction-sections -O0 -g

定义链接选项

LDFLAGS += -mcpu=cortex-m0 \

    -mthumb  \

    -Wl,-T -Xlinker $(CONTIKI_CPU)/gnu.ld \

    -Wl,-static \

-u Default_Handler \

    -nostartfiles \

    -Wl,-Map -Xlinker contiki-$(TARGET).map

定义编译链接依赖关系和生成规则

$(OBJECTDIR)/%.o: %.s

$(AS) $(ASFLAGS) -o $@ $<

%-nosyms.$(TARGET): %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a $(STARTUP) # $(OBJECTDIR)/empty-symbols.o

$(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o $@ $(filter-out %.a,$^) $(filter %.a,$^) -lc $(filter %.a,$^)

%.bin: %.$(TARGET)

$(OBJCOPY) $(OBJOPTS) $< $@ 

%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(STARTUP)

$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} -Wl,-\( ${filter %.a,$^} $(TARGET_LIBFILES) -Wl,-\) -o $@

@echo >> contiki-$(TARGET).map

@$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map

$(OBJCOPY) -O binary -S $@ contiki-$(TARGET).bin

$(SIZE) $@


b. 添加平台:

将这个临时搭建的平台叫做m0rime

在platform下添加m0rime目录

在m0rime目录下添加如下内容:

wps_clip_image-2302

dev:放置设备驱动,例如之前提到的nrf24l01, dh11这些外设的驱动,这些驱动需要自己写或者移植

platform-conf.h: 说明编译器的特性, 定义clock特性等等,这个文件会没contiki-conf.h包含,因此把这些定义放到contiki-conf.h也可以。

contiki-conf.h: 配置contiki

contiki-main.c: 主程序,初始化系统,启动process,启动contiki core等动作。

Makefile.m0rime: makefile文件

Makefile.m0rime的说明:

makefile的结构已经在另外一文说明[1],这里主要说明makefile的内容:

定义要编译的文件

ARCH= nrf24l01.c dht11.c sr04.c

定义要编译要进入的目录

CONTIKI_TARGET_DIRS = . dev

定义主程序文件

ifndef CONTIKI_TARGET_MAIN

CONTIKI_TARGET_MAIN = contiki-main.c

endif


c. 添加应用:

在examples添加文件夹m0rime-app

m0rime-app内添加以下内容:

m0rime-shell.c: 应用程序,contiki中添加的应用程序,都可以以process形式,并使用AUTOSTART_PROCESSES(&m0rime_shell_process)加入到自动start的process列表中,在contiki-main.c执行时会自动启动这些process

makefile的说明:

makefile的结构已经在另外一文说明[1],这里主要说明makefile的内容:

CONTIKI_PROJECT = m0rime-shell 指定应用程序名

all: $(CONTIKI_PROJECT)

TARGET=m0rime 指定target见[1]

APPS = serial-shell 选contiki提供的应该,在app中有

CONTIKI = ../..

include $(CONTIKI)/Makefile.include


3. 移植代码和应用

a. clock.c

使用arm m0的内核systick做为系统时钟

#define RELOAD_VALUE 12000 使用12M晶振,1ms一个次中断voidclock_init(void)

{ 

SysTick_Config(RELOAD_VALUE);

}

时钟中断voidSysTick_Handler(void)

{

  count++;  if(etimer_pending()) { system tick中进行etimer poll

    etimer_request_poll();

  }  if (--second_countdown == 0) {

    current_seconds++;

    second_countdown = CLOCK_SECOND; //s计数器

  }

}


b. contiki-conf.h

#define CC_CONF_REGISTER_ARGS          0 编译器支援寄存器变量

#define CC_CONF_FUNCTION_POINTER_ARGS  1 编译器支援函数指针

#define CC_CONF_FASTCALL 编译器支援fast call

#define CC_CONF_VA_ARGS                1 编译器支援变参

#define CC_CONF_INLINE                 inline 编译器支援inlinetypedef unsigned long clock_time_t; 定义clock time类型

#define CLOCK_CONF_SECOND 1000 定义clock 1s会产生多少个tick


c. 运行contiki serial-shell

  • contiki shell是contiki提供的一个应用只要在makefile中APP指定了serial-shell就可以通过串口使用shell功能。启动serial-shell有如下注意点:

  • serial-shell使用printf作为输出,因此printf输出需要加载到串口上

  • serial-shell的输入使用serial_line_input_byte, 当串口收到数据时,通过这个API丢到serial-shell就可以了。

  • serial-shell不回馈收到的字符,因此使用的串口终端,需要开启字符自回馈功能,才能看到自己的输入。

  • serial_line_input_byte 会忽略0x0d, 只将0x0a最为结束符。因此对于某些串口终端,再按回车键时只输出0x0d,而不响应命令。这里对serial_line_input_byte做了小的修改,把0x0d也做为结束符。这个修改不通用,请慎用。

总结

本文简要的说明了如何将一个新的芯片平台移植到contiki的方法。介绍了shell的启动方法。

参考资料

[1] Contiki Makefile结构

转载于:https://my.oschina.net/lgl88911/blog/145758

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于移植 Contiki 操作系统到特定硬件平台,以下是一些基本步骤: 1. 了解目标硬件平台:首先,你需要详细了解目标硬件平台的架构、处理器类型、存储器配置以及外设等信息。这将帮助你在移植过程中进行必要的配置和适配。 2. 下载 Contiki:从 Contiki 官方网站下载最新版本的 Contiki 操作系统。Contiki 是一个开源项目,可以在其官方网站上找到相关的文档和资源。 3. 配置编译环境:根据目标硬件平台的要求,配置合适的交叉编译工具链和开发环境。这些工具可用于将 Contiki 操作系统编译成适合目标硬件平台的可执行文件。 4. 修改配置文件:Contiki 提供了一个名为 'platform' 的目录,其中包含了不同硬件平台的配置文件。你需要根据目标硬件平台的要求,修改或创建适当的配置文件。 5. 实现驱动程序:根据目标硬件平台的外设要求,在 Contiki 中实现相应的驱动程序。这可能涉及到与硬件交互的底层代码编写。 6. 适配网络协议栈:Contiki 自带了一个轻量级的网络协议栈,你需要将其适配到目标硬件平台上。这包括配置网络接口、设置网络参数以及处理网络数据包等。 7. 编译和烧录:使用之前配置好的交叉编译工具链,将 Contiki 操作系统编译为可执行文件。然后,将可执行文件烧录到目标硬件平台上进行运行和测试。 请注意,移植 Contiki 操作系统可能需要一些底层嵌入式系统和操作系统的知识。确保你对目标硬件平台和 Contiki 的要求有足够的了解,并参考 Contiki 官方文档和社区资源来帮助你进行移植过程中的各种配置和适配。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值