本文是仿照一个学长contiki2.5移植到IAR上的工程,经行移植的,主要参考里面的配置文件怎么处理的,具体细节会再下面一步步记录下来。
出现问题的地方比较多,但是类型就哪几种,将每种遇到的问题及解决方式列出来
1,头文件问题cc253x.h
1,在建立工程目录,配置好工程后,首先进行编译,
一阵莫名其妙,调试了两天硬是不知道哪里出问题了,真是憋成硬伤了。很奇怪,这个iocc2530.h是编译器自带的头文件,怎么会莫名冒出来1W+个错误呢,郁闷之极,就开始认真比对学长的contiki-2.5版,最后在8051def.h中找到了一点不同:
#if !defined(__SDCC_mcs51) && !defined(SDCC_mcs51)
#define __data
#define __xdata
#define __code
#define __bit bool
#define __sfr volatile unsigned char
#define __sbit volatile bool
#define __critical
#define __at(x)
#define __using(x)
#define __interrupt(x)
#define __naked
在contiki-2.6版本中有上面的宏定义,目测是contiki是在linux上发行的,支持sdcc编译器,而现在用的是IAR,__data 在IAR里面是用来定义变量属性的,怎么能定义为空呢,所以果断把这里给屏蔽了。然后进行编译,果断剩下600+个错误,大喜。接下来应该很多是语法方面的,比如中断服务函数定义方式之类的。继续
3,600+中的第一个问题就是中断服务函数定义方式问题
\contiki-2.6\cpu\cc253x\rtimer-arch.c
\contiki-2.6\cpu\cc253x\rtimer-arch.h
//void rtimer_isr(void) __interrupt(T1_VECTOR);
#pragma vector=T1_VECTOR
__near_func __interrupt void rtimer_isr(void);
上面是声明,改了。在定义处,只需要把冒号去掉就行了。其他地方出现同样的问题,照此处理就行了。
#pragma vector=P0INT_VECTOR
__interrupt void port_0_isr(void);
4.在platform\cc2530dk\dev\Adc-sensor.c 中
static int
configure(int type, int value)
{
switch(type) {
case SENSORS_HW_INIT:
#if TEMP_SENSOR_ON
/* Connect temperature sensor to the SoC */
ATEST = 1;
TESTREG0 = 1;
#endif
APCFG = 0; /* Disables Input Channels */
break;
}
return 1;
}
这个函数中的TESTREGO是cc2530中的测试寄存器,地址是
SFRX(TESTREG0, 0x624B); /* Test register 0 */
这是定义在cc253x.h中的,由于我们使用IAR自带的头文件iocc2530.h iocc2531.h 来完成2530头文件的定义,所以命名难免有多不同,不过只需找到contiki-2.6中cc253x.h该符号所对应的地址,然后在iocc2530.h中找到对应的符号,修改掉该处即可。
5,有些不是contiki2.6 core中的所有文件都是要包含的,有些是用不到的,所以那些可以去掉
如 :
cc2420是一款射频芯片,目测在cc2530里面应该没用,暂时去掉。
6,core->cfs cfs-coffee.c中包含了#include "cfs-coffee-arch.h"
在source-sight中查找了此头文件,只有在
从上面可以看到,这个和cc2530貌似没什么关系,既然不知道这个头文件的关系,那就直接先将cfs相关的文件暂时编译,毕竟我们现在只是把contiki-2.6换下工作环境,而不是实现它的所有模块,这个在用的时候再去自己分析。
此类还有很多,有的是.c中的,尽量不踢出网络方面的东西,其他外围可以踢出。
7关于__bit的声明,必须声明成bool型。
extern volatile __no_init __bit bool sleep_flag;
#include "stdbool.h"
8
阅读(1001) | 评论(0) | 转发(0) |