本帖最后由 笨,小黑 于 2015-2-3 22:36 编辑
! j, x1 a1 E4 R$ W. T) F! V
! ?6 d$ A9 J9 |% Y4 ]拿到 Nucleo 已经一个多月了 因为公司项目的缘故,无法第一时间跟大家分享开发经验,实在抱歉。
; R5 Y! g; g1 D" @1 K# ^% c1 w作为研究生最后 一年的实习生,论文项目两边要兼顾,业余时间变得有点不够用。) E/ W9 `( y$ J% ]* `; @( e& l
论坛里搜索了一下,stm32区只有2篇关于contiki的帖子,关于6lowpan的更是没有4 T3 B5 W8 }# _
这里先给大家简单介绍一下contiki的移植步骤。
. A. F- i; ~# [; o( k3 q/ R4 I, N介绍一下: /****** baidu baike *****/Contiki 是一个适用于有内存的嵌入式系统的开源的、高可移植的、支持网络的多任务操作系统。包括一个多任务核心、TCP/IP 堆栈、程序集以及低能耗的无线通讯堆栈。Contiki 采用 C 语言开发的非常小型的嵌入式操作系统,运行只需要几K的内存。[1]0 @! Q( [$ D+ T; c) @$ z: x
Contiki 是一个小型的,开源的,极易移植的多任务电脑操作系统。它专门设计以适用于一系列的内存受限的网络系统,包括从8位电脑到微型控制器的嵌入系统。它的名字来自于托尔·海尔达尔的康提基号。, U6 p4 f! {5 x' ]. e& r( |
Contiki只需几kilobyte的代码和几百字节的内存就能提供多任务环境和内建TCP/IP支持。 1 ^3 A( W7 o! z, q7 D
2 |( A( }" l6 B+ t S* t4 F
/****** baidu baike *****/
3 R( w$ r$ a/ {# R* J7 U. p% a先确认下移植个什么任务最好,反正新的芯片到我手里,我最喜欢的就是点LED。1秒一闪,简单直观。9 d3 {: d! c, T* o
% x" o( \0 @+ _7 ~Contiki是事件驱动机制的,产生“事件“就是我们需要去做的事情。途径不多:通过时钟定时,定时事件到就产生一个事件;通过某种中断,某个中断发生,就产生某个事件例如外部中断。& t+ }5 n0 B7 F+ }$ H
- /***********% m1 F2 q E' O! k( v' C
- contiki task 3 o1 S |9 [/ z6 z1 }
- ************/
% x$ [ G) `9 g/ k6 h, P - #include "stm32f0xx.h"
& q% }5 S8 w, S5 R2 b, [ - #include <stdint.h>
2 r4 U3 p% b7 H/ _5 W" J( f$ Q - #include <stdio.h>% i" |- j- f; c, O8 b" `
- #include <debug-uart.h>
+ V, W0 F% C0 s# B ^4 H - #include <clock.h>0 ]' b0 Q" v! X7 ~+ T: B n
- #include <sys/process.h>
% v& |+ R0 a+ D/ s3 \( ~ - #include <sys/procinit.h>
# f7 B7 n5 S$ J% y* M' {* C - #include <etimer.h>: }. J A& P( Q, e- L4 s& g. C
- #include <sys/autostart.h>
" O* C' O) q9 o - #include "gpio_common.h"//gpio obj
* l1 P, A9 b: X! X - #ifdef CONFIG_GPIO_STM32F072RB( z7 J; Q, W' [5 a2 d W, q* L
- #include "stm32f072_gpio.h"8 G9 T) h, w" m/ m% C$ m
- #else
+ b1 B4 D$ [( T' f) z0 E* }5 s - void led_init(void){} //空实现/ t3 u7 l4 e# K `8 ^6 ~
- #endif. ]& ]' d0 R. t
1 j9 a2 \; y9 p3 R: F9 q- PROCESS(blink_process, "LED"); //注册任务$ A4 r0 c* `# f6 G, S1 G$ t4 J C& u
- AUTOSTART_PROCESSES(&blink_process);) S! f8 t b) G, W
- //自动启动任务
# J! U( F$ ^8 S - PROCESS_THREAD(blink_process, ev, data)
# v2 H. h7 E) } - //任务线程 ! M1 b( B" p/ t' e0 Q& q5 ^! x
- {
3 i6 ?+ t/ @* f2 C2 \3 ~( C3 K - / K) q) y+ {& y# h4 L
- PROCESS_BEGIN();
0 S/ y2 J8 n) S9 V4 v' r - while(1)
8 a [7 R: J) v6 i( ^$ ^2 w6 y - {
# A6 ?" I; b) E0 u - static struct etimer time_e;
+ m" t, Q. d7 { - etimer_set(&time_e, CLOCK_SECOND);
$ g2 W" e% y3 _0 t - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&time_e));8 e3 A J) O0 I) v) U5 s6 F p
- 6 u; @6 u% n& }- l& R0 i& A- O. B/ G
- GPIO_ResetBits(GPIO_LED_GR,GPIO_Pin_LED);! d! n6 K9 x& m2 ~( y* I
- //led on 1 t+ G0 o% Y ~9 z, \/ ^) G
- etimer_set(&time_e, CLOCK_SECOND);
+ v F0 D1 [0 P% L/ M7 ~ - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&time_e));1 F$ d1 q) @2 H& K
- GPIO_SetBits(GPIO_LED_GR,GPIO_Pin_LED);0 ]8 O: B0 C* J! W, I& {* v
- // led off
0 f r" x% W- S: U5 \1 h -
[+ e( q' t! Y. V, u7 A - }3 }6 z C2 F r6 L! `, {, `
- PROCESS_END();; }, |/ K8 F5 z/ ?- k9 g0 B
- }) U$ C/ ]) _7 s! _/ d; N
- 1 D5 _) E6 R( q2 U- a* }" L
( d) B |, q& P" \( }! Y- int main()1 k8 a3 ^- Y1 x( @. w
- {( h, x% Z! |# Y5 J! `: z4 m1 q
- uart_init(9600);
' f: i& }/ n1 ?+ @9 v- A3 S - led_init();
3 H- J' p7 P. o - printf("led init ok \r\n");
H& P0 x: s' C- R0 h - //顺便可以知道串口是否初始化成功了, d6 S0 D0 R8 w: `" X5 L
- clock_init();; f# c. |6 n$ p: {# M
- process_init();: ]+ c. s( H! C) g+ }
- process_start(&etimer_process, NULL);
6 [1 S: X* R! b6 \* |, W - autostart_start(autostart_processes);
, f; a2 b2 M+ n! M& o - while(1) {" I# \$ S/ p" g7 p0 K
- ;
% H& W( f" q, M+ G+ J - } |2 U: C$ x! D6 W0 g% O
复制代码 5 }% }6 A, D4 |; z1 G5 T
8 k: ~) j3 W- M: c# L5 f8 b6 a( I: k
今天暂时写到这里,思路是搬运的自STM32的移植的。 空了继续写
/ J$ }4 B, S, y; r0 ]
2 X# p+ G: i" Y, Z. i/ L
* U4 x% u: t6 d) w2 P P9 {( z7 ~& r* \
4 C T: h, J8 d/ v9 U$ ]! P; K
|
有时会出现这样的情况。代码太长,可以分几段发,或者放在附件。