当前位置: 首页 > 工具软件 > Contiki > 使用案例 >

Contiki在CC2530的移植

穆仲卿
2023-12-01

  首先选择一个CC2530的基础程序(例如串口打印),移植Contiki系统的工作将在此基础上进行。
  将contiki-3.0/core/sys目录下的autostart.cetimer.cprocess.ctimer.c文件,contiki-3.0\cpu\cc253x\dev目录下的clock.c,以及contiki-3.0\cpu\cc253x\dev目录下的soc.c添加到工程中。
  将如下头文件路径添加到IAR中:

$PROJ_DIR$\contiki-3.0\core\
$PROJ_DIR$\contiki-3.0\core\lib\
$PROJ_DIR$\contiki-3.0\cpu\
$PROJ_DIR$\contiki-3.0\core\sys\
$PROJ_DIR$\contiki-3.0\platform\cc2530dk\
$PROJ_DIR$\contiki-3.0\cpu\cc253x\

  将该串口打印程序的main.c文件修改为:

#include <sys/process.h>
#include <sys/procinit.h>
#include <sys/etimer.h>
#include <sys/autostart.h>
#include <sys/clock.h>
#include <ioCC2530.h>
#include "stdio.h"

#define LED1 P1_0 /* 定义P1.0口为LED1控制端 */

void IO_Init ( void ) {
    P1SEL &= ~0x01; /* P1.0作为普通IO口 */
    P1DIR |= 0x01; /* P1.0定义为输出 */
    P1INP |= 0X01; /* 打开三态 */
}

void InitUART ( void ) {
    PERCFG = 0x00; /* (外设控制寄存器)USART_0的I/O位置为备用位置0 */
    P0SEL = 0x0c; /* P0_2和P0_3用作串口(外部设备功能) */
    P2DIR &= ~0XC0; /* (端口2方向和端口0外设优先级控制)P0优先作为UART0 */
    U0CSR |= 0x80; /* 设置为UART模式 */
    U0GCR |= 8; /* 波特率指数值,BAUD_E和BAUD_M决定了UART波特率 */
    U0BAUD |= 59; /* 波特率设为9600 */
    UTX0IF = 0; /* UART0的TX中断标志初始设置为0 */
}

__near_func int putchar ( int c ) {
    UTX0IF = 0;
    U0DBUF = ( char ) c;

    while ( UTX0IF == 0 );

    return ( c );
}

PROCESS ( led_process, "led" );
PROCESS_THREAD ( led_process, ev, data ) {
    PROCESS_BEGIN();
    IO_Init();
    LED1 = 0;

    while ( 1 ) {
        static struct etimer et;
        etimer_set ( &et, CLOCK_SECOND / 2 );
        PROCESS_WAIT_EVENT_UNTIL ( etimer_expired ( &et ) );
        LED1 = !LED1; /* LED1闪烁 */
    }

    PROCESS_END();
}

PROCESS ( print_process, "print" );
PROCESS_THREAD ( print_process, ev, data ) {
    PROCESS_BEGIN();

    while ( 1 ) {
        static struct etimer et;
        etimer_set ( &et, CLOCK_SECOND / 2 );
        PROCESS_WAIT_EVENT_UNTIL ( etimer_expired ( &et ) );
        printf ( "I am running!\r\n" );
    }

    PROCESS_END();
}

unsigned int idle_count = 0;
AUTOSTART_PROCESSES ( &led_process, &print_process );

extern void soc_init();

int main ( void ) {
    InitUART();
    clock_init();
    soc_init();
    process_init();
    process_start ( &etimer_process, NULL );
    autostart_start ( autostart_processes );

    while ( 1 ) {
        do {
        } while ( process_run() > 0 );

        idle_count++;
        /* Idle! */
        /* Stop processor clock */
        /* asm("wfi"::); */
    }

    return 0;
}

对工程进行编译,可能会出现很多错误,接下来要进行修改。具体步骤如下:
  1. 如果IAR提示8051def.h中的stdint.h不存在,则在IAR头文件路径中添加如下内容:

$TOOLKIT_DIR$\inc\dlib\c\

  2. 注释cc253x.h中的#include <compiler.h>,然后加入#include <ioCC2530.h>
  3. 将cc253x.h中与ioCC2530.h重复的部分注释掉。
  4. 将contiki-conf.h文件中的CLOCK_CONF_STACK_FRIENDLY设置为0
  5. 将clock.c中的__xdata __at(0x0000) static unsigned long timer_value = 0;改为static volatile unsigned long timer_value = 0;
  6. 将如下内容进行修改:

#pragma save
#if CC_CONF_OPTIMIZE_STACK_SIZE
    #pragma exclude bits
#endif

void clock_isr ( void ) __interrupt ( ST_VECTOR ) {
    /* ... */
}

#pragma restore

修改结果如下:

//#pragma save
//#if CC_CONF_OPTIMIZE_STACK_SIZE
//    #pragma exclude bits
//#endif

#pragma vector=ST_VECTOR
__near_func __interrupt void clock_isr ( void ) {
    /* ... */
}

//#pragma restore

  7. 将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
#endif

  8. 在autostart.h中加入如下内容:

#define AUTOSTART_ENABLE 1
#define CC_NO_VA_ARGS    0

再次编译工程,如果没有报错,则移植成功。

 类似资料: