MSP430G2553 移植 Contiki RTOS 实时操作系统
目錄
- 新建工程
- 移植過程
- 關于時間
- 多任務示例
- main.c
- 內存使用情況
- 效果
平臺:Code Composer Studio 10.4.0
MSP-EXP430G2 LaunchPad 試驗板
MSP430G2553 LaunchPad? Development Kit (MSP?EXP430G2ET)
contiki下載:contiki-os Github
本文參考自二、Contiki移植 —— 一根線
本工程示例
新建工程
移植過程
新建contiki文件夾
添加core、cpu文件夾
將Github下載的contiki/core內如下文件復制進剛建好的core文件夾
dev內僅保留watchdog.h
lib內僅保留list.c、list.h
把建好的core文件夾加入路徑
core內新建contiki-conf.h
其內容為
#ifndef CONTIKI_CONF_H_ #define CONTIKI_CONF_H_#include <stdint.h>#define CCIF #define CLIF#define NETSTACK_CONF_WITH_IPV4 1 #define WITH_ASCII 1#define CLOCK_CONF_SECOND 100/* These names are deprecated, use C99 names. */ typedef uint8_t u8_t; typedef uint16_t u16_t; typedef uint32_t u32_t; typedef int8_t s8_t; typedef int16_t s16_t; typedef int32_t s32_t;typedef unsigned int clock_time_t; typedef unsigned int uip_stats_t;#ifndef BV #define BV(x) (1<<(x)) #endif/* uIP configuration */ #define UIP_CONF_LLH_LEN 0 #define UIP_CONF_BROADCAST 1 #define UIP_CONF_LOGGING 1 #define UIP_CONF_BUFFER_SIZE 116#define UIP_CONF_TCP_FORWARD 1/* Prefix for relocation sections in ELF files */ #define REL_SECT_PREFIX ".rel"#define CC_BYTE_ALIGNED __attribute__ ((packed, aligned(1)))#define USB_EP1_SIZE 64 #define USB_EP2_SIZE 64#define RAND_MAX 0x7fff #endif /* CONTIKI_CONF_H_ */contiki.h 中加入
#include <msp430.h>#define dint() __disable_interrupt() #define eint() __enable_interrupt()cpu文件夾內新建msp430文件夾
將Github下載的contiki/cpu/msp430內如下文件復制進剛建好的msp430文件夾
將Github下載的contiki/cpu/msp430/f1xxx內如下文件復制進剛建好的msp430文件夾
將剛建好的msp430文件夾加入路徑
按下小錘子編譯,此時有這些錯誤
將中斷服務函數修改為CCS的風格:
watchdog.c中
修改前
修改后
rtimer-arch.c中
修改前
修改后
clock.c中:
修改前
修改后
clock.c中此處提到CLOCK_CONF_SECOND需為2的整數冪
到contiki-conf.h中修改后屏蔽掉#error語句
再次編譯,此時僅剩compower.c內有錯誤
將compower.c、compower.h(暫時用不到)刪除后再編譯,此時已經沒有錯誤了
關于時間
因我的開發板未焊上外部晶振,故ACLK時鐘源只能選為內部低頻振蕩器 VLO,其標稱值是 12kHz, 受溫度和供電電壓影響(范圍 4kHz~20kHz)
本移植案例中,Contiki的時基由定時器A0的中斷控制。
本示例中,將TA0的時鐘源設為ACLK,將P1.0復用輸出測得ACLK頻率約為16k:
將rtimer-arch.h中的RTIMER_ARCH_SECOND設為16000U
修改clock.c的條件編譯語句,注釋掉#error語句
多任務示例
兩個任務分別反轉LED1、LED2,它們延時的時間互不相同,LED1為1s,LED2為0.5s。
main.c
#include <msp430.h> #include <sys/process.h> #include <sys/procinit.h> #include <sys/etimer.h> #include <sys/autostart.h> #include <sys/clock.h>unsigned int idle_count = 0;#define Contiki_etimer_DelayMS(MS) \etimer_set(&et, MS/(1000/CLOCK_SECOND)); \PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et))PROCESS(led1_blink_process, "Led1"); AUTOSTART_PROCESSES(&led1_blink_process);PROCESS_THREAD(led1_blink_process, ev, data) {static struct etimer et;PROCESS_BEGIN();while(1){P1OUT |= BIT0; // set P1.0Contiki_etimer_DelayMS(1000);P1OUT &= ~BIT0; // resetContiki_etimer_DelayMS(1000);}PROCESS_END(); }PROCESS(led2_blink_process, "Led2"); AUTOSTART_PROCESSES(&led2_blink_process);PROCESS_THREAD(led2_blink_process, ev, data) {static struct etimer et;PROCESS_BEGIN();while(1){P1OUT |= BIT6; // set P1.6Contiki_etimer_DelayMS(500);P1OUT &= ~BIT6; // resetContiki_etimer_DelayMS(500);}PROCESS_END(); }/*** main.c*/ int main(void) {WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer//16Mhzif (CALBC1_16MHZ==0xFF) // If calibration constant erased{while(1); // do not load, trap CPU!!}DCOCTL = CALDCO_16MHZ; // 調取出廠校準后存儲在Flash中的參數BCSCTL1 = CALBC1_16MHZ; // 將DCO設為16MHzBCSCTL2 |= DIVM_0 | DIVS_0; // MCLK、SMCLK均不分頻BCSCTL3 |= LFXT1S1; // 將ACLK時鐘源設為內部低頻振蕩器, 其標稱值是 12kHz, 受溫度和供電電壓影響(范圍 4kHz~20kHz)// //-----在P1.0上輸出ACLK---- // P1SEL |= BIT0; // P1DIR |= BIT0;//-----在P1.4上輸出SMCLK----P1SEL |= BIT4;P1DIR |= BIT4;P1DIR |= BIT0; // Set P1.0 to output directionP1DIR |= BIT6; // Set P1.6 to output directionclock_init();process_init();process_start(&etimer_process, NULL); // autostart_start(autostart_processes);process_start(&led1_blink_process, NULL);process_start(&led2_blink_process, NULL);while(1){do{} while(process_run() > 0);idle_count++;/* Idle! *//* Stop processor clock *//* asm("wfi"::); */}return 0; }內存使用情況
效果
LED1:理論1s 實測1.097s 誤差9.7%
LED2:理論0.5s 實測0.547s 誤差9.4%
總結
以上是生活随笔為你收集整理的MSP430G2553 移植 Contiki RTOS 实时操作系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强制类型转换问题
- 下一篇: ELman神经网络matlab实现