IoT_Board笔记2:LED闪烁例程_通用GPIO设备

2018-12-27 10:05 [复制链接] 1 136

参考内容:通用GPIO设备应用笔记
问题:#define LED_PIN             PIN_LED_R   io口是如何一一对应起来的。
在drv_gpio.c文件中 列出了100个引脚的对应关系还有中断的相关关系。

; U/ U& B! n7 v% |- X
  1. static const struct pin_index pins[] =( X* |# ~$ a- c7 M- A
  2. {6 ]1 }/ @  \5 Y; w3 h1 @1 Q( a
  3.    __STM32_PIN_DEFAULT,; K  F4 |# M4 A) F( X
  4.    __STM32_PIN(1, E, 2),       // PE2:  SAI1_MCLK_A  --> ES8388: S/ M2 T' v, j4 r( i9 R
  5.    __STM32_PIN(2, E, 3),       // PE3:  SAI1_SD_B    --> ES8388* I9 F6 h! |0 u. t: v+ `
  6.    __STM32_PIN(3, E, 4),       // PE4:  SAI1_FS_A    --> ES8388
    3 K: ~$ t8 v2 j! g/ s& a
  7.    __STM32_PIN(4, E, 5),       // PE5:  SAI1_SCK_A   --> ES8388
    ' N" z# N0 t" U7 }4 h) e2 P
  8.    __STM32_PIN(5, E, 6),       // PE6:  SAI1_SD_A    --> ES8388
    0 I3 a9 O! w3 P. g  r. [# f
  9.    __STM32_PIN_DEFAULT,        //     : VBAT
    ( N2 U; ]4 d4 N
  10.    __STM32_PIN(7, C, 13),      //PC13:  SD_CS        --> SD_CARD
    $ C. I4 K$ i- E( h
  11.    __STM32_PIN(8, C, 14),      //PC14:  OSC32_IN% ?1 `0 w; f0 B! M# A$ l
  12.    __STM32_PIN(9, C, 15),      //PC15:  OSC32_OUT
    + H" E3 g+ S) U/ P
  13.    __STM32_PIN_DEFAULT,       //     :  VSS/ Z" L$ b: J2 |- s! T7 R+ D
  14.    __STM32_PIN_DEFAULT,        //    :  VDD
    / F, _- c# b  r: S6 F
  15.    __STM32_PIN_DEFAULT,        // PH0:  OSC_IN: x1 E2 {6 e. ]1 ]  H
  16.    __STM32_PIN_DEFAULT,        // PH1:  OSC_OUT
    . F% Q, B4 C: `: ]4 z+ I
  17.    __STM32_PIN_DEFAULT,       //     :  RESET
    : m# s- T4 T& T0 }
  18.    __STM32_PIN(15, C, 0),      // PC0:  I2C_SCL      --> ES83886 f( h3 G& R5 ]( q7 H
  19.    __STM32_PIN(16, C, 1),      // PC1:  I2C_SDA      --> ES8388
    - c' \  v% {: k1 u. T* i' k. e& \, p
  20.    __STM32_PIN(17, C, 2),      // PC2:  GBC_LED      --> ATK MODULE
    4 u/ r3 _: m( L6 ~, \
  21.    __STM32_PIN(18, C, 3),      // PC3:  GBC_KEY      --> ATK MODULE$ m# O- c5 D  O$ X" c5 @
  22.    __STM32_PIN_DEFAULT,       //     :  VSSA
    6 I4 ?  W) f6 G4 E
  23.    __STM32_PIN_DEFAULT,        //    :  VREF-- }( ~$ J6 \( W  b) H: ]
  24.    __STM32_PIN_DEFAULT,       //     :  VREF+3 v7 {. Z) j1 @
  25.    __STM32_PIN_DEFAULT,       //     :  VDDA
      z) f4 o2 e; I2 y
  26.    __STM32_PIN(23, A, 0),      // PA0:  MOTOR_A      --> MOTOR$ `6 |+ _, _7 M9 s
  27.    __STM32_PIN(24, A, 1),      // PA1:  MOTOR_B      --> MOTOR
    ! l. v8 K& w& m1 M
  28.    __STM32_PIN(25, A, 2),      // PA2:  UART2_TX     --> EXTERNAL MODULE
    " K$ P; P2 k# X' H/ j5 _7 e
  29.    __STM32_PIN(26, A, 3),      // PA3:  UART2_RX     --> EXTERNAL MODULE
    ) v$ l4 _$ q3 m; H5 u
  30.    __STM32_PIN_DEFAULT,       //     :  VSS
    1 Z7 k$ k' W2 j, G3 D
  31.    __STM32_PIN_DEFAULT,       //     :  VDD0 w1 ^2 j& c& S% w: j
  32.    __STM32_PIN(29, A, 4),      // PA4:  ADC12_IN9    --> EXTERNAL MODULE/ B1 u/ C9 Z, }/ q
  33.    __STM32_PIN(30, A, 5),      // PA5:  SPI1_SCK     --> SD_CARD8 o4 Z1 a8 p0 i( \; s/ t% k2 M
  34.    __STM32_PIN(31, A, 6),      // PA6:  SPI1_MISO    --> SD_CARD
    6 }" |, z1 ~( c" z- v, K
  35.    __STM32_PIN(32, A, 7),      // PA7:  SPI1_MOSI    --> SD_CARD
    % B! Q, ?' r) I+ a) A+ g6 Y
  36.    __STM32_PIN(33, C, 4),      // PC4:  GBC_RX       --> ATK MODULE
    % b" A0 v- |8 e8 M- I
  37.    __STM32_PIN(34, C, 5),      // PC5:  WIFI_INT     --> WIFI
    ! b% u0 U' f9 ^2 T# b
  38.    __STM32_PIN(35, B, 0),      // PB0:  EMISSION     --> INFRARED EMISSION
    3 m, v2 D0 ?& j
  39.    __STM32_PIN(36, B, 1),      // PB1:  RECEPTION    --> INFRARED EMISSION6 F" L2 v- C  o3 ?" }; p! w4 u
  40.    __STM32_PIN(37, B, 2),      // PB2:  BEEP         --> BEEP
    - b! v, c: m* \8 M
  41.    __STM32_PIN(38, E, 7),      // PE7:  LED_R        --> LED/ E( U! G: s! ]: L4 ]- V
  42.    __STM32_PIN(39, E, 8),      // PE8:  LED_G        --> LED
    4 J+ U! |' b  A1 A, k! O6 s9 h
  43.    __STM32_PIN(40, E, 9),      // PE9:  LED_B        --> LED
    ' H: K) |  D$ w, ^7 l
  44.    __STM32_PIN(41, E, 10),     //PE10:  QSPI_BK1_CLK --> SPI_FLASH
    6 z# m. n8 u% M- X2 k- [# l2 _
  45.    __STM32_PIN(42, E, 11),     //PE11:  QSPI_BK1_NCS --> SPI_FLASH
    9 Y2 X/ P4 B% ], I% \, D( L) ~$ z* u
  46.    __STM32_PIN(43, E, 12),     //PE12:  QSPI_BK1_IO0 --> SPI_FLASH. {6 @6 b$ g5 R8 ^% {  U
  47.    __STM32_PIN(44, E, 13),     //PE13:  QSPI_BK1_IO1 --> SPI_FLASH
    $ B) ?* v6 W9 t& m  \
  48.    __STM32_PIN(45, E, 14),     //PE14:  QSPI_BK1_IO2 --> SPI_FLASH; L( s3 W6 A1 N9 [* j
  49.    __STM32_PIN(46, E, 15),     //PE15:  QSPI_BK1_IO3 --> SPI_FLASH
    9 ~; _$ x+ n8 R! }1 U
  50.    __STM32_PIN(47, B, 10),     //PB10:  AP_INT       --> ALS&PS SENSOR
    0 |  ^9 l  {5 ]; {$ T2 x' }5 x3 i
  51.    __STM32_PIN(48, B, 11),     //PB11:  ICM_INT      --> AXIS SENSOR; a+ G2 M1 f+ l
  52.    __STM32_PIN_DEFAULT,       //     :  VSS7 R1 o0 J$ o1 r6 S% z
  53.    __STM32_PIN_DEFAULT,       //     :  VDD
    ) m$ o) K/ }1 ^% }4 f8 l  K1 D
  54.    __STM32_PIN(51, B, 12),     //PB12:  SPI2_CS      --> EXTERNAL MODULE% X  ^, Y1 L  N
  55.    __STM32_PIN(52, B, 13),     //PB13:  SPI2_SCK     --> EXTERNAL MODULE
    & T$ K# J( a2 h. ~- A% p% T
  56.    __STM32_PIN(53, B, 14),     //PB14:  SPI2_MISO    --> EXTERNAL MODULE8 q. I4 _$ P/ f% Q! ]. N" o
  57.    __STM32_PIN(54, B, 15),     //PB15:  SPI2_MOSI    --> EXTERNAL MODULE
    ! D3 N8 K0 n) ?* y7 y
  58.    __STM32_PIN(55, D, 8),      // PD8:  KEY0         --> KEY
    7 X+ W9 ~7 B; ]& v) g
  59.    __STM32_PIN(56, D, 9),      // PD9:  KEY1         --> KEY9 v; G. q: W/ e4 W! v
  60.    __STM32_PIN(57, D, 10),     //PD10:  KEY2         --> KEY
    4 ?9 T- H6 J4 T& S
  61.    __STM32_PIN(58, D, 11),     //PD11:  WK_UP        --> KEY0 Q: Q3 H6 ^* Z+ ^' @/ K6 I
  62.    __STM32_PIN(59, D, 12),     //PD12:  IO_PD12      --> EXTERNAL MODULEL0 Z- \0 e' E+ D+ D% U8 E
  63.    __STM32_PIN(60, D, 13),     //PD13:  IO_PD13      --> EXTERNAL MODULE
    ; W! q3 P- p1 o4 R- G$ M: |8 |  y7 N0 n8 C
  64.    __STM32_PIN(61, D, 14),     //PD14:  IO_PD14      --> EXTERNAL MODULE+ b7 `- S9 k( {9 `
  65.    __STM32_PIN(62, D, 15),     //PD15:  IO_PD15      --> EXTERNAL MODULE0 c9 K( d3 S# t) o
  66.    __STM32_PIN(63, C, 6),      // PC6:  TIM3_CH1     --> EXTERNAL MODULE  ^6 S5 y( t8 f, c, J" N  Q
  67.    __STM32_PIN(64, C, 7),      // PC7:  TIM3_CH2     --> EXTERNAL MODULE
    , t' y% e& ?3 g+ x4 L
  68.    __STM32_PIN(65, C, 8),      // PC8:  SDIO_D0      --> WIFI. C0 ]- E" a8 C: D1 L5 U
  69.    __STM32_PIN(66, C, 9),      // PC9:  SDIO_D1      --> WIFI( I/ k/ I+ Q4 J  i
  70.    __STM32_PIN(67, A, 8),      // PA8:  IO_PA8       --> EXTERNAL MODULE
      v, N& {! f# R5 Z
  71.    __STM32_PIN(68, A, 9),      // PA9:  UART1_TX     --> STLINK_RX
    . {! d: \8 g7 o. f
  72.    __STM32_PIN(69, A, 10),     //PA10:  UART1_RX     --> STLINK_RX  x9 z. H6 j* ~
  73.     __STM32_PIN(70,A, 11),     // PA11:  USB_D-      --> USB OTG && EXTERNAL MODULE" U  z3 ^9 F$ U6 |$ g
  74.    __STM32_PIN(71, A, 12),     //PA12:  USB_D+       --> USB OTG && EXTERNALMODULE. s5 l. C, Q+ i8 F- T
  75.    __STM32_PIN(72, A, 13),     //PA13:  T_JTMS       --> STLINK# m6 |: V/ D( C3 c
  76.    __STM32_PIN_DEFAULT,       //     :  VDDUSB+ e8 Z5 Q; f% k& }
  77.    __STM32_PIN_DEFAULT,       //     :  VSS
    - \5 m5 c3 Q$ r# O. t
  78.    __STM32_PIN_DEFAULT,       //     :  VDD
    ; O& T& y8 T+ E1 l) ]' S
  79.    __STM32_PIN(76, A, 14),     //PA14:  T_JTCK       --> STLINK
    ; O' n2 ^& t# d+ u7 S/ Y! C
  80.    __STM32_PIN(77, A, 15),     //PA15:  AUDIO_PWR    --> AUDIO && POWER
    - A- ]9 k, D1 _$ D6 t0 i
  81.    __STM32_PIN(78, C, 10),     //PC10:  SDIO_D2      --> WIFI: }' Y7 L" h; T% I- ]
  82.    __STM32_PIN(79, C, 11),     //PC11:  SDIO_D3      --> WIFI
    5 k3 L7 c# @( P- q" ~
  83.    __STM32_PIN(80, C, 12),     //PC12:  SDIO_CLK     --> WIFI
    ) r4 h/ D/ I6 G' E6 [
  84.    __STM32_PIN(81, D, 0),      //# ]; w, d# Q; ]3 `3 I
  85.    __STM32_PIN(82, D, 1),      // PD1:  WIFI_REG_ON  --> WIFI/ D: |: j! [" q7 m, ?3 r: t6 F
  86.    __STM32_PIN(83, D, 2),      // PD2:  SDIO_CMD     --> WIFI
    " |) f& _+ j# @4 `5 d- R: ~' v
  87.    __STM32_PIN(84, D, 3),      // PD3:  IO_PD3       --> EXTERNAL MODULE
    / @" x) G/ x% K% I7 o
  88.    __STM32_PIN(85, D, 4),      // PD4:  NRF_IRQ      --> WIRELESS
    . d  W5 W& w! O
  89.    __STM32_PIN(86, D, 5),      // PD5:  NRF_CE       --> WIRELESS- m" c# f( U3 p% q/ u% |% ~
  90.    __STM32_PIN(87, D, 6),      // PD6:  NRF_CS       --> WIRELESS
    % Z) \- w7 p9 u2 }. a
  91.    __STM32_PIN(88, D, 7),      // PD7:  LCD_CS       --> LCD
    " k: R8 ^5 c" ?. i) k2 z1 |
  92.    __STM32_PIN(89, B, 3),      // PB3:  LCD_SPI_SCK  --> LCD5 |: y; _+ s% {; j/ a  F
  93.    __STM32_PIN(90, B, 4),      // PB4:  LCD_WR       --> LCD$ M4 X5 L. ?- P* m
  94.    __STM32_PIN(91, B, 5),      // PB5:  LCD_SPI_SDA  --> LCD. c* i3 `! p0 |; x
  95.    __STM32_PIN(92, B, 6),      // PB6:  LCD_RESET    --> LCD" M# X. W) V+ B3 }
  96.    __STM32_PIN(93, B, 7),      // PB7:  LCD_PWR      --> LCD
    ' w# l. o5 S* i  w2 g( n/ g- C2 _
  97.     __STM32_PIN_DEFAULT,        //    :  BOOT0
    9 u  I6 ?# A0 L
  98.    __STM32_PIN(95, B, 8),      // PB8:  I2C1_SCL     --> EXTERNAL MODULE
      N) P  E! p9 q/ R+ |
  99.    __STM32_PIN(96, B, 9),      // PB9:  I2C1_SDA     --> EXTERNAL MODULE; ^0 ~9 \% l9 Y$ `
  100.    __STM32_PIN(97, E, 0),      // PE0:  IO_PE0       --> EXTERNAL MODULE
    2 T* a' W: s2 X- I% l
  101.    __STM32_PIN(98, E, 1),      // PE1:  IO_PE1       --> EXTERNAL MODULE
    9 V% d% t! ~( b0 S- d( Q
  102.    __STM32_PIN_DEFAULT,       //     :  VSS
    . d7 t+ ~, V# m  A* b2 v
  103.    __STM32_PIN_DEFAULT,       //     :  VDD
    - a/ Q7 M/ [/ ?0 ]; V( y( U+ }7 A. j1 e" q
  104. };
复制代码

- T  d6 p6 ~* d8 U9 B  m
注册初始化
, [+ j/ d3 h9 N' i" }2 l
  1. int rt_hw_pin_init(void)- |, m' y; x6 s5 a5 M# v! n! A
  2. {) O, a, \, }6 q; a2 P5 R
  3.    return rt_device_pin_register("pin", &_stm32_pin_ops,RT_NULL);4 o/ X% u& {- Z+ N1 r; q9 m( O
  4. }0 H+ L9 A3 C, s) `5 m) H
  5. const static struct rt_pin_ops_stm32_pin_ops =+ H' b1 W+ ^' P" k$ H: b3 \
  6. {9 B6 T% L6 h- g4 w8 I8 N
  7.    stm32_pin_mode,
      ^4 J7 D$ a1 e# m
  8.    stm32_pin_write,
    3 o. R! M0 |" S5 t  i" `
  9.    stm32_pin_read,$ }9 @+ @; e+ X: E! M& X! }
  10.    stm32_pin_attach_irq,
    + B; k3 n' ^/ B9 X  o8 V/ k& N7 W6 n
  11.    stm32_pin_dettach_irq,
    : j8 W, j  P  M8 G* z3 P% Y
  12.    stm32_pin_irq_enable,
    8 H0 _) m5 c0 T: Q: ~8 |- D4 ^
  13. };
复制代码

# x" t! V: O  t3 t
  v, z6 D  ]7 q% l6 O9 c; s+ aIO设备管理框架与通用GPIO设备的联系% i) R' v! Q! s) w& g
RT-Thread 提供了一套简单的I/O 设备管理框架,它把 I/O 设备分成了三层进行处理:应用层、I/O 设备管理层、硬件驱动层。应用程序通过 RT-Thread 的设备操作接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。RT-Thread 提供给上层应用的是一个抽象的设备操作接口,给下层设备提供的是底层驱动框架。对于通用 GPIO 设备,应用程序既可以通过设备操作接口访问,又可以直接通过通用 GPIO 设备驱动来访问。一般来说,我们都是使用第二种方式。那么如何在 RT-Thread 中使用通用 GPIO 设备驱动从而操作 GPIO 呢?
RT-Thread 自动初始化功能依次调用 rt_hw_pin_init ===> rt_device_pin_register ===>rt_device_register 完成了 GPIO 硬件初始化。rt_device_register 注册设备类型为RT_Device_Class_Miscellaneous,即杂类设备,从而我们就可以使用统一的 API 操作 GPIO。
1.png & ~2 z  u& U' b3 j  W
程序运行流程怎么一步一步开始的?
在rtconfig.h中 配置使用PIN设备。

: o1 C' V9 |8 l( Q2 Q$ U+ q
  1. /* Kernel Device Object */
    + Y8 f! U; S& S6 e8 }) {- k0 Z
  2. #define RT_USING_DEVICE
    : z9 T5 N; y& q+ I% {
  3. #define RT_USING_CONSOLE" Y" c4 u, g2 J
  4. #define RT_CONSOLEBUF_SIZE 256
    ' b( _' s  e' I6 v( R
  5. #define RT_CONSOLE_DEVICE_NAME"uart1"
      ?) Z5 S2 g' g+ Q
  6. /* RT-Thread Components */9 f: t, ^6 g) Y0 H; H7 B$ k
  7. #define RT_USING_COMPONENTS_INIT9 m3 e4 |0 I. e
  8. #define RT_USING_USER_MAIN           启动方式之一
    8 z0 s0 I" k" K1 u' W( B2 v
  9. #define RT_MAIN_THREAD_STACK_SIZE 2048
    2 I- O% g" b/ Y
  10. #define RT_MAIN_THREAD_PRIORITY 10
    ! ^* U$ n0 L: U1 z. x$ c
  11. /* Device Drivers */3 t2 `* |! m) @# l, w, Q- x
  12. #define RT_USING_DEVICE_IPC, E3 }4 Z# U, r  c
  13. #define RT_PIPE_BUFSZ 512
    ! g5 i% z2 M& K7 b
  14. #define RT_USING_SERIAL
    4 p; _+ n/ B  T3 d  Z3 [+ p
  15. #define RT_USING_PIN
复制代码
2 Z$ A+ X8 d8 }2 r8 @
都在components.c中,
从startup_stm32l475xx.s 启动文件中开始。
- B6 [: [1 D; v' ~5 ]& d
  1. ; Reset handler
    . n0 T0 H: z1 Q' @8 C) n7 I1 z
  2. Reset_Handler    PROC0 [0 C' y1 X- Q. B
  3.                  EXPORT  Reset_Handler             [WEAK]
    . y( L# X  ^5 w% M0 T! U
  4.        IMPORT  SystemInit   //系统初始化,时钟相关等( p: z# m6 Y- b! U& @% x
  5.        IMPORT  __main
    ' x: l( D" w* R% J9 c- |
  6.                  LDR     R0, =SystemInit
    ! R& G, `% l! h" P5 A
  7.                  BLX     R0' `. q* S  y4 h. {2 B+ Q
  8.                  LDR     R0, =__main
    3 E0 e# x- k# X" b0 x
  9.                  BX      R0
    $ u/ B, ?3 R' I3 j- y& V  k
  10.                  ENDP! `6 x- F' P9 N# z3 D
  11. ; Dummy Exception Handlers (infinite loopswhich can be modified)
复制代码
3 q7 w7 F0 b) W/ R# p* R
由于rtconfig.h配置宏RT_USING_USER_MAIN,表明通过组件的方式跳到main函数,不过此时过程是,先重新定义main函数int $Sub$$main(void),代码先跳到int$Sub$$main(void)执行,
  v; `7 Y& v6 ?% X6 F- b调用rt_application_init();创建main线程,在main线程中调用main函数
详见:components.c中:
; H7 B! w; P" B. `  c! o
  1. #if defined(__CC_ARM) ||defined(__CLANG_ARM)
    9 F" L& u1 c7 Z2 d6 f  @8 `
  2. extern int $Super$main(void);4 [% v; G( ?. K5 ~% T
  3. /* re-define main function */1 M; W( {0 F& E3 k' Z0 a$ s
  4. int $Sub$main(void)9 Y8 D- R) s' o+ G: [) C
  5. {
    1 Y% a$ d( c$ p, Y
  6.    rt_hw_interrupt_disable();
    ) |% F# _9 U6 `5 G
  7.    rtthread_startup();//启动rtos.
    6 r$ B* I6 h  I' V" E# {
  8.    return 0;
    - r9 L0 l- ]4 L
  9. }* P# s, e* Q% Y0 P) {# S
  10. int rtthread_startup(void)9 v7 X9 i: ~0 Y- l- J
  11. {
    / ?1 ~9 z/ ^) H. z
  12.    rt_hw_interrupt_disable();- P' I$ \7 ]7 e+ q5 M
  13.    /* board level initialization
    9 @+ [8 L2 t( @) ^4 o0 L+ c
  14.     * NOTE: please initialize heap inside board initialization.  H3 C0 P' k, _3 `2 o1 I5 K
  15.     */
    4 k% g" F) L) @' ~9 t3 A# v, Q
  16.     rt_hw_board_init();//这里会进行rt_hw_pin_init()stm32_hw_usart_init();注册IO 串口设备: t2 m( P: r; a/ Q4 h+ |
  17.    /* show RT-Thread version */3 G: a9 c0 v9 S
  18.    rt_show_version();( b6 K$ v$ ]& j1 M
  19.    /* timer system initialization */
    - I( K3 }1 l% a; F: o, S+ f5 z# m
  20.    rt_system_timer_init();
    8 t" y$ i$ l0 q+ s- a; i+ _9 E
  21.    /* scheduler system initialization */
    . ~0 G1 N: ~# d, U
  22.    rt_system_scheduler_init();$ C. e( v) h! z3 I, O
  23. #ifdef RT_USING_SIGNALS# n& p4 D' \$ Z: W/ V% H
  24.    /* signal system initialization */! z0 l- E. C& \# j0 v
  25.    rt_system_signal_init();0 `1 i0 j9 S! w; o) ^; S! }$ P
  26. #endif  P# {* Q/ V3 ?* }
  27.    /* create init_thread */0 V, k* @" {: i' A
  28.     rt_application_init();//在这里创建main.c 的入口函数。
    6 L" @- ]' C3 y& Q# t
  29.    /* timer thread initialization */
    6 i# V6 F6 a4 A% J* \6 Q
  30.    rt_system_timer_thread_init();
    6 P8 ^6 t  X  M
  31.    /* idle thread initialization */
    8 N8 @" b1 A/ \2 l7 O( i9 l, J  e
  32.    rt_thread_idle_init();
    9 h. ?( K/ q: `' O# R" ^1 C
  33. #ifdef RT_USING_SMP1 L0 a1 e( B  Z+ i( ?* }
  34.    rt_hw_spin_lock(&_cpus_lock);
    % A& p$ D8 q; q" f8 F
  35. #endif /*RT_USING_SMP*/) }" y+ [) J: T
  36.    /* start scheduler */2 R) P/ Z# d0 ^: ?0 b1 b& |
  37.    rt_system_scheduler_start();  l- Y8 `* h1 ^" f: r
  38.    /* never reach here */
    9 k! p& _" r( g9 x& A4 l
  39.    return 0;
    - F' [: O  T+ p1 n8 k# ?  p5 ?
  40. }
      O: |/ {2 u1 P9 L5 p9 \
  41. void rt_application_init(void)! l' ~% C& n( x/ u6 K
  42. {
    0 P6 P# d* I4 P- X; _
  43.    rt_thread_t tid;' a- N, ~# V$ b, K
  44. #ifdef RT_USING_HEAP% L; T2 q0 b# r8 ~1 d
  45.    tid = rt_thread_create("main", main_thread_entry, RT_NULL,5 D5 \8 W# C7 x" [6 T# Q2 T6 r* _+ X
  46.                           RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
    # D" j, |2 ^( B% b5 w  A
  47.    RT_ASSERT(tid != RT_NULL);
    # P. K! q  e, \3 ^3 D) r
  48. #else8 j& r: o, K! E
  49.    rt_err_t result;2 o$ O- i' Y) \  Z
  50.    tid = &main_thread;
    / M4 z: L3 C: m% T" H/ T& ~
  51.    result = rt_thread_init(tid, "main", main_thread_entry,RT_NULL,$ P* [3 x* O$ L* y6 k, }3 m
  52.                            main_stack,sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);
    ) \% n! b( r9 ^1 Y
  53.    RT_ASSERT(result == RT_EOK);
    1 u2 n3 Y% Q, \# d; r9 ?& B- B
  54.       
    / Q. w& r/ J/ Y. x$ ]# o7 d$ ^) ?
  55.    /* if not define RT_USING_HEAP, using to eliminate the warning */
    5 h' ]3 A; Y# z) x6 t& H* q4 F& I0 O
  56.    (void)result;
    5 R; W9 N" \5 F
  57. #endif$ ~- n4 ]; V* d+ H. c  m1 k1 v: K
  58.     rt_thread_startup(tid);//启动这个线程。* B$ }8 g7 J( \% I7 Y4 w( o
  59. }
    8 A  T! O3 H) x2 a) v
  60. /* the system main thread */1 j- ]- m- E; E) {( G
  61. void main_thread_entry(void *parameter)
    8 {& {" h' F8 ~1 p  B: q6 {7 c3 P
  62. {/ e; ?8 p  N( {9 j( }
  63.    extern int main(void);
    ; T8 e$ R9 Y2 _
  64.    extern int $Super$main(void);; {6 ]1 ~2 }; d
  65.    /* RT-Thread components initialization */
      n& b/ ^1 V6 }. a
  66.     rt_components_init();//组件初始化,这个例程暂时没用到。. r  I" x/ s5 m
  67. #ifdef RT_USING_SMP2 E$ u4 V% V) p2 n! C
  68.    rt_hw_secondary_cpu_up();) l9 B5 |8 N  T6 x9 M) M
  69. #endif8 C1 [9 Z6 L, [& J5 ]! u
  70.    /* invoke system main function */
    0 q8 y# s) ^$ I5 G: ]
  71. #if defined(__CC_ARM) ||defined(__CLANG_ARM)3 q7 N5 g+ E! K
  72.     $Super$main(); /* for ARMCC. */转到main.c中
    8 M0 b8 L- e& k3 @
  73. #elif defined(__ICCARM__) ||defined(__GNUC__)  B* c( p6 a) M( b5 j5 B8 Z" Q& Z
  74.    main();5 R& O5 G3 Q# @7 D+ s! u4 h
  75. #endif
    ) j6 y$ }$ w3 i: ]. D& s
  76. }
复制代码

: d6 b# N3 r- P0 b" a+ f
由于定义#define RT_USING_COMPONENTS_INIT

/ X9 ^* j$ j  z* T
  1. /*5 P" r( p: K5 C+ f! y
  2. *Components Initialization will initialize some driver and components asfollowing8 i/ W1 y9 b2 k4 e4 z5 f* P! ^
  3. *order:' e( C! D; S- m$ v0 j
  4. *rti_start         --> 0
    * T6 U0 \7 n# o! _* G2 d5 a
  5. *BOARD_EXPORT      --> 1
    + U, S9 |+ N! V  @8 l! i
  6. *rti_board_end     --> 1.end
    . ?" ~0 J/ [5 O4 h( Z
  7. *
    , w+ }8 _9 j( V2 [2 _, e
  8. *DEVICE_EXPORT     --> 2. u$ w1 b. i. R& [. O6 S+ K
  9. *COMPONENT_EXPORT  --> 3( l3 z: g! K6 M) s% u
  10. *FS_EXPORT         --> 4' j! {5 L* {* f& ^8 O9 F: j
  11. *ENV_EXPORT        --> 5' H* E) n1 [; N3 ^
  12. *APP_EXPORT        --> 69 p5 l# l, F5 J5 b" G
  13. *
      w2 c. X# p9 |9 w0 L; t
  14. *rti_end           --> 6.end4 ?5 h# A! t0 V! j9 `9 ?" [
  15. *
    0 E" j$ i% c5 X
  16. *These automatically initialization, the driver or component initial functionmust' L9 j2 F) _# B1 T6 I  n
  17. * bedefined with:3 j- O- T* O" i  I2 Z
  18. *INIT_BOARD_EXPORT(fn);' J8 v7 u" y. {' w1 I2 g" G, {
  19. * INIT_DEVICE_EXPORT(fn);3 T* C% V, c( Z+ m! n0 U
  20. *...
    . Y: \9 z1 s) H' P8 u- s0 l
  21. *INIT_APP_EXPORT(fn);) M* Q9 R1 Q9 H2 w& x9 z9 F! X
  22. *etc.; O# Y  Z1 e/ B, w' z# p- `; w  y
  23. */
    , \6 w) @# Q& ^0 v$ w
  24. int main(void)$ i% B* j5 ~- P/ I# x' k, ?
  25. {* G6 F3 c* y' v* q0 G3 v
  26.    unsigned int count = 1;, i: _8 T( u3 M; e9 N4 V( e9 O
  27.    /* set LED pin mode to output */
    9 M: ]) t' V7 k: h2 L
  28.    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);! k9 K8 q) c( P& M
  29.    while (count > 0)
    7 x$ i2 M3 z. ~. j
  30.     {& B3 `$ K3 `4 @7 Y
  31.        /* led on */3 T/ A! C8 F& x2 v: x3 g; l+ W& L
  32.        rt_pin_write(LED_PIN, PIN_LOW);/ r4 x' |8 }* i, f9 y
  33.        rt_kprintf("led on, count: %d\n", count);
    " ^& B9 M2 [3 {  h- e4 m3 e, w
  34.        rt_thread_mdelay(500);, k2 k* w: K# U/ d# r  W* r: C0 K
  35.        /* led off */% i3 @: [: A0 C" ~5 L% ?: Z
  36.        rt_pin_write(LED_PIN, PIN_HIGH);5 F- ^1 z' G# P% F% m* k
  37.        rt_kprintf("led off\n");1 r0 W0 C; K: v4 f/ k
  38.        rt_thread_mdelay(500);4 T6 S/ ^9 r9 |4 f) d' @/ t
  39.        count++;
    ! v% ?5 P9 P, N* x* W
  40.     }
    : l8 ~  P0 d: J0 `. G
  41.    return 0;
    % L- d1 M( k1 J& J7 ^5 T
  42. }
复制代码
3 g! G8 R2 E' J! G6 @$ }0 j
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 7 天前 | 显示全部楼层
沙发
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

快速回复 返回顶部 返回列表