日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

MSP430G2553 移植 Contiki RTOS 实时操作系统

發(fā)布時(shí)間:2023/12/9 windows 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSP430G2553 移植 Contiki RTOS 实时操作系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 新建工程
  • 移植過(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:

//-----在P1.0上輸出ACLK----P1SEL |= BIT0;P1DIR |= BIT0;


rtimer-arch.h中的RTIMER_ARCH_SECOND設(shè)為16000U

修改clock.c的條件編譯語(yǔ)句,注釋掉#error語(yǔ)句

void clock_init(void) {dint();/* Select SMCLK (2.4576MHz), clear TAR *//* TACTL = TASSEL1 | TACLR | ID_3; *//* Select ACLK 32768Hz clock, divide by 2 *//* TACTL = TASSEL0 | TACLR | ID_1;*//* Select ACLK 32768Hz clock *//* TACTL = TASSEL0 | TACLR; */#if INTERVAL==32768/CLOCK_SECONDTACTL = TASSEL0 | TACLR; #elif INTERVAL==16384/CLOCK_SECONDTACTL = TASSEL0 | TACLR | ID_1; #elseTACTL = TASSEL_1 | TACLR | ID_0; //TA0時(shí)鐘源設(shè)為ACLK,不分頻TACCR0 = RTIMER_ARCH_SECOND; //#error NEED TO UPDATE clock.c to match interval! #endif/* Initialize ccr1 to create the X ms interval. *//* CCR1 interrupt enabled, interrupt occurs when timer equals CCR. */TACCTL1 = CCIE;/* Interrupt after X ms. */TACCR1 = INTERVAL;/* Start Timer_A in continuous mode. */TACTL |= MC1;count = 0;/* Enable interrupts. */eint();}

多任務(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。