MSP430G2553 移植 Contiki RTOS 实时操作系统
目錄
- 新建工程
- 移植過(guò)程
- 關(guān)于時(shí)間
- 多任務(wù)示例
- main.c
- 內(nèi)存使用情況
- 效果
平臺(tái):Code Composer Studio 10.4.0
MSP-EXP430G2 LaunchPad 試驗(yàn)板
MSP430G2553 LaunchPad? Development Kit (MSP?EXP430G2ET)
contiki下載:contiki-os Github
本文參考自二、Contiki移植 —— 一根線
本工程示例
新建工程
移植過(guò)程
新建contiki文件夾
添加core、cpu文件夾
將Github下載的contiki/core內(nèi)如下文件復(fù)制進(jìn)剛建好的core文件夾
dev內(nèi)僅保留watchdog.h
lib內(nèi)僅保留list.c、list.h
把建好的core文件夾加入路徑
core內(nèi)新建contiki-conf.h
其內(nèi)容為
#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文件夾內(nèi)新建msp430文件夾
將Github下載的contiki/cpu/msp430內(nèi)如下文件復(fù)制進(jìn)剛建好的msp430文件夾
將Github下載的contiki/cpu/msp430/f1xxx內(nèi)如下文件復(fù)制進(jìn)剛建好的msp430文件夾
將剛建好的msp430文件夾加入路徑
按下小錘子編譯,此時(shí)有這些錯(cuò)誤
將中斷服務(wù)函數(shù)修改為CCS的風(fēng)格:
watchdog.c中
修改前
修改后
rtimer-arch.c中
修改前
修改后
clock.c中:
修改前
修改后
clock.c中此處提到CLOCK_CONF_SECOND需為2的整數(shù)冪
到contiki-conf.h中修改后屏蔽掉#error語(yǔ)句
再次編譯,此時(shí)僅剩compower.c內(nèi)有錯(cuò)誤
將compower.c、compower.h(暫時(shí)用不到)刪除后再編譯,此時(shí)已經(jīng)沒(méi)有錯(cuò)誤了
關(guān)于時(shí)間
因我的開(kāi)發(fā)板未焊上外部晶振,故ACLK時(shí)鐘源只能選為內(nèi)部低頻振蕩器 VLO,其標(biāo)稱值是 12kHz, 受溫度和供電電壓影響(范圍 4kHz~20kHz)
本移植案例中,Contiki的時(shí)基由定時(shí)器A0的中斷控制。
本示例中,將TA0的時(shí)鐘源設(shè)為ACLK,將P1.0復(fù)用輸出測(cè)得ACLK頻率約為16k:
將rtimer-arch.h中的RTIMER_ARCH_SECOND設(shè)為16000U
修改clock.c的條件編譯語(yǔ)句,注釋掉#error語(yǔ)句
多任務(wù)示例
兩個(gè)任務(wù)分別反轉(zhuǎn)LED1、LED2,它們延時(shí)的時(shí)間互不相同,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; // 調(diào)取出廠校準(zhǔn)后存儲(chǔ)在Flash中的參數(shù)BCSCTL1 = CALBC1_16MHZ; // 將DCO設(shè)為16MHzBCSCTL2 |= DIVM_0 | DIVS_0; // MCLK、SMCLK均不分頻BCSCTL3 |= LFXT1S1; // 將ACLK時(shí)鐘源設(shè)為內(nèi)部低頻振蕩器, 其標(biāo)稱值是 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; }內(nèi)存使用情況
效果
LED1:理論1s 實(shí)測(cè)1.097s 誤差9.7%
LED2:理論0.5s 實(shí)測(cè)0.547s 誤差9.4%
總結(jié)
以上是生活随笔為你收集整理的MSP430G2553 移植 Contiki RTOS 实时操作系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 强制类型转换问题
- 下一篇: java信息管理系统总结_java实现科