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

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

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

+ y  ^: e( r6 V( I$ |4 G, r; E
  1. static const struct pin_index pins[] =
    9 u, o/ g0 W/ A* W
  2. {& q. @) U" m6 r8 t( P" t( H
  3.    __STM32_PIN_DEFAULT,7 G1 c* i2 o: B* b4 [
  4.    __STM32_PIN(1, E, 2),       // PE2:  SAI1_MCLK_A  --> ES8388
    : X8 w( o7 r1 @% H  \# G
  5.    __STM32_PIN(2, E, 3),       // PE3:  SAI1_SD_B    --> ES8388, v$ B9 b1 @% X3 k; w. E, y
  6.    __STM32_PIN(3, E, 4),       // PE4:  SAI1_FS_A    --> ES8388
    ! u. j1 W" O6 v# t
  7.    __STM32_PIN(4, E, 5),       // PE5:  SAI1_SCK_A   --> ES83886 Q' b% Q5 ~+ t% {3 ~
  8.    __STM32_PIN(5, E, 6),       // PE6:  SAI1_SD_A    --> ES8388( a! ?' e$ {) ~6 R7 o
  9.    __STM32_PIN_DEFAULT,        //     : VBAT  _) p- y' [. n  F9 I, z
  10.    __STM32_PIN(7, C, 13),      //PC13:  SD_CS        --> SD_CARD
    , C' o+ }. \  o  S: E
  11.    __STM32_PIN(8, C, 14),      //PC14:  OSC32_IN
    # K  y$ i' j6 k6 a- ~5 s+ b
  12.    __STM32_PIN(9, C, 15),      //PC15:  OSC32_OUT
    ; @. R4 K% {0 |( n
  13.    __STM32_PIN_DEFAULT,       //     :  VSS) S2 g. ?- i- k! f; J: V' a
  14.    __STM32_PIN_DEFAULT,        //    :  VDD
    ( n" U9 g! d! e5 x. n
  15.    __STM32_PIN_DEFAULT,        // PH0:  OSC_IN. x6 i+ Y; x- {6 B" j0 u
  16.    __STM32_PIN_DEFAULT,        // PH1:  OSC_OUT4 A$ b* h5 O+ P  ^6 Q+ _
  17.    __STM32_PIN_DEFAULT,       //     :  RESET  F+ F4 n9 M1 e6 Q, {1 R
  18.    __STM32_PIN(15, C, 0),      // PC0:  I2C_SCL      --> ES83886 y# o2 I+ p" c) ]2 v- ]
  19.    __STM32_PIN(16, C, 1),      // PC1:  I2C_SDA      --> ES8388- d! Q$ C6 Z' e: e7 W
  20.    __STM32_PIN(17, C, 2),      // PC2:  GBC_LED      --> ATK MODULE
    # e6 @8 ]  W9 _! V' q; F; W! `9 F
  21.    __STM32_PIN(18, C, 3),      // PC3:  GBC_KEY      --> ATK MODULE: q/ X9 n! t. h9 _1 T
  22.    __STM32_PIN_DEFAULT,       //     :  VSSA
    * j& N/ u- }6 A' B% z7 [; _) t* c. A
  23.    __STM32_PIN_DEFAULT,        //    :  VREF-
    % U- B+ \9 G; l
  24.    __STM32_PIN_DEFAULT,       //     :  VREF+3 V' C  B6 P( d# W% N
  25.    __STM32_PIN_DEFAULT,       //     :  VDDA
    6 N1 v1 H; R) E! W% Z$ q7 H! J
  26.    __STM32_PIN(23, A, 0),      // PA0:  MOTOR_A      --> MOTOR. l% E3 s# }' a% Q) `
  27.    __STM32_PIN(24, A, 1),      // PA1:  MOTOR_B      --> MOTOR
    1 L8 S  f! j0 S9 c1 X: t9 c
  28.    __STM32_PIN(25, A, 2),      // PA2:  UART2_TX     --> EXTERNAL MODULE2 T) ]# T$ a7 ?& ^$ ~% d$ {4 v
  29.    __STM32_PIN(26, A, 3),      // PA3:  UART2_RX     --> EXTERNAL MODULE1 c- c$ q" l8 U! j
  30.    __STM32_PIN_DEFAULT,       //     :  VSS
    . M5 ~% q& B6 q. e& `! P
  31.    __STM32_PIN_DEFAULT,       //     :  VDD" g) w$ f3 v% C
  32.    __STM32_PIN(29, A, 4),      // PA4:  ADC12_IN9    --> EXTERNAL MODULE9 K2 |, ]- F6 w  W
  33.    __STM32_PIN(30, A, 5),      // PA5:  SPI1_SCK     --> SD_CARD8 d) o, o( {! R
  34.    __STM32_PIN(31, A, 6),      // PA6:  SPI1_MISO    --> SD_CARD
    - `0 B1 T, p' t# D/ S
  35.    __STM32_PIN(32, A, 7),      // PA7:  SPI1_MOSI    --> SD_CARD: K7 q2 t, S. ]) G* E  \6 K- r
  36.    __STM32_PIN(33, C, 4),      // PC4:  GBC_RX       --> ATK MODULE
    , i/ Q& ]3 A! g
  37.    __STM32_PIN(34, C, 5),      // PC5:  WIFI_INT     --> WIFI
    & i/ p  m. f4 N0 W- P" ~
  38.    __STM32_PIN(35, B, 0),      // PB0:  EMISSION     --> INFRARED EMISSION+ i+ c8 b' O/ Y7 ^2 P' l. U
  39.    __STM32_PIN(36, B, 1),      // PB1:  RECEPTION    --> INFRARED EMISSION' e8 O( C) U( b% _; P
  40.    __STM32_PIN(37, B, 2),      // PB2:  BEEP         --> BEEP
    - J( {. T7 r* R# a/ q
  41.    __STM32_PIN(38, E, 7),      // PE7:  LED_R        --> LED5 `7 j" U6 A) Q: J. {0 d7 E+ w
  42.    __STM32_PIN(39, E, 8),      // PE8:  LED_G        --> LED
    " V( J4 `8 {3 y" Y+ x
  43.    __STM32_PIN(40, E, 9),      // PE9:  LED_B        --> LED3 u7 a  v" x/ O6 v6 V( x
  44.    __STM32_PIN(41, E, 10),     //PE10:  QSPI_BK1_CLK --> SPI_FLASH
    % w- J( {% b/ m6 l' |; _) c
  45.    __STM32_PIN(42, E, 11),     //PE11:  QSPI_BK1_NCS --> SPI_FLASH) O7 o0 j, y7 l9 q  F7 y
  46.    __STM32_PIN(43, E, 12),     //PE12:  QSPI_BK1_IO0 --> SPI_FLASH
    . r8 b2 N5 K; ~8 U/ ^+ J( a4 Q
  47.    __STM32_PIN(44, E, 13),     //PE13:  QSPI_BK1_IO1 --> SPI_FLASH, B& N9 P) R+ ^3 l* ~, g+ F& J
  48.    __STM32_PIN(45, E, 14),     //PE14:  QSPI_BK1_IO2 --> SPI_FLASH' b1 }' N/ j$ F  @% S8 y0 u
  49.    __STM32_PIN(46, E, 15),     //PE15:  QSPI_BK1_IO3 --> SPI_FLASH
    3 m3 b! j7 ~& @  V% |" w
  50.    __STM32_PIN(47, B, 10),     //PB10:  AP_INT       --> ALS&PS SENSOR
    1 o$ j& M3 X8 B) Z6 v8 }
  51.    __STM32_PIN(48, B, 11),     //PB11:  ICM_INT      --> AXIS SENSOR
    * L3 y/ A+ v: G' C( D4 S
  52.    __STM32_PIN_DEFAULT,       //     :  VSS+ b8 e. k* f; E7 a
  53.    __STM32_PIN_DEFAULT,       //     :  VDD
    : `! W" j1 h- z7 P9 I+ D6 U, }
  54.    __STM32_PIN(51, B, 12),     //PB12:  SPI2_CS      --> EXTERNAL MODULE7 F1 Y- t, K' v5 M
  55.    __STM32_PIN(52, B, 13),     //PB13:  SPI2_SCK     --> EXTERNAL MODULE
    8 D3 |2 X1 ^& S' x  Q& T
  56.    __STM32_PIN(53, B, 14),     //PB14:  SPI2_MISO    --> EXTERNAL MODULE
    9 i/ S  y: P8 x2 A+ V" E+ H
  57.    __STM32_PIN(54, B, 15),     //PB15:  SPI2_MOSI    --> EXTERNAL MODULE  _) o0 F1 g- |" z5 y+ j) d
  58.    __STM32_PIN(55, D, 8),      // PD8:  KEY0         --> KEY
    $ j9 Z9 D: V% s; D, [6 Y: ]- w* u
  59.    __STM32_PIN(56, D, 9),      // PD9:  KEY1         --> KEY* G, `+ _" G) A1 \: }4 v6 b' k: s
  60.    __STM32_PIN(57, D, 10),     //PD10:  KEY2         --> KEY  K: z$ [3 _( M. _0 G  v" N) O3 |
  61.    __STM32_PIN(58, D, 11),     //PD11:  WK_UP        --> KEY5 O# ~0 s# o$ v& F8 K& E& ~5 Y
  62.    __STM32_PIN(59, D, 12),     //PD12:  IO_PD12      --> EXTERNAL MODULEL
    + j$ b+ V. j; d& N+ A0 e1 L' W
  63.    __STM32_PIN(60, D, 13),     //PD13:  IO_PD13      --> EXTERNAL MODULE" m7 u0 Q& a' m! ~" K6 z
  64.    __STM32_PIN(61, D, 14),     //PD14:  IO_PD14      --> EXTERNAL MODULE
    + \# X% M+ {" s4 d0 a
  65.    __STM32_PIN(62, D, 15),     //PD15:  IO_PD15      --> EXTERNAL MODULE( @2 E5 r- h4 E6 ~5 F, N& k, t
  66.    __STM32_PIN(63, C, 6),      // PC6:  TIM3_CH1     --> EXTERNAL MODULE
    ; z; J  c0 Y: m- g, W% }$ `' w3 I
  67.    __STM32_PIN(64, C, 7),      // PC7:  TIM3_CH2     --> EXTERNAL MODULE0 I! w4 l, w' b3 L& r( f0 Y
  68.    __STM32_PIN(65, C, 8),      // PC8:  SDIO_D0      --> WIFI
    ' a' j8 ]* H  Z: }- Z
  69.    __STM32_PIN(66, C, 9),      // PC9:  SDIO_D1      --> WIFI
    ! G4 ]( k1 [/ r( ~, A- y* j
  70.    __STM32_PIN(67, A, 8),      // PA8:  IO_PA8       --> EXTERNAL MODULE
    # |& \' A8 e1 B  s2 O2 R- Q3 g. K
  71.    __STM32_PIN(68, A, 9),      // PA9:  UART1_TX     --> STLINK_RX
    7 l; E; T2 O# L. z
  72.    __STM32_PIN(69, A, 10),     //PA10:  UART1_RX     --> STLINK_RX+ h: c8 M7 d3 r! ?# ]7 I& z
  73.     __STM32_PIN(70,A, 11),     // PA11:  USB_D-      --> USB OTG && EXTERNAL MODULE
    # k) G, x/ x5 h* I) d# k7 m
  74.    __STM32_PIN(71, A, 12),     //PA12:  USB_D+       --> USB OTG && EXTERNALMODULE
    $ d6 L! c$ C; p9 e( j
  75.    __STM32_PIN(72, A, 13),     //PA13:  T_JTMS       --> STLINK1 R' b5 X# l9 v9 }) a" C9 i
  76.    __STM32_PIN_DEFAULT,       //     :  VDDUSB
    # u. i% @7 [7 X2 t
  77.    __STM32_PIN_DEFAULT,       //     :  VSS) s9 t" z3 x6 j4 g6 i5 a3 J
  78.    __STM32_PIN_DEFAULT,       //     :  VDD
    1 S3 \' m& K5 ]( B7 o/ v' H7 p
  79.    __STM32_PIN(76, A, 14),     //PA14:  T_JTCK       --> STLINK
    % v) g% m2 {, @% ~5 X! z0 q) d
  80.    __STM32_PIN(77, A, 15),     //PA15:  AUDIO_PWR    --> AUDIO && POWER
    ( N0 @8 h3 b! r
  81.    __STM32_PIN(78, C, 10),     //PC10:  SDIO_D2      --> WIFI. p; B- t5 `, Z4 p) r$ s# p! a! C
  82.    __STM32_PIN(79, C, 11),     //PC11:  SDIO_D3      --> WIFI2 i- \: N3 z! U  F% o. x$ c! l
  83.    __STM32_PIN(80, C, 12),     //PC12:  SDIO_CLK     --> WIFI
      X6 O2 H: M7 A! F% a
  84.    __STM32_PIN(81, D, 0),      //
    1 `. P6 q! F; J2 _. R. `. L
  85.    __STM32_PIN(82, D, 1),      // PD1:  WIFI_REG_ON  --> WIFI
    . f$ \( e" g3 S& [! Q7 e  }
  86.    __STM32_PIN(83, D, 2),      // PD2:  SDIO_CMD     --> WIFI( d4 F8 S( E. y: V% s
  87.    __STM32_PIN(84, D, 3),      // PD3:  IO_PD3       --> EXTERNAL MODULE
    4 ~0 s6 W; s2 r% w( j
  88.    __STM32_PIN(85, D, 4),      // PD4:  NRF_IRQ      --> WIRELESS
    9 i: \8 E& L3 d' w9 ^
  89.    __STM32_PIN(86, D, 5),      // PD5:  NRF_CE       --> WIRELESS
    , T1 }3 U! W& m
  90.    __STM32_PIN(87, D, 6),      // PD6:  NRF_CS       --> WIRELESS
    7 a) L$ s. G! J1 r* R9 i) Y( P' O
  91.    __STM32_PIN(88, D, 7),      // PD7:  LCD_CS       --> LCD6 L$ `$ e# d+ W& s5 [" }
  92.    __STM32_PIN(89, B, 3),      // PB3:  LCD_SPI_SCK  --> LCD! K0 a" ?$ ]2 d( p7 y# u
  93.    __STM32_PIN(90, B, 4),      // PB4:  LCD_WR       --> LCD
    4 W* F- p3 t) m9 X9 X
  94.    __STM32_PIN(91, B, 5),      // PB5:  LCD_SPI_SDA  --> LCD* y* N( W+ O, Y- K9 P2 k
  95.    __STM32_PIN(92, B, 6),      // PB6:  LCD_RESET    --> LCD7 R( T& s' H3 L) i
  96.    __STM32_PIN(93, B, 7),      // PB7:  LCD_PWR      --> LCD
    9 U0 n. ?! e" d
  97.     __STM32_PIN_DEFAULT,        //    :  BOOT0
    : u) u; C0 g* h  j- F
  98.    __STM32_PIN(95, B, 8),      // PB8:  I2C1_SCL     --> EXTERNAL MODULE
    5 d1 a% c/ N8 ?' i" r; b6 Y+ ~
  99.    __STM32_PIN(96, B, 9),      // PB9:  I2C1_SDA     --> EXTERNAL MODULE, M: ]7 `7 n: A6 T6 Z
  100.    __STM32_PIN(97, E, 0),      // PE0:  IO_PE0       --> EXTERNAL MODULE: e+ l, E- U2 i7 i* x
  101.    __STM32_PIN(98, E, 1),      // PE1:  IO_PE1       --> EXTERNAL MODULE0 W6 \; E7 |4 ^" ]2 g
  102.    __STM32_PIN_DEFAULT,       //     :  VSS
    2 ^. q, G" ~/ U7 ^- X- _  X
  103.    __STM32_PIN_DEFAULT,       //     :  VDD$ \4 ]. W& T' z) p. }" O
  104. };
复制代码

9 o8 k3 F* K2 s
注册初始化
0 v$ C- V/ ?5 A* L
  1. int rt_hw_pin_init(void); ~; N6 f% e& g; R9 y! g0 H
  2. {. l5 N( Q- F' E
  3.    return rt_device_pin_register("pin", &_stm32_pin_ops,RT_NULL);
    # w$ v" t4 s& h, W, P( f
  4. }: C1 k% C! i& P
  5. const static struct rt_pin_ops_stm32_pin_ops =1 I: W" M+ A. d" T! ~
  6. {
    9 y% b4 K( u4 ^7 H
  7.    stm32_pin_mode," j8 s  f0 J* f3 U7 ?' R0 S2 ~
  8.    stm32_pin_write,; [  J1 z$ t( S; d- J. C7 n1 u1 @
  9.    stm32_pin_read,! r! ?4 V" C  B9 |% h  ^3 {
  10.    stm32_pin_attach_irq,7 J% D6 v0 ~6 x8 U1 a! y) u
  11.    stm32_pin_dettach_irq,
      `& l" F" V% m, W% K
  12.    stm32_pin_irq_enable,
    / Q/ L( a  k. G$ |$ p: D" g
  13. };
复制代码
; Q  x: Y! x9 J  Y
- U$ a! z& L. J8 G* b$ R) J1 \) D  h6 g
IO设备管理框架与通用GPIO设备的联系
  L- ~7 s$ B; a7 h+ U
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 / u/ N$ F& h+ P& q! }
程序运行流程怎么一步一步开始的?
在rtconfig.h中 配置使用PIN设备。
# g0 g6 M! f2 m: g
  1. /* Kernel Device Object */
    9 v# n, P0 V2 f
  2. #define RT_USING_DEVICE" R/ R, v, l9 w) f
  3. #define RT_USING_CONSOLE* G8 }4 I& U0 U  e2 J, ]6 U
  4. #define RT_CONSOLEBUF_SIZE 256/ y9 R" b$ T) L# ^
  5. #define RT_CONSOLE_DEVICE_NAME"uart1"% s" W7 d, @' j, A% K/ g
  6. /* RT-Thread Components */) ~7 \* E. r. X6 ?: ^$ Y
  7. #define RT_USING_COMPONENTS_INIT" o( K6 W& Y' A( d0 L
  8. #define RT_USING_USER_MAIN           启动方式之一
      j( x% _; b: L* @; O) D# h/ q2 n
  9. #define RT_MAIN_THREAD_STACK_SIZE 2048
    2 K! k/ B$ o- b0 i# V$ q) X/ w
  10. #define RT_MAIN_THREAD_PRIORITY 101 s- P5 n$ p& J  G3 C! D
  11. /* Device Drivers */' Y4 p7 x; R, {6 j0 Z2 o
  12. #define RT_USING_DEVICE_IPC5 ~  q, `. P: m+ d
  13. #define RT_PIPE_BUFSZ 512
    7 m5 \$ d2 ~- T5 H
  14. #define RT_USING_SERIAL
    $ p3 a# h# V( j. q/ N
  15. #define RT_USING_PIN
复制代码

& Z) w1 C- k: `! t
都在components.c中,
从startup_stm32l475xx.s 启动文件中开始。

/ y- j7 Q5 u: k. \
  1. ; Reset handler
    - A* G1 Y1 t  k* a
  2. Reset_Handler    PROC) {1 W0 [. L5 b* k0 Z/ D
  3.                  EXPORT  Reset_Handler             [WEAK]
    & ?) H3 i: a+ j3 m
  4.        IMPORT  SystemInit   //系统初始化,时钟相关等7 w# f+ J# L7 b! e
  5.        IMPORT  __main
      N# N; ~, E% K/ Z6 G* Y+ U
  6.                  LDR     R0, =SystemInit
    - O8 X/ v: Z# |; H
  7.                  BLX     R0
    2 u4 ~0 g7 ?' q6 a" S
  8.                  LDR     R0, =__main- k8 s# a. y0 b2 C# u6 P
  9.                  BX      R0
    6 k5 o+ S  R9 Z: Q* _
  10.                  ENDP4 U. w# F- \" E8 ^! w( |
  11. ; Dummy Exception Handlers (infinite loopswhich can be modified)
复制代码

  g$ F4 r/ e" a; [9 |
由于rtconfig.h配置宏RT_USING_USER_MAIN,表明通过组件的方式跳到main函数,不过此时过程是,先重新定义main函数int $Sub$$main(void),代码先跳到int$Sub$$main(void)执行,8 V* p! C. [% g4 Z1 {/ d
调用rt_application_init();创建main线程,在main线程中调用main函数
详见:components.c中:
  u. C0 Q9 ^5 [7 L" q
  1. #if defined(__CC_ARM) ||defined(__CLANG_ARM). G; g9 h' _% y3 P  j$ G
  2. extern int $Super$main(void);/ X( E/ [+ M( Z0 ?& g, x
  3. /* re-define main function */$ R- h. i: Z1 j5 M, }
  4. int $Sub$main(void)
    0 H, I3 v! C" u% W  s/ d
  5. {
    ( w* j. N# Y$ M/ k; V; L
  6.    rt_hw_interrupt_disable();' }6 K% A1 _6 D& G8 Z
  7.    rtthread_startup();//启动rtos.
    ' b' G5 R) I# h, Y( S  O
  8.    return 0;% j3 ?6 n& w; h- R: F3 N' @& A
  9. }
    ( j# o( t( e1 q) }/ ]( A4 B
  10. int rtthread_startup(void)
    % B. r8 C+ x0 s9 }4 T
  11. {: O# W+ P( v% a2 l
  12.    rt_hw_interrupt_disable();
    " n. e3 u7 _' W5 a
  13.    /* board level initialization8 B$ A. W. ?0 z+ O
  14.     * NOTE: please initialize heap inside board initialization., r) j1 a5 T  \
  15.     */
    5 H/ b- j0 s/ u' c8 I- J6 `$ d
  16.     rt_hw_board_init();//这里会进行rt_hw_pin_init()stm32_hw_usart_init();注册IO 串口设备
    & m" x- y" O! h9 [6 n4 L
  17.    /* show RT-Thread version */% p* ~6 N( u: |! y
  18.    rt_show_version();. }& _' y% E! z& o
  19.    /* timer system initialization */
    ( l2 D3 w4 X& W
  20.    rt_system_timer_init();3 V0 \  l/ r$ r) }
  21.    /* scheduler system initialization */, D. D, z  p# q4 ^- \0 O
  22.    rt_system_scheduler_init();5 ~- S2 D0 k7 L9 X% w
  23. #ifdef RT_USING_SIGNALS
    / x% F+ l6 J; a2 Z
  24.    /* signal system initialization */
    + O; N; J4 g& n4 B# x
  25.    rt_system_signal_init();) k  [( ?* W7 |* M
  26. #endif
    ( U3 W; I* v/ d3 b* f  Q
  27.    /* create init_thread */
    1 b. i2 |, g' a1 O
  28.     rt_application_init();//在这里创建main.c 的入口函数。( R: O( {% E% `1 U3 |& m2 s
  29.    /* timer thread initialization */$ ]9 W, \9 [" t
  30.    rt_system_timer_thread_init();
    5 a1 `& j* {: N# a
  31.    /* idle thread initialization */" M, b- }; o" T
  32.    rt_thread_idle_init();
    " P! S3 c* L+ s) {! x* w7 }
  33. #ifdef RT_USING_SMP( Z4 W4 G% W; v, ]# v' n; x# J" L
  34.    rt_hw_spin_lock(&_cpus_lock);$ O7 B- V" g  b- ?) n1 U
  35. #endif /*RT_USING_SMP*/
    3 A  l# q0 E5 t$ r0 e  J& y
  36.    /* start scheduler */
    9 S, E' |$ [% U  D) l6 Y( s7 w
  37.    rt_system_scheduler_start();
    2 m9 t1 i0 Q, D' z1 P3 o. r
  38.    /* never reach here */. ~1 o# w2 d# N1 F3 D3 j
  39.    return 0;
    % ^3 q, h$ P( u  H+ d7 [9 F0 S
  40. }
    0 L! c2 B5 d# U4 M
  41. void rt_application_init(void)
    ) C  ~+ a* v# \
  42. {+ N" r5 ~) Q8 O. z7 ~
  43.    rt_thread_t tid;  k$ _5 P& b0 G2 X& E9 [) s6 E
  44. #ifdef RT_USING_HEAP( o. @- X, x# {6 Q# l% H
  45.    tid = rt_thread_create("main", main_thread_entry, RT_NULL,
    # H+ m4 J; E2 N. T3 [
  46.                           RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);5 v; E! h. M; _- x
  47.    RT_ASSERT(tid != RT_NULL);
    ' Z7 N8 y( o& Y
  48. #else
    , G; G) P  O" z4 s+ ~; Z. Q3 J
  49.    rt_err_t result;
    ( F4 T' W7 H4 S
  50.    tid = &main_thread;
    ( Y5 F7 l) O2 n  k) U
  51.    result = rt_thread_init(tid, "main", main_thread_entry,RT_NULL,
    ' Q, |4 |- ?* O2 R$ v) s1 W- c
  52.                            main_stack,sizeof(main_stack), RT_MAIN_THREAD_PRIORITY, 20);1 H' w! _# S7 u, g3 w# L' l$ [
  53.    RT_ASSERT(result == RT_EOK);
    % I& ~$ [9 \' r, l( y0 x
  54.       , _5 Q( n5 F6 U/ ~
  55.    /* if not define RT_USING_HEAP, using to eliminate the warning */
    ( L. ~& F. e  |: O- t* E
  56.    (void)result;$ r. z, [& [" x2 ^  Y/ h
  57. #endif$ `# \# n- C6 T0 [
  58.     rt_thread_startup(tid);//启动这个线程。% x( ^  s$ {7 x1 I% Y
  59. }( K! M1 ^7 E6 W1 u
  60. /* the system main thread */
    ' D- Z) n! r) ?- W# G
  61. void main_thread_entry(void *parameter)) ~3 s; N  H* u5 r6 N6 b% c8 b
  62. {
    % W; n* D( l+ C/ S* j3 Q
  63.    extern int main(void);# f& {8 I* K* @: L
  64.    extern int $Super$main(void);
      R+ P3 a4 T, |% R8 U
  65.    /* RT-Thread components initialization */
    3 _* X7 U1 N0 ^; j, J; H  g
  66.     rt_components_init();//组件初始化,这个例程暂时没用到。' m% j4 ^$ t; D4 [0 w
  67. #ifdef RT_USING_SMP
    ) t" w# I; v3 e5 }1 x
  68.    rt_hw_secondary_cpu_up();
    6 b9 j2 H4 T: \6 r) o
  69. #endif
    5 B1 @9 ]% C4 y% C" E; N# [
  70.    /* invoke system main function */
    4 z- @2 V; ^0 F- \
  71. #if defined(__CC_ARM) ||defined(__CLANG_ARM)
      y( H& C* d' y
  72.     $Super$main(); /* for ARMCC. */转到main.c中  w9 f6 _  Q0 L2 m4 y7 ^$ a
  73. #elif defined(__ICCARM__) ||defined(__GNUC__)% T3 M; D: z: |
  74.    main();1 F  L% @& Q% z9 W5 p
  75. #endif) e0 O- O; l- j
  76. }
复制代码
1 R  @! T2 b3 j' ^, H/ w3 r! o
由于定义#define RT_USING_COMPONENTS_INIT
4 V+ H8 p' m/ k
  1. /** Q- ]  \% {% V) T
  2. *Components Initialization will initialize some driver and components asfollowing
    ' A. u" |$ T; ^( Y
  3. *order:
    ! P! }  d* M0 W  B
  4. *rti_start         --> 0# a  w. V6 v+ _4 s# K
  5. *BOARD_EXPORT      --> 1& r8 }8 ]) D4 i) R
  6. *rti_board_end     --> 1.end4 p% W9 ]0 T* y5 ~
  7. *& v; }' r% ~0 b: ^) `% W: F
  8. *DEVICE_EXPORT     --> 25 R* L- q; A: u; S1 @5 |
  9. *COMPONENT_EXPORT  --> 3
    ' V7 o5 k, U( m
  10. *FS_EXPORT         --> 4' ^, M3 d5 [$ }( W# F0 ^! |
  11. *ENV_EXPORT        --> 5
    * _  R( ?" T7 ?# C5 T
  12. *APP_EXPORT        --> 6
    - O% I8 W% X2 j% e* a, B
  13. *2 L8 _) |5 Z' j- W& z. o
  14. *rti_end           --> 6.end- R& q/ U  `4 u4 q; c
  15. *8 N3 P5 z. d$ @6 D+ M& q+ c
  16. *These automatically initialization, the driver or component initial functionmust
    ) y/ @# W9 ^( B( m# g0 o! ]0 i
  17. * bedefined with:* g9 ^8 ]; x5 y/ r( w7 G5 {' l$ T% b: Y
  18. *INIT_BOARD_EXPORT(fn);
    7 o4 E; p8 a' b; E; e- l
  19. * INIT_DEVICE_EXPORT(fn);% |$ G, R8 g! J& l
  20. *...
    7 B" p$ H$ v- [. _
  21. *INIT_APP_EXPORT(fn);
    6 c2 v" \) V# A( g  c- @& a
  22. *etc.
    0 i+ i) z( S2 w
  23. */$ S: ], g; |" y, D# D
  24. int main(void)
    , d! c  K9 r- u$ A* p" Z
  25. {
    : X2 \; m) Z/ K; p
  26.    unsigned int count = 1;
    7 t# k* V( O1 U4 {9 }
  27.    /* set LED pin mode to output */: `+ y) ~7 O& F! G
  28.    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);  Y4 R. M2 i8 Z5 n
  29.    while (count > 0)
    0 z7 w& |6 d7 `  p% Q( \
  30.     {
    $ W3 n6 B0 z; k/ T7 z
  31.        /* led on */3 O8 A; Y6 U9 R* z
  32.        rt_pin_write(LED_PIN, PIN_LOW);
    " X' p9 e8 A$ v9 N
  33.        rt_kprintf("led on, count: %d\n", count);
    : s& J6 ^+ @/ g, P% Z
  34.        rt_thread_mdelay(500);
    / v! g' P/ s  @7 U. O7 ^6 E+ ]
  35.        /* led off */+ q  N' {0 I; ~
  36.        rt_pin_write(LED_PIN, PIN_HIGH);- W' S3 T' K2 C' c8 S. K3 \
  37.        rt_kprintf("led off\n");
    # f  P  {6 D5 P% V; e
  38.        rt_thread_mdelay(500);
    8 \2 m# _0 R' E
  39.        count++;3 {  F' k4 o) ~) n. Z7 C" C
  40.     }
    9 z# }/ g, O- H0 C5 n
  41.    return 0;# X& |+ e. N: g! [9 Y- Q) F0 T
  42. }
复制代码
' K( j# y& ^3 b! B5 F
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-1-11 11:53:56 | 显示全部楼层
沙发
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by RT-Thread

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