3.3 重复段Error[e24]
链接时提示如下错误:
图6 IAR Error[e24]示意图
造成这个问题的原因是有些文件包含了msp430.h,而有些文件包含了io430.h。以MSP430F1611为例,前者通过宏定位到msp430f1600.h,通过则是定位到iox16x.h,而这两个文件有很多重叠的地方(如本例的IE1)。cpu/msp430/rom.c包含了io430.h,flash.c包含了msp430.h,在这里,将flash.c包含的msp430.h改成io430.h。 同样的问题也发生在cpu/msp430/watchdog.c、core/dev/sht11.c、platform/MSP430-169LCD/dev/button-sensor.c(这个还得从包含的头文件追溯,在cpu/msp430/dev/hwconf.h文件)、cpu/msp430/leds-arch.c、cpu/msp430/clock.c、cpu/msp430/cc2420-arch-sfd.c等,可以通过Find in Files寻找msp430.h来替换。
3.4 外部符号未定义
(1) BV
在cpu/msp430/button.c提示外部符号BV未定义,通过Find in Files查找,可知该宏通常是定义在contiki-conf.h或者platform-conf.h文件,如下:
图7 BV宏定义位置
这里,模仿其他例程,在platform/MSP430-169LCD/contiki-conf.h文件加入如下代码:
#ifndef BV #define BV(x) (1<<(x)) - #endif
(2)cc2420_sfd_counter、cc2420_sfd_start_time和cc2420_sfd_end_time
在cpu/msp430/cc2420-arch-sfd.c提示外部符号cc2420_sfd_counter.c、cc2420_sfd_start_time和cc2420_sfd_end_time未定义,该文件将这三个变量声明为外部变量,源码如下:
extern volatile uint8_t cc2420_sfd_counter; extern volatile uint16_t cc2420_sfd_start_time; - extern volatile uint16_t cc2420_sfd_end_time;
事实上,这三个变量已经在contiki-2.5/core/dev/cc2420.c文件定义了, 而这个文件已经被我工程目录删除了,因为编译cc2420.c会引发一系列端口未定义(如TXEPT、UTXIFG0),而这些端口大概是跟cc2420芯片有关吧。这里,我们简单将cpu/msp430/目录下的cc2420*.c文件从工程移除。