你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 移植鸿蒙操作系统

[复制链接]
STMCU小助手 发布时间:2022-11-16 19:09
前言
/ ~) A& p0 }' r随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无关层,硬件相关层提供统一的HAL(Hardware Abstraction Layer)接口,提升硬件易适配性,不同编译工具链和芯片架构的组合分类,满足AIoT类型丰富的硬件和编译工具链的拓展。本文主要介绍如何在STM32上移植 OpenHarmony LiteOS-M 内核,及其注意事项。
! x, m5 g1 k) x0 Y) ^4 M0 @- l7 z# z. K# c3 K. ~( o9 v4 `3 X+ ], P
一、开发环境; j) C  P- N. H
硬件:
0 X! }7 J8 \9 e: T- STM32F429I-DISC1 开发板3 @2 I& p1 ]; y& [, I! G
88f82b9af38d4a1ebf55de3ce20ec3cc.png
& Y& y4 q* a7 B- v
$ R! k9 L1 F3 Q# y% c7 ?; F0 \' v软件:
# a. `6 U$ l! g$ t2 Y- VSCode:用于编辑代码2 V* S9 t) x3 W6 y* x% M+ g' A  @
- STM32CubeMX:用于生成工程
) t) y7 Q$ {; p' I4 j- make、arm-none-eabi-gcc:用于编译工程
# A* X$ L: k/ i: C9 I0 [, j. V- STM32Cubeprogrammer:用于下载工程
4 r2 r+ R) E) w5 y( Z5 p) b- Git:用于获取 OpenHarmony LiteOS-M 内核源码  ^! X4 D. Z: m& b' A
6 d- V+ y( h* q3 \! H9 I7 j
二、移植内核/ U9 K, p% |" r" {
1. 操作流程
) c' I% j; l# ?9 W% O8 U
拉取仓库代码。4 M! L; R8 {- O" `9 r
使用STM32CubeMX在 /target 目录下生成工程。
( b; p$ R6 T' ?' O9 @0 d6 S修改Makefile文件,工程加入 OpenHarmony LiteOS-M 内核所需的文件。
  ]: B; C  o0 F  Z3 y7 ]- R# M# B5 ~0 S添加用户代码以支持printf。添加用户自定义任务。
) N9 }$ ~" o- c编译下载程序
! K8 a7 |+ X- m" u1 Z
: W' z2 D9 ]% k$ {' J; a3 D$ ^+ ^' v2. 获取源码
% m* K  i$ V( z) f$ t' L, k+ a
2 r) ]1 |) y6 ~1 b7 K4 z1 p/ ]' i d705d7f0048c488f8f14b5594c0d1c4d.png
5 l4 @& k$ Z# K9 h" L
' t  k1 \9 [: T9 `9 c使用Git Bush,拉取内核源码到本地。
8 z1 e2 M5 }: S6 P! y% f/ u+ E7 G4 `, V2 g" e
dc7910cb5c514699be84cb1ba2fe39e4.png
0 G) Y- m/ ]) v( q0 X- K
2 O( Y3 S& f$ S6 V创建 /third_party 目录,用于存放第三方依赖文件(STM32 所需的 CMSIS 等),拉取第三方依赖文件。5 j0 R7 A- i1 b9 d  B* C
+ a+ E& I' G9 G1 t
b2f839576df54ee7aee9ae5f4e16240f.png   c& X# ]1 h# w9 Z, F6 c

/ g" i3 U+ g  _! r0 N到这里 OpenHarmony LiteOS-M 内核源码就获取完毕了。* |0 G* n& c0 t  b* c# P# ]" i9 C- \

4 F+ Y+ m8 v, u' B! r0 f* N3. 生成工程
. V' Y- s" G9 Z- M3 [2 A: H7 ?$ u进入/targets 目录,使用 STM32CubeMX 生成工程 STM32F429ZI_Harmony_LiteOS_M3 |1 q0 \# w$ e* U

, \5 I3 o0 R; N2 F; `* Z) T) j& s5 |* E 6676c6dde05c4d5a94c86f352f83f9f5.png % I! M1 ~- [* b
7 L( }+ H3 R) P0 _3 E7 j& G
与FreeRTOS类似,由于LiteOS会占用SysTick定时器,因此需要修改HAL库延时的基础时钟,改为其他非SysTick的定时器,避免HAL库延时的定时器和系统运行的定时器冲突。; \+ Y: U9 V- }5 S% l: N
0 O2 g8 V4 P7 h- w% ]4 A( R/ d
49ebb64304a34008a89fa4c7cd1bf76d.png 6 s( s, T0 [9 S8 L9 d

4 ?! b' I! W! Z+ }5 u: Z配置:下载调试端口SW、串口USART、LED_GPIO、时钟树。3 R/ X* Z# C' p6 |* w! Q* W- e
4 C1 h% n3 [: o# C* i2 v; h0 H
de7c845c652f498ab3b9efbdb6e91dba.png
( X3 x$ n- v, b# |+ \" ?' M$ I, r* L! L; y' K" K* F/ L4 \
开发环境选择 Makefile
* Z4 X9 Y: F/ |1 C' f6 e' r/ k
2 l5 S, T1 A' X9 M( ^* P1 n 1ee230f036a341969839d9b848a860a7.png
% N) {9 }3 x! W) C: I
* |, n/ ~7 n/ _Code Generator 中一定要选择 Copy only necessary library files ! 如果选择所有库文件都添加的话,那么就会生成很多模板文件。由于我们需要在 Makefile 中添加文件,如果目录中有模板文件的话,我们就无法直接使用筛选功能将所有源文件快速添加到工程中了。
0 n- o  \" F" J
$ x( c! ?) f- X8 P8 s8 t 9fa06158193d49a69ac5e73b83e8c17e.png
7 _+ x* f* K% s# t: \$ m: U1 U  {% r- G$ s( p% ?& Y. N$ g( g
至此工程配置已结束,点击 Generate 即可生成工程。! p9 X' ^4 w) k9 j4 i6 d

9 ~9 O- l; f& ~  \* ?  ]7 C; w4. 修改工程文件" u. m% r, W. l& O0 Q
1.使用 VS Code 打开targets下的工程目录,新建liteos_file_path.mk用于将内核源码文件添加到工程Makefile中,该文件相当于C语言中的头文件,主 Makefile 文件可以直接包含该文件。
& y: Z/ F9 u5 F, [+ `2 k; {* ]1 j& @0 S, M0 g4 a
f25a0d2c8002420d9a127891f40574ad.png
; _: }, ~5 m1 W3 F8 J! I5 c& U
3 U5 e5 ~2 Y' n9 P# _2 s' |2.添加内核源文件目录到 liteos_file_path.mk 中。5 K1 Z. E( V% m% h- G! F& s% B
  1. # Topdir 顶层目录; U1 J$ Q. L7 ^' J4 U- t
  2. LITEOSTOPDIR := ../../
    ! `3 p- Y& R6 x" B* G2 j2 r
  3. LITEOSTOPDIR := $(realpath $(LITEOSTOPDIR))' l8 U1 G, U; q% J0 d% `8 L
  4. ! a! ?+ t# c$ g, r) p1 \' _4 M1 W
  5. # Common 内核源文件及头文件目录
    " K7 ]8 Y+ t5 d+ w
  6. C_SOURCES   +=  \
    ! r  O/ w3 P5 B# d
  7.     $(wildcard $(LITEOSTOPDIR)/kernel/src/*.c) \3 Z; Y6 L* O: d
  8.     $(wildcard $(LITEOSTOPDIR)/kernel/src/mm/*.c) \2 A& l2 S! }: W0 C' Q0 [
  9.     $(wildcard $(LITEOSTOPDIR)/components/cpup/*.c) \/ E- d1 p+ T8 W
  10.     $(wildcard $(LITEOSTOPDIR)/components/power/*.c) \5 i7 A) Q8 n" h$ b
  11.     $(wildcard $(LITEOSTOPDIR)/components/backtrace/*.c) \  X1 x/ z3 ~, k
  12.     $(wildcard $(LITEOSTOPDIR)/components/exchook/*.c) \
    . \5 H+ k0 Q) ]3 e5 {; Z6 S
  13.     $(wildcard $(LITEOSTOPDIR)/components/signal/*.c) \6 D! U+ t" W& m, H, i5 K
  14.     $(wildcard $(LITEOSTOPDIR)/utils/*.c)4 O9 _8 \( `+ w' J; N5 Y$ k
  15. ) ^' e0 _- k! D1 y1 f
  16. C_INCLUDES  +=  \
    : }% }! N! P2 Y; @
  17.     -I$(LITEOSTOPDIR)/utils \
    ( Q. ]" ?# c- \. k* U" G: e, u
  18.     -I$(LITEOSTOPDIR)/kernel/include \# S' B: k" \- Y  E
  19.     -I$(LITEOSTOPDIR)/components/cpup \
    ) _! @' t" g, |5 T% ^
  20.     -I$(LITEOSTOPDIR)/components/power \
    ; D; |5 S* F) O0 _4 V2 u& ?
  21.     -I$(LITEOSTOPDIR)/components/backtrace \
    9 d3 [9 x& Y9 B
  22.     -I$(LITEOSTOPDIR)/components/exchook \
    2 S% d6 M2 \, ]$ x: F1 X+ _
  23.     -I$(LITEOSTOPDIR)/components/signal
    ' R, \! B/ f1 S, a& [. q

  24. + f6 h3 m9 ~+ _" b) r' L3 D5 S

  25. 0 U7 [% O# Y. s! l" }' \
  26. # Third party related 第三方依赖文件及头文件目录
    + X$ B  A+ j. Y- k' q
  27. C_SOURCES    += \3 f6 r' ^& r" O% ?
  28.         $(wildcard         $(LITEOSTOPDIR)/third_party/bounds_checking_function/src/*.c)\
    & R) |/ V. c1 C3 n! T% d; X8 l
  29.     $(wildcard $(LITEOSTOPDIR)/kal/cmsis/*.c)\
    : ~# d, e+ R/ `
  30.     $(wildcard $(LITEOSTOPDIR)/kal/posix/src/*.c)
    / M1 r4 `0 ?6 n0 F, ?6 q% S1 a* ?6 Z
  31. 5 y' d7 S$ h/ t7 ~( G9 j
  32. C_INCLUDES   += \* k; D- U* @! ^$ V* K$ {5 k1 E# `
  33.         -I$(LITEOSTOPDIR)/third_party/bounds_checking_function/include \
    $ I& h7 }) x- |  Z7 g5 B4 f
  34.     -I$(LITEOSTOPDIR)/third_party/bounds_checking_function/src\
    % r+ O9 a8 _3 P0 n. N
  35.     -I$(LITEOSTOPDIR)/third_party/cmsis/CMSIS/RTOS2/Include \) q9 W% v; C" b2 b
  36.     -I$(LITEOSTOPDIR)/third_party/musl/porting/liteos_m/kernel/include\
    % `& F1 [, [6 D" m3 @' o# V  Z) T2 l& y
  37.     -I$(LITEOSTOPDIR)/kal/cmsis \8 ^3 y. P+ B+ B
  38.     -I$(LITEOSTOPDIR)/kal/posix/include \* m4 ^" b  i2 j3 s# Z
  39.     -I$(LITEOSTOPDIR)/kal/posix/musl_src/internal
    2 q; e: s1 E. r: s

  40. ' [. u# `- M" t( x. U1 L
  41. ; V8 o( C. c, C0 P
  42. # Arch related
    9 P/ P! n3 v+ y+ W
  43. ASM_SOURCES   += $(wildcard $(LITEOSTOPDIR)/arch/arm/cortex-m4/gcc/*.s)
    ) @9 A  L0 J1 [3 F) G/ C% [

  44. - x$ A- H- T- |- M3 @; c: R1 x3 N9 a. O
  45. ASMS_SOURCES  += $(wildcard $(LITEOSTOPDIR)/arch/arm/cortex-m4/gcc/*.S)
    ' b& r+ B1 ^' p& }
  46. + L$ F$ i/ V9 K& Y! k
  47. C_SOURCES     += $(wildcard $(LITEOSTOPDIR)/arch/arm/cortex-m4/gcc/*.c)
    9 E1 m% g0 t! W

  48. 3 |. ~6 a% _+ O: F. B1 m" Z1 Q% J
  49. C_INCLUDES    += -I. \1 I7 P6 Z8 O0 m
  50.                  -I$(LITEOSTOPDIR)/arch/include \
    # I9 u: X# U4 _
  51.                  -I$(LITEOSTOPDIR)/arch/arm/cortex-m4/gcc2 s, C8 A- d2 y; h! {: O& N0 y
  52. 2 z. b5 T0 O6 v' J
  53. CFLAGS        += -nostdinc -nostdlib
    / `/ H6 I, E! F  e3 K
  54. ASFLAGS       += -imacros $(LITEOSTOPDIR)/kernel/include/los_config.h -DCLZ=CLZ
    ' i! i7 ~  k& g' b2 N( }

  55. * Z% `( D4 U) L5 A: O
  56. # list of ASM .S program objects
    5 w2 `5 c! |% R  M  e7 {6 J
  57. OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASMS_SOURCES:.S=.o)))
    ( q5 K, c# r9 |! c+ p* l  p
  58. vpath %.S $(sort $(dir $(ASMS_SOURCES)))
    * y7 k8 q8 a' i0 K8 B! y

  59. ' u; g$ w7 R/ D
  60. $(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
    : Z: d& u8 Y# P7 ~  Q' \
  61.         $(CC) -c $(CFLAGS) $(ASFLAGS) lt; -o $@- \  R& m! V1 h4 T- [; k
复制代码
% [6 J) l+ |1 o% \7 h) V$ ~% @8 h
这里注意:最后一行前面的缩进必须为tab,而不是空格。否则编译会报错。
1 ~6 [/ s( A' X- `4 N0 J" Q
/ n- Y5 n8 ^" P. h3.修改项目Makefile5 R2 q8 s5 G: f3 `7 k
在Makefile中包含liteos_file_path.mk* R7 I- d, f/ Q& l/ J5 O" K

! U" Y# X' D) l$ o 558f1379e42749678db37b7ceee1b255.png
0 B% Z) r; _7 P7 A$ g+ q1 G5 t3 s; f
增加*.S文件的编译规则
+ T* u/ _% c: s( k: R4 n9 H
  1. # list of ASM .S program objects* r# ]1 S- M! ~
  2. OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASMS_SOURCES:.S=.o)))5 j$ C1 Y/ r& Q+ }
  3. vpath %.S $(sort $(dir $(ASMS_SOURCES))). k+ u  T6 o) C5 R) K

  4. ) \' f: _4 C/ B0 g& X
  5. $(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
    ! f$ g# ^( ~5 }( W* J+ x5 y- i
  6.         $(CC) -c $(CFLAGS) $(ASFLAGS) lt; -o $@
复制代码

6 A- Z& w9 P$ ^+ r2 y2 C6 ] 1f332cdb4c32450aac6fb082ccb2cd1f.png
. I6 d1 Z! ]5 l0 A- [; x" |& p+ ^2 n: z* J- s$ D
4.添加 target_config.h 用于配置裁剪内核。该文件相当于FreeRTOS的FreeRTOSConfig.h/ b* d; D* P) c1 n( {7 ^
  1. /**@defgroup los_config System configuration items' F* o, \) {+ K. \3 S
  2. * @ingroup kernel
    ! }. O! e7 x7 |% m
  3. */) A4 P, a0 s4 z& W% ?
  4. ) F5 a2 w8 n9 I; N$ y8 Y$ {. W/ H3 V
  5. #ifndef _TARGET_CONFIG_H
    $ O# q$ t/ E- a# L4 g5 @
  6. #define _TARGET_CONFIG_H
    % R" i9 a: j4 i2 ^% `

  7. 8 |' d- e5 K! x2 k. S% g
  8. #include "stm32f4xx.h"0 j# Y# p7 \  p# @
  9. #include "stm32f4xx_it.h"8 ]1 H. ?7 G# }; k5 K" w( B( M2 J

  10. " d3 {9 ^/ B* n0 g/ [! ], N
  11. #ifdef __cplusplus, @- B' [! ~# h5 |9 j, _
  12. #if __cplusplus
    9 F0 ~, {7 Q  _- |2 Q" v& V/ @; t8 v
  13. extern "C"  q* P& u% \! X9 Q  [  P; N
  14. {
    0 i8 J5 u$ V' P: P
  15. #endif /* __cplusplus */: {, K% d: o& _9 m! |! w( M0 R3 N
  16. #endif /* __cplusplus */. n8 Q6 y1 b- I  G6 Y: o  C% T# z4 y
  17. / [1 `0 E0 g4 H. C2 `) e
  18. /*=============================================================================. i, k% ^4 M6 Q" s0 n& g
  19.                                         System clock module configuration& n* M/ q) @7 t' X. E7 G3 i  ?& @- A
  20. =============================================================================*/
    ' I: q. w" x: |. R
  21. #define OS_SYS_CLOCK SystemCoreClock
    / J. Z* T/ @- K
  22. #define LOSCFG_BASE_CORE_TICK_PER_SECOND (1000UL)
    ; G/ T6 {4 ^  w& ]2 I: U
  23. #define LOSCFG_BASE_CORE_TICK_HW_TIME 0' R/ b2 M, j0 _1 h
  24. #define LOSCFG_BASE_CORE_TICK_WTIMER 0
    , X0 _2 o  P8 ]6 b4 r
  25. #define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX SysTick_LOAD_RELOAD_Msk  D- o3 o0 F2 B5 p' A& n
  26. , P3 z, x4 {# h$ D( x* e2 B: a, T
  27. /*=============================================================================
    9 v9 @) V" }6 M$ u1 y& D! _" x
  28.                                         Hardware interrupt module configuration! M6 k$ o* M- U, u: K& ]
  29. =============================================================================*/
    % `5 I; o3 i, w: [
  30. #define LOSCFG_PLATFORM_HWI 09 @8 i$ a1 z9 g9 K  J5 s4 }
  31. #define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 0
    8 y- v6 J9 Q, @+ K$ h
  32. #define LOSCFG_PLATFORM_HWI_LIMIT 128
    0 {" |8 |! q# w0 \0 y- Y
  33. , ]! c( X& n( i3 ^% t; o
  34. /*=============================================================================
    % E  j8 C. i, R# B; {0 f& m7 V
  35.                                         Openharmony Kernel configuration
    $ _0 h& u1 f+ a& L/ W. S# x/ f
  36. =============================================================================*/  w2 @8 ~, y+ G/ y. h1 p  E
  37.   s9 V( e* i/ S( K( A  f0 [: o+ ~" q
  38. /*=============================================================================7 n9 R/ ]0 O, _( v$ G2 C
  39.                                        Task module configuration( @/ m0 q3 c# o3 r4 }
  40. =============================================================================*/
      V3 ^0 D$ h( Y' ]* E
  41. #define LOSCFG_BASE_CORE_TSK_LIMIT 24
    + p) V' `0 T/ {! ^$ l
  42. #define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE (0x500U)
    " U# B4 a# E9 x0 O4 j( E! M
  43. #define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x2D0U)* ]+ m+ d) \1 H7 H( P2 p
  44. #define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x130U)9 f9 R! p5 s4 g6 p) w5 N0 j1 |! v
  45. #define LOSCFG_BASE_CORE_TIMESLICE 1
    5 ~$ \/ T+ K% k
  46. #define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 200004 o7 n9 _7 G+ h5 r: [" B- V
  47. /*=============================================================================
    ' ?2 `: f' Q2 @! X* Z
  48.                                        Semaphore module configuration
    % B: }9 {1 P2 A) @! T; T- o6 S9 b
  49. =============================================================================*/
    ( Y' \& b; x5 d9 \+ Y& T
  50. #define LOSCFG_BASE_IPC_SEM 1  {+ Q4 |6 q& d% c
  51. #define LOSCFG_BASE_IPC_SEM_LIMIT 48
    & p: r( i) g+ N; H! W3 r2 S
  52. ( H' w) b0 J0 T, _; g6 F( p7 V
  53. /*=============================================================================! p$ Z( j( Z$ x& U1 t
  54.                                        Mutex module configuration. l" m) [7 c  V# b* V
  55. =============================================================================*/0 O9 a; j2 i/ h4 Y/ v% z
  56. #define LOSCFG_BASE_IPC_MUX 1
    $ n! h0 @& U) J7 k6 S  I
  57. #define LOSCFG_BASE_IPC_MUX_LIMIT 24
    2 Z/ J. I7 n6 Z" v- F' y
  58. /*=============================================================================
    - {4 _* \4 l& ?% O
  59.                                        Queue module configuration! S0 F) `0 H" G' R
  60. =============================================================================*/
      o7 t9 `- U: o0 c6 o
  61. #define LOSCFG_BASE_IPC_QUEUE 1
    ! k: \0 `7 b/ M5 V7 D5 R$ s
  62. #define LOSCFG_BASE_IPC_QUEUE_LIMIT 24
    6 u  a; C$ x9 ], ]5 z4 K5 d* x% I
  63. /*=============================================================================
    % ~" b* X4 Z) W" k; P3 g- W3 ?
  64.                                        Software timer module configuration% Q( K4 _" _2 B) a; r& }1 P
  65. =============================================================================*// Y. W  D* i6 \1 H6 G# }5 x
  66. #define LOSCFG_BASE_CORE_SWTMR 1
    7 X. a- O: F; s- ^& H) n) y
  67. #define LOSCFG_BASE_CORE_SWTMR_ALIGN 11 O3 q( `) j% Q; \( {
  68. #define LOSCFG_BASE_CORE_SWTMR_LIMIT 48
    / n; A3 {+ k" v$ |
  69. /*=============================================================================4 ~4 }) K$ f' l9 A7 f
  70.                                        Memory module configuration* q' A1 w1 C7 T9 X# b# L
  71. =============================================================================*/
    ) G9 o0 b8 l6 b$ o' i  K
  72. #define LOSCFG_MEM_MUL_POOL 1, M5 w! ?2 e- b
  73. #define OS_SYS_MEM_NUM 20
    : k0 a0 l1 M' v7 L& o$ n
  74. /*=============================================================================# B5 Q7 k: e! }
  75.                                        Exception module configuration' n% T, T2 @" O
  76. =============================================================================*/
    7 W4 S  C# D2 m3 a* }
  77. #define LOSCFG_PLATFORM_EXC 1
    # s9 f" |  S8 l- U
  78. 4 e! s6 L: H4 a- Y  d
  79. /*=============================================================================
    ! L4 t% T$ D1 n2 \5 U
  80.                                         TestSuite configuration
    1 s$ L  v6 q3 L" v
  81. =============================================================================*/
    : h6 `2 Q6 U, h6 X; S' z
  82. #define LOSCFG_TEST 01 D$ ?& j) B, y5 v/ L/ J3 Z
  83. & p, v+ A; W9 X- }5 |' L+ H- ~2 ?
  84. #ifndef LOSCFG_BACKTRACE_TYPE
    8 o1 Q$ N# D( S* ^0 c
  85. #define LOSCFG_BACKTRACE_TYPE 19 N% `8 \# i+ u2 o
  86. #endif! d3 H1 v! r$ U& n1 s- @
  87. /**+ q( F4 u0 r3 g/ n8 n
  88. * @ingroup los_config' R8 j% C# s) j$ o1 e: O
  89. * Configuration backtrace depth.
    ; I& |. H+ c6 s+ y
  90. */
    $ I0 w7 ~0 U" t* o3 f
  91. #ifndef LOSCFG_BACKTRACE_DEPTH+ ~( v! A; d# Y
  92. #define LOSCFG_BACKTRACE_DEPTH 15
    % z1 `6 z1 v. M; C$ [) A# G
  93. #endif
    . }; J) `, e  q* w4 u, B
  94. #ifdef __cplusplus% v3 K) I" l. e( o/ ?
  95. #if __cplusplus
    - ^2 Z4 u" K, D5 A; q, b
  96. }2 v! X  F" c+ q1 G2 N$ y2 b8 Q
  97. #endif /* __cplusplus */
    " n) [7 G, @" M+ W  Z% y$ T9 e
  98. #endif /* __cplusplus */
    8 S4 c( S3 `' ?. X) T3 @
  99. & n1 L! @- A8 h' M
  100. #endif /* _TARGET_CONFIG_H */
复制代码
( P2 L6 w- e# x0 L
5.修改链接脚本文件 STM32F407ZGTx_FLASH.ld" O- J; e5 a8 i0 f% r
添加程序起始地址 _sstack = 0x20000000; /* start of RAM */. i% `+ Z$ u1 x+ {
添加.text 段的起始地址,这是链接脚本的语法,将当前位置地址赋值给_stext。_stext = .;
* d2 Y2 `- X& V* ]4 n' ~; T& a+ s
2 d+ i0 u7 `. h6 q7 w( G a7e3f37fb6aa47cf933009daf2a334e6.png
( j2 u- e& i. u& V, V
7 H: M) F; T7 j( _, o% b6 C6.修改中断服务函数 Core\Src\stm32f4xx_it.c
3 T* `6 l$ m. _. e添加 LiteOS 头文件
/ v4 ^$ t: Q" z1 o; R在PendSV异常中进入LiteOS HalPendSV 异常处理函数,进行任务切换操作
0 ?0 r" x2 k7 g" b& p1 W) _在SysTick中断服务函数添加OsTickHandler函数,为系统提供时间基准; |0 R. E( P, V+ h' M
  1. #include "los_arch_context.h"2 O8 H7 b0 N, S
  2. #include "los_tick.h"2 q  d% W7 p4 @; J. t5 x
  3. /*
    ) z7 m! Y% y1 o# e/ J  Z4 P& y
  4. .........
    0 v( z6 u  ^' w7 m7 o( [  c3 s; q
  5. */4 K7 Z! M( E% \$ {
  6. void PendSV_Handler(void)( `4 U9 n5 r4 A. p7 a2 b( D8 E' w
  7. {
    ( M  I5 D8 i* z1 g8 ]. a+ v. o+ l& H
  8.     /* USER CODE BEGIN PendSV_IRQn 0 */$ G9 P4 u2 B. _  i8 a) X6 n
  9.     HalPendSV();9 f8 j/ s+ h  v* E) L& x, ^
  10.     /* USER CODE END PendSV_IRQn 0 */; I6 y1 {0 ~, `+ k
  11.     /* USER CODE BEGIN PendSV_IRQn 1 */& Z3 R. o* n( K
  12.     /* USER CODE END PendSV_IRQn 1 */2 Q! }5 h' z  @+ z& T, E
  13. }* d" Q- d! s+ n7 o4 W: A
  14. /*
    5 w- |2 G+ y, W" S5 W
  15. .........
    2 ^! |+ k3 u9 z8 l) z. h' N( C/ n
  16. */* S" ~; C0 c* I% x( D
  17. void SysTick_Handler(void); ]4 z2 V  F9 L
  18. {8 l1 D; B6 Z) r: A8 g
  19.     /* USER CODE BEGIN SysTick_IRQn 0 */) c8 O4 o) h+ E2 J
  20.     OsTickHandler();
    9 C3 X! a2 Q  a$ M/ O
  21.     /* USER CODE END SysTick_IRQn 0 */) g% m" u8 |* z! `8 v' {1 d1 L
  22.     /* USER CODE BEGIN SysTick_IRQn 1 */* H. e8 i5 o6 ?" l
  23.     /* USER CODE END SysTick_IRQn 1 */
    6 k( E4 i6 e; L$ Z4 l
  24. }
    " g: q& B/ k6 ^( k1 I
  25. /*
    5 L8 A) r6 u& @( ~$ K9 k! J
  26. .........
    2 i9 ]- }- s7 l
  27. */
复制代码
! i$ J; q0 \6 A! ?) m
7.修改串口映射 Core\Src\main.c
3 M* E* }. ~5 {, P: \/ B" h0 @包含头文件#include "stdio.h", i& N2 ^& u! C; z: j: W1 H& `9 l
修改串口映射以支持printf( P4 n# _0 G0 o) `
  1. /* USER CODE BEGIN 0 */
    . \1 N4 }7 ~( K! H2 D
  2. #if 1
    7 u" P. L9 `1 N9 \0 o* _  |* Z
  3. int _write(int fd, char *ptr, int len)
    $ A- e8 X3 `: I9 r8 I
  4. {" @/ j( G0 c# x$ b! j
  5.     osStatus_t result;& F# w3 u% R* I+ l
  6.     osKernelState_t state;
    ' F4 N6 R. V4 q0 Q  c
  7. ' o! |. ?4 [! t8 k
  8.     if (osKernelGetState() == osKernelInactive)% b; |1 z, E2 u: A9 a2 S+ g( T
  9.     {
    ) z( M/ b6 K0 I) y
  10.         //系统未启动时不使用DMA
    # a8 Z# w% T8 s' B' y" b$ p/ W8 n
  11.         HAL_UART_Transmit(&huart1, ptr, len, 0xFFFF);2 a8 J% ^7 Q. h) L" Q6 o& x  Y
  12.         return len;0 K1 R( g. b5 Q6 K1 C
  13.     }9 i# w! h; r. W% X. J
  14.     else! ]  ~: |6 x' m6 R9 E2 l6 W
  15.     {7 A( }1 v! K9 L" G3 w
  16.         //获取信号,如果上一个DMA传输完成
    - c$ m1 C* q6 g0 ^
  17.         //信号就能获取到,没有传输完成任务就挂起  k/ R; G' ^% z7 ~
  18.         //等到传输完成再恢复
    + K! o" {/ d: T  e
  19.         result = osSemaphoreAcquire(UART1_TX_DMA_SemaphoreHandle, 0xFFFF);
    ! ]+ \, k3 V% f( l2 o4 S- M/ b
  20.         if (result == osOK)# |, [7 O' p0 R
  21.         {
    3 |% d# h& Y( {$ K& H, x1 y% `" ?
  22.             HAL_UART_Transmit_DMA(&huart1, ptr, len); //获取成功,发送数据
    : u/ A* V! Z/ O, b+ x* X
  23.             return len;
    $ E$ F$ G( O+ P0 k! X
  24.         }8 s6 x, U; {9 u1 T- }$ x; \
  25.         else! ]5 E2 [2 G& W) _* k6 L/ ~! C
  26.         {
    8 l' i3 Z8 U( q  s' y% b6 k
  27.             return -1; //获取失败# H  O. i# M' P8 h
  28.         }
    # P. D8 v: \' w& X: e" n
  29.     }
    : [4 a- O5 l0 m0 ~6 V) M& v% G7 q
  30. }
    / }+ r3 y. c" W
  31. #endif
    1 a0 f- T8 ]4 t, v/ r
  32. + e) H8 @' H5 {/ \5 v1 }, p
  33. // DMA 传输完成后会调用传输完成回调函数,在该函数中我们释放信号2 L* P1 P7 C) j3 c
  34. void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)# L! ]3 s5 O" c* V3 b  ~' Y
  35. {
    / j. E/ C9 _7 u) b+ G3 [+ a
  36.     if (huart->Instance == huart1.Instance), E* m9 ]( l3 W9 O& V; R8 I4 D
  37.         osSemaphoreRelease(UART1_TX_DMA_SemaphoreHandle);
    4 `, `7 A2 B4 p, o
  38. }' W2 D' Z4 G  X. B  `
  39. /* USER CODE END 0 */
复制代码
* `5 w; b% S3 [+ S- I( d+ |
8.添加测试任务 Core\Src\main.c
; p- t# O; o- q包含os头文件#include "cmsis_os.h"
9 i- }" s& T& r# Y+ I; ^增加测试任务
  k% u1 T( d7 h
  1. /*% c! A) q' p  u  V; U% Y4 M- R- u9 {
  2. .........
    5 |5 v7 p1 x% ^4 _  E
  3. */
    + p( v* G5 t6 z  m
  4. #include "cmsis_os.h"% U" g. `- ^  [+ r1 P# q
  5. /*
    1 ?. r0 r& z$ f+ ?5 @. I6 I. n/ z
  6. .........& C+ e, F6 l# }* ]& S# g
  7. */
    - a$ `5 \$ b9 [8 ?$ D! n' m' b
  8. /* USER CODE BEGIN PV */9 X' m8 n  x- i) }) z/ Y/ E
  9. osSemaphoreId_t UART1_TX_DMA_SemaphoreHandle;
    / {( Y; H# w* G$ a6 {+ Y1 q& |
  10. const osSemaphoreAttr_t UART1_TX_DMA_Semaphore_attributes = {; o; h* X( B1 W$ ~! f6 s
  11.     .name = "UART1_TX_DMA_Semaphore",8 p8 K$ [1 H+ `- H; h
  12. };9 z' d7 }. v1 p) t; z
  13. - f0 m  g7 [3 \9 I7 l- m! J6 b
  14. osThreadId_t uart_taskHandle;
    ( F- Y8 O  x6 i) I% X+ X
  15. const osThreadAttr_t uart_task_attributes = {( P5 r# C2 p+ r. _
  16.     .name = "uart_task",9 n8 {. f/ q- W7 |( T
  17.     .stack_size = 512 * 2,
    ( ~8 R* G7 A& B- K1 ~2 h+ D
  18.     .priority = (osPriority_t)osPriorityNormal3,# n1 y3 I! F$ Y
  19. };, O1 V0 H1 ?. T, Y' I' C1 m
  20. /* USER CODE END PV *// d) Y# X& g0 {9 _$ D6 D. W# c
  21. /*
    2 |% c1 r# S1 J- r$ \: D
  22. .........
    $ b& r, a% j( B6 R9 ^# J
  23. */# d4 N' ]" \! c
  24. /* USER CODE BEGIN 0 */! V- `7 q" U( E* `2 g, ~; ?8 b
  25. /*. B4 x& B+ R: ]4 H" \/ d9 i: r
  26. .........
    # a( t6 V5 A$ J4 s
  27. */' }5 c/ `! {) j
  28. void Uart_Task(void *argument)
    1 F8 ]+ z8 |9 v' B8 y9 u9 Q- S0 I+ k
  29. {, ]  q! h* d1 W$ U* _% o9 m" Y
  30.     HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
    , x# y3 T4 a% n; Q
  31.     HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);7 F5 a0 r5 G! C( X0 w% E# c, V$ T/ y
  32.     while (1)
    ) ?) A% A7 n* F
  33.     {
    6 h" R) D$ a. V7 Q! L; u
  34.         HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);  i# j/ j1 R, H; u
  35.         HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
    4 B: l: A8 d' d+ w
  36.         printf("System Runing!!!\r\n");
    ) z9 F' x9 u6 t8 Y# A: W. T% P
  37.         osDelay(1000);; _7 M/ _5 T, W9 Q8 f$ g! A; |6 D
  38.     }
    # S7 L7 l$ {; f/ t' c
  39. }
    , t  B) d! e' \: w6 w! P$ H2 L
  40. /* USER CODE END 0 */
    1 X3 h, Y; M! u8 K
  41. /*8 r, F. F2 c2 F( e+ B# u2 Q- _8 z
  42. .........
    9 M8 n2 y2 J6 Y6 ^
  43. */" g$ s6 \+ x- T  p% b
  44. int main(){
    ' `, Y6 w# G5 p4 K1 C7 z
  45. /*
    , Y7 M- V; `5 v% P+ G( F+ H
  46. .........7 e( r8 F' S/ i4 V6 \
  47. */1 d  J* z" y- x
  48.         /* USER CODE BEGIN 2 */
    9 ]' H" [3 T, p* o1 |
  49.     osKernelInitialize();
    . S6 ~3 t, w3 U+ S) W
  50.     printf("System Init!\r\n");
    - m: }1 A$ k# q
  51.     UART1_TX_DMA_SemaphoreHandle = osSemaphoreNew(1, 1, &UART1_TX_DMA_Semaphore_attributes);  J4 h4 Q' Z( M7 i* J8 w
  52.     uart_taskHandle = osThreadNew(Uart_Task, NULL, &uart_task_attributes);
    ! _4 Z/ m' T/ }$ H7 D% l; D" }& D
  53.     osKernelStart();
    5 k: N; u& i$ D1 S6 [2 p1 _
  54.     /* USER CODE END 2 */$ n( @/ P- H- t
  55. /*: \0 J) t( a' m# ~2 {' W
  56. .........) L7 F9 q& u/ _) O$ T- U
  57. */9 [# t" v+ L9 T7 B  Z, m
  58. }
复制代码
7 ]2 q, ~+ c2 w: s( r
5. 编译下载

( z( V% Z! S5 Y. J+ v1.使用make命令编译工程,这里的-j12表示使用多线程编译,可以提高速度,12表示电脑核心数。- u6 ^9 J) a! ]( s' L& A
make -j12$ V2 x+ P, Z3 h) F0 \

+ f+ R, z7 H9 v 7e029add83a944728b62c1e4c3c1bf56.png
4 Y. u1 D. J: a, E- a: x# M8 W0 o1 j
2. 使用STM32Cubeprogrammer下载位于/build中的固件STM32F429ZI_Harmony_LiteOS_M.hex' Z; R8 Z0 _3 z9 s/ `( T3 w0 j

! u, B# g! F- b1 e  A c8e0ecbdbdbc452f82a9fa4b3be27874.png ; J4 |3 [) H. y; \+ j4 R) j9 q

' w# T7 D! V+ v3. 观察到LED交替闪烁,串口助手打印出了调试信息。5 z# B' R; ?7 V" N' W

8 G5 I$ D5 L  J  h- @+ CLED 交替闪烁
! q- h- V5 i3 S' {' L2 p/ t7 d" W) X/ [* _  k' w
ec8d0b3743de44258ac76f833f276993.gif
, ]* A2 I- y+ m, N5 s) e. E5 K8 K3 p" j# q
串口输出信息
" ~0 b( U8 o* ?  z5 a' ^4 s% w' P, G9 R, \  O6 v' d1 F. {, T
533d2a9830454754a2eac9ff022256ec.png
; k4 j; o7 F) O2 ?0 X+ U- b& |! r' [9 W$ i' p* E
总结/ j& t$ S$ }5 J. u. q9 f
总的来说,移植的难点还是在于对 Makefile 相关工具链的理解与应用。由于有CMSIS_OS的封装,轻度使用时,与FreeRTOS感受相差不大。对新手来说使用FreeRTOS进行入门还是不错的选择,建议基本了解 FreeRTOS 之后再深入学习 LiteOS-M 并掌握二者之间的差别。9 [* p5 \) q# Y* m0 s! s) }! |
————————————————, @6 f2 d% l: ~2 z; k: ]1 @
版权声明:PeidzzZ
9 c% f! v3 q# K, J# J& p  j" \7 }  d6 T  o6 K) B6 f4 @
! W9 U% P. Z, g0 u8 @  z, J/ g
赞 收藏 评论0 发布时间:2022-11-16 19:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版