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-07 22:43
二、编译调试2.1 找不到文件解决工程make之后,有时会提示找不到源文件,例如:"Fatal Error[Pe1696]: cannot open source file "contiki-conf.h" ,错误提示如下:图2 找不到源文件错误解决方法:(1) 检查工程目录是否包容该文件在代码编辑区选中相应的源文件(如上例的"contiki-conf.h"),右击选择open "contiki-conf.h",打开该源文件,查看其文件属性,观其路径,再对应工程目录,确定该源文件已被包含进工程目录。
houjiakai
2楼-- · 2019-08-08 02:33
(2) 设置预处理路径第一步设置后,并不能保证问题解决(事实上,不用第一步设置也可以),如果还提示找不到源文件错误,那就得把该源文件所在的目录加到预处理路径中,如下图所示:图3 设置预处理路径
houjiakai
3楼-- · 2019-08-08 07:39
 精彩回答 2  元偷偷看……
houjiakai
4楼-- · 2019-08-08 12:45
2.3 ISR定义修改
Contiki默认开发环境是Linux,其中断服务处理程序定义格式与IAR不同,编译的时候报如下错误:图4 ISR相关错误这里只要略加修改即可,改成符合IAR的格式,以button-sensor.c为例,如下:
  • interrupt(PORT2_VECTOR)
  • irq_p2(void)
  • /***改成如下内容***/
  • #pragma vector= PORT2_VECTOR
  • __interrupt void irq_p2(void)



houjiakai
5楼-- · 2019-08-08 14:14
2.4 找不到库文件Contiki用到了Linux下的库文件,先注释掉,编译单个文件,没问题最好(如cpu/msp430.c的sys/unistd.h),也就是说这个文件压根就没用到这个库文件。如果真用到了,再编译会引进新的错误,此时,果断将文件从工程目录移除(比如dlfcn.h、lib/malloc.h)。你可能会说,为何不将这些头文件从Linux找出来加到编译路径,我确实尝试了,发现可行性不高,因为库文件还调用其他库文件。不过后续移植可能得正视社个问题了。注:LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,文件dlfcn.h定义了调用动态链接库的函数的原型。2.5 嵌入式汇编修改(1) __asm__未定义GCC下关键字__asm__,等同于IAR的asm。不过,从文档《IAR C/C++ Compiler Reference Guide.pdf》来看,推荐使用关键字__asm(英文原文:the asm keyword is not available when the option --strict is used. The __asm keyword is always available)。在相应文件增加如下代码(比如msp430.c),即可解决:
  • #ifdef __IAR_SYSTEMS_ICC__
  •   #define __asm__ __asm
  • #endif


houjiakai
6楼-- · 2019-08-08 14:48
但__volatile__不是IAR的关键字,还是有问题,索性改成这样(没加volatile会不会有副作用?):
  • #ifdef __IAR_SYSTEMS_ICC__
  •   #define asmv(arg) __asm(arg)
  • #elif
  •   #define asmv(arg) __asm__ __volatile__(arg)
  • #endif


(2) expected a "(" 及 expected a ")"尽管解决了__asm__未定义问题,但还是报错了expected a "(",原因是IAR内嵌汇编与GCC不同,解决方法就是改写这些GCC内嵌汇编以符合IAR。好在需要修改的地方不多,只有3处(在msp430.c文件),我仿照《IAR C/C++ Compiler Reference Guide for Texas Instruments' MSP430 Microcontroller Family.pdf》上面的例子修改,但不行,最后我用宏替代了,另一处我直接注释掉,后续发点时间把msp430内嵌汇编了解下。

一周热门 更多>