430也能玩嵌入式:Contiki内核在IAR+MSP430下移植(转发)

2019-08-07 19:39发布

摘要:本文详细记录了Contiki内核在IAR+MSP430下移植步骤,遇到的问题,分析解决,最后附上工程源码。
前言分析了Contiki有一段时间了,但本人还没真正移植过。之前是我们项目组一哥们移植好了(IAR+ARM),我在调试Contiki文件系统Coffee遇到了难题,于是就想在MSP430平台上调试,理由是MSP430硬件比较简单。最近,CU网友kangerbiao45d已经把Contiki移到IAR+Telosb,给了我莫大鼓舞(感谢他)。我手头有MSP430-169LCD,于是下决心移植Contiki到IAR+MSP430-169LCD。终于跑通了,遂将过程详细记录,以供分享。
官方的Contiki源码是在Linux开发环境进行的,移植到IAR,首要解决的就是GCC与IAR之间的差异,包括:    (1)GCC是用Makefile来管理工程编译,而IAR是IDE,通过工程文件目录来反映文件间的关系,所以必要时需要将路径加到preprocesses;(2)嵌入式汇编,GCC内嵌汇编与IAR内嵌汇编格式差异甚大,需要全面修改Contiki出现内嵌汇编的地方;(3)文件差异,Linux平台下的Contiki会调用Linux的头文件或者文件名不同(比如io.h与io430.h)。再者需要解决版子间的差异,如果节点恰是Contiki支持的,那最好(比如Telosb),否则选择一个相近的节点进行修改,比如我的板子MSP430-169LCD,其MCU是MSP430F169,与Telosb的MSP430F1161属于同一序列。
一、下载源码及创建工程文件1.1 下载源代码Contiki最新版本是2.5,可以从SourceForge下载源码,猛击这里下载。1.2 创建工程文件移植的指导思想是先把内核跑起来,而后根据需求再把文件系统、动态加载、网络模块加上去。所以这里只需把Contiki内核相关的源文件加到工程目录,不过加多了也没关系,还有后续的调试嘛:-)取一个Contiki支持的节点来修改,这里选择Tosek(因其MCU是MSP430F1611),将platform/sky/下文件拷贝到新建文件夹platform/MSP430-169LCD。我的工程目录如下(期间删了若干文件):图1 Contiki_msp430工程目录示意图接下来,就一步步修改吧。值得一提的是,考虑到后续还要移植文件系统、动态加载、网络模块,本次遇到错误是尽可能的修改,实在不行,才从工程目录将该文件删除。所以,实际移植Contiki内核要比以下描述的要简单得多。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
houjiakai
1楼-- · 2019-08-09 07:23
 精彩回答 2  元偷偷看……
houjiakai
2楼-- · 2019-08-09 10:13
四、其他地方(1)loader-arch.hcpu/msp430/loader-arch.c文件中的#include "loader/loader-arch.h"改成#include "loader/elfloader-arch.h"。(通过逻辑判断)(2)FSSEL_SMCLKcontiki-2.5/cpu/msp430/rom.c文件中的FCTL2 = FWKEY | FSSEL_SMCLK | (FN2 | FN1)改成FCTL2 = FWKEY | FSSEL_2 | (FN2 | FN1)。即把FSSEL_SMCLK 改成FSSEL_2 ,这点从io430.h对应的MCU头文件(比如msp430ff161.h)可以看出。(3) CH_CURS_UP未定义透过错误提示信息,可以发现这些类似的错误都跟ctk有关(文件名前缀),在contiki-2.5/core/有个目录ctk,文件ctk.h有这么一行注释"This file is part of the Contiki desktop OS."。纵观ctk的源码可知是跟图形相关的东西,在这里,我们将这些文件从工程目录移除(在core/lib/及core/ctk目录)。后来,查阅资料证实,ctk是Contiki的TK图形库(c是Contiki的首字母,Tk is a graphics library that extends Tcl with graphical-interface facilities)。(4) core/dev目录这个目录改起来很简单,将cc2420相关的文件从工程目录移除,重新编译,会报io.h的错,改成io430.h即可(我觉得直接注释掉会更好)。
houjiakai
3楼-- · 2019-08-09 12:27
(5) core/loader目录移除其他平台的文件(比如elfloader-avr.c、cle_avr.c),编译会提示找不到malloc.h、dlfcn.h,再移除报错的文件。再编译,会提示错误(文件cle.c)"expression must be a pointer to a complete object type" ,移除该文件(粗略看下,大概是跟编译器支持有关),再编译就没问题了:-)这对跑Contiki内核不会有影响的,因为仅仅跑内核是没有用到动态加载这个模块的。(6)LOADER_ARCH_MAGIC和LOADER_ARCH_VERSION没定义用Find in Files的目录查找,可知这两个变量在Contiki-2.5/platform/esb/loader/loader-arch.h和Contiki-2.5/platform/msb430/loader/loader-arch.h有定义。在这里,仿照定义这两个变量。创建文件platform/MSP430-169LCD/loader-arch.h文件,文件内容如下:
  • //this file added by jelline
  • #ifndef __LOADER_ARCH_H__
  • #define __LOADER_ARCH_H__
  • #define LOADER_ARCH_MAGIC 0x373a
  • #define LOADER_ARCH_VERSION 0x0001
  • #endif


houjiakai
4楼-- · 2019-08-09 13:45
(7) profile_timestamps和PROFILE_TIMESTAMP_PTR未定义

    这两个变量都在core/sys/profile-aggregates.c,其用途是"Compuation of aggregates for the Contiki profiling system"。但整个Contiki源码找不到有定义的,真无语了,直接从工程移除吧。
houjiakai
5楼-- · 2019-08-09 17:37
庆幸的是,Google搜索找到了profile.h(v 1.2 2007/11/17,而该工程的profile.h是v 1.3 2008/01/17)[1]文件含有这些变量定义,在profile.h增加如下内容:
  • /**************added by jelline**********************/
  • struct profile_timestamp
  • {
  •   const char *ptr;
  •   rtimer_clock_t time;
  • };
  • #ifdef PROFILE_CONF_LIST_LENGTH
  •   #define PROFILE_LIST_LENGTH PROFILE_CONF_LIST_LENGTH
  • #else
  •   #define PROFILE_LIST_LENGTH 128
  • #endif
  • extern struct profile_timestamp profile_timestamps[PROFILE_LIST_LENGTH;
  • extern unsigned int profile_timestamp_ptr;
  • extern rtimer_clock_t profile_timestamp_time;
  • #define PROFILE_TIMESTAMP_PTR (profile_timestamp_ptr / sizeof(struct profile_timestamp))



至此,编译链接成功,下载到板子上,看到灯闪烁:-)
dwh000
6楼-- · 2019-08-09 19:46
 精彩回答 2  元偷偷看……

一周热门 更多>