关于contiki系统到STM32的移植

关于contiki系统到STM32的移植,第1张

关于contiki系统到STM32的移植, 关于contiki系统到STM32的移植,第2张

1.conTIki简介

“ConTIki是一个小型的,开源的,极易移植的多任务 *** 作系统。它专门设计以适用于一系列的内存优先的网络系统,包括从8位电脑到微型控制器的嵌入系统。它的名字来自于托尔·海尔达尔的康提基号。ConTIki只需几kilobyte的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。

2.移植前的准备

首先建立一个最简单工程。一个最简单的任务莫过于LED闪烁了,从学习51单片机开始,到AVR,到ARM,从移植uCOS到移植conTIki。LED闪烁无疑是最棒的任务。假设这个任务就是LED点亮1秒,然后LED熄灭1秒。Contiki的采用事件驱动机制,那么如何才能够产生“事件“呢。答案只有两个:第一,通过时钟定时,定时事件到就产生一个事件;第二,通过某种中断,某个中断发生,就产生某个事件例如外部中断。那么移植contiki到底要做哪些工作呢。先来回顾一下uCOS在STM32移植,uCOS的移植也就是做了两件事情,第一,在PendSV这个异常中断中,保存上下文;第二,使用systick提供系统时钟。由于contiki是非抢占的 *** 作系统,所以移植时并不需要PendSV中保存上下文。那么时钟一定是必要的,移植contiki的移植重点就应该在systick上。

先上全部的代码,给大家一个整体的印象。

#include "stm32f10x.h"  

#include <stdint.h>  

#include <stdio.h>  

#include <debug-uart.h>  

#include <clock.h>  

#include <sys/process.h>  

#include <sys/procinit.h>  

#include <etimer.h>  

#include <sys/autostart.h>  

unsigned int idle_count = 0;  

void led_init();  

   

PROCESS(blink_process, "Blink");  

AUTOSTART_PROCESSES(&blink_process);  

PROCESS_THREAD(blink_process, ev, data)  

{  

  PROCESS_BEGIN();  

  while(1)  

 {  

   static structetimer et;  

   etimer_set(&et, CLOCK_SECOND);  

   PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));  

   //打开LED  

   GPIO_ResetBits(GPIOC,GPIO_Pin_6);  

   printf("LEDON\r\n");  

   etimer_set(&et, CLOCK_SECOND);  

   PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));  

   //关闭LED  

   GPIO_SetBits(GPIOC,GPIO_Pin_6);  

   printf("LEDOFF\r\n");  

 }  

  PROCESS_END();  

}  

   

int main()  

{  

  dbg_setup_uart();  

  led_init();  

  printf("Initialising\r\n");  

  clock_init();  

  process_init();  

  process_start(&etimer_process,NULL);  

  autostart_start(autostart_processes);  

  //process_start(&blink_process,NULL);  

  printf("Processesrunning\r\n");  

  while(1) {  

   do  

   {  

   }  

   while(process_run()> 0);  

   idle_count++;  

   /* Idle! */  

   /* Stop processor clock */  

   /* asm("wfi"::); */  

 }  

  return 0;  

}  

void led_init()  

{  

  GPIO_InitTypeDef GPIO_InitStructure;  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  

  //PC6 推挽输出  

  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6;  

  GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;  

  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;  

  GPIO_Init(GPIOC,&GPIO_InitStructure);  

}  

3.寻找一些线索

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2590405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存