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

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码9 o- ~$ [& \$ V$ D. ^1 f
下载FreeRTOSv9.0.0.zip解压如下图+ K' j% F: x1 M7 a7 g

. t+ ^$ H3 W/ J4 K
19e323b668614914b5ff1c3650318367.png
# o1 I3 f: J9 m) r9 C2 w+ b
+ L4 d+ n! i( i# Y/ H1 u/ D$ r/ }8 @4 s
只用关注第一个文件夹FreeRTOS中的内容- {, [1 [2 J) B+ v6 l
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。& t5 u; E3 V9 @6 g: }1 K# g4 k! r
Source是源文件。4 z% {  o& A. y2 M( F  L3 I
3 `: N( B/ H* O; I

! j- x2 ?6 f) j" C2.拷贝源码
6 X" K! o2 Q2 L4 I4 P在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
( {' p6 O: Z8 m# c2 |1 Q* l0 ]# V将Source/include文件夹拷贝到FreeRTOS下" L3 f3 ^* v: A' ?, l9 G$ `

5 p: F6 x9 K5 t! a5 b
0e6a2341df8d4aebbfc03d0c85c6f52b.png
0 i" ?) q& s. j; n+ B8 i3 Z/ _, K0 b
& l2 J' W2 w+ Q
将Source中的C文件拷贝到FreeRTOS/src下
* F2 k8 `( d& W  z8 S
2 N) j) ]0 E* k# y1 |) I' x7 b
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
8 R; ]! n: O. b) t
4 s& A* j1 {8 j
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
1 `4 y- X6 z' a  O  p" f- @+ E5 v' F, a. X7 h- b  G
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。+ \2 _, {. L6 G3 I- D, e& m
9 C) U& E) S- A' ^
3d367e236be94ca5ae616b13bd3072ec.png 2 J' L- G2 p. p9 v+ Q
3.添加到工程
% B) ]& h- Y9 x
" z. |0 ?, H8 j
2529a830445449c6ae890e724efa39fe.png 9 b$ y  c1 b1 S8 D  F: F6 Z
& ~) h' z6 F7 m: ~' b5 z/ l2 R
新建FreeRTOS/src和FreeRTOS/port组2 t; S' L* F, e! a& }% ^8 q: l9 e8 O
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
1 L$ K& R8 y" H* ~FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
0 k8 e4 K( f/ k' ?FreeRTOS\port\RVDS\ARM_CM3中的port.c
6 O7 N" a" D4 M' ~) C8 t; [# x- y0 Q; c2 f

7 `" ~4 h$ \3 L添加头文件路径1 }' X1 j* ?0 W  s/ Z
8 i! [: E  D5 C) F! G
ae4795e36a2d44f09b120be18c5d4c56.png 5 ]) O; G6 G7 T" R6 ^$ l7 G

  p- m) Q7 r! q1 f" S! o拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
; n2 |; r. ^2 S5 M0 z1 n8 \- N
# G7 s- }' R6 n( h- N' r7 \
! a+ k: |* O( C
4.修改配置
. [% v1 `8 p" n4 F在FreeRTOSConfig.h中添加% {. c# m1 l9 v0 Z
  1. #define xPortPendSVHandler         PendSV_Handler
    / X6 M' }' U' H5 W/ _. D
  2. #define vPortSVCHandler         SVC_Handler
    / c- J' v6 q) t, {2 @! B  L
复制代码
+ z( O7 d( F$ [% J! ~  D6 g
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断1 ^4 `/ k5 {, ~, r3 \
/ h/ u" l" z* O$ A! C2 |
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
* m# {& Z: R% x5 V
  1. /**
    ; H# @, Q: e& `& I. K3 F0 P
  2.   * @brief  This function handles SysTick Handler.
    , Y3 A( |$ F! x4 J0 \  k" X( J0 q
  3.   * @param  None; u- E$ d- B  e0 |) ]
  4.   * @retval None' F6 u1 I- {( q7 v, V/ {
  5. */
      a& Y$ ^, j* u: ^  a3 V3 c, f
  6. extern void xPortSysTickHandler(void);9 t0 _( F1 l: L! j
  7. void SysTick_Handler(void)
    # f' \2 G9 Y6 E+ M- _. V, o
  8. {9 K; y$ V0 |1 B, V, l+ c
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    % l# H  ?  Q$ b8 d% O, M8 z" e! o3 W; l
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)0 D3 ]% g1 Y+ [- P
  11.       {! b: I. F* P* {( X- q. F8 G
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  * q7 o, ~  \, I: i* }3 D! t. ]
  13.         xPortSysTickHandler();) m  E2 X. u# d8 m6 M
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    $ G1 Q4 e9 N( x" W! ~+ j) @! b" J9 u
  15.       }! \+ A" l! h+ n' b6 f3 B0 Z
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */: h4 r: i( |& x' I7 |
  17. }
    * ?# T# ]) ?. Y2 B
复制代码
8 y: v6 X1 T( n; @8 E5 R. p- t/ g

" G  I, \3 e3 b5.验证demo
, T' F6 \. J3 [3 o1 s, `% D# W
  1. #include "stm32f10x.h"6 L, c, v9 I' q& B" n" A: d8 O
  2. #include "FreeRTOS.h"2 U5 D% O& W7 R3 Q0 N6 u3 G) l
  3. #include "task.h"7 w" C  f+ c/ B8 U
  4. #include "portmacro.h"; b( b7 z5 c( I0 t1 Y
  5. #include "bsp_led.h"  
    3 D, g4 `4 F0 W0 @  V
  6. #include "log.h"
    9 c7 y+ w1 x1 |0 X' @

  7. 8 J6 R9 r0 R0 r$ Y
  8. static TaskHandle_t led_task_handle = NULL;
    : C5 [( o  M- s- a7 ^. s, o- q6 \# J

  9. ! j- `& C2 A, X) Q2 b
  10. void led_task(void *arg)* s( W3 y/ M2 e: v1 O3 F  B: i
  11. {
    % V0 t6 T5 G2 u9 `
  12.         while(1)                           
    ' D" ]7 {( U2 T4 U& x% d$ w6 U! i
  13.         {1 \7 T" d4 ^- Q4 a) K7 l4 t2 a
  14.                 led_status_set(LED_STATUS_ON);
    5 n" ?3 g5 E  b1 K& b: K2 c
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");. ~' f; f. E0 l7 I+ ?& P" c
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);
    7 T" i# W* q4 P$ C* D  u
  17.                 led_status_set(LED_STATUS_OFF);
    ( ^6 M/ E* L& j' K
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");0 i, @# Q* [/ @( P9 m
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);
    3 c# a! }( v' n3 V' V) t
  20.         }
    5 t( c) t/ d" x* h
  21. }
    8 {6 j( G1 N4 i3 \+ A

  22. % g0 Y0 o' M9 ~: K' R3 c6 B- b5 O9 Y
  23. int main(void)
    ; K4 ~. Q; i7 C8 Y$ g
  24. {
    - l+ A" I4 a$ _" G- r
  25.         led_init();
    , y1 T6 R/ V' o) Y
  26. + d; `0 x$ [3 O! y1 R
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
    ' F' Q, Z( A2 Q2 d
  28. 0 s8 E; Q& ~) o1 t
  29.         // 开启调度  D5 g$ R# ?0 v& \  h. t, c
  30.         vTaskStartScheduler();, O3 V! C4 R* `, G7 {; W
  31.         while(1);4 d* r9 X( C! M
  32. }
    " q+ g6 D5 S3 u
  33. 9 G% h& z5 o6 [7 Y  ]4 L* v
复制代码

6 l3 M" o6 y8 L- g' v( O3 u  e$ [' t- Q: `0 {
6.完整工程- Z+ j/ n( Q* W$ P2 V
& v, W3 w4 }2 @2 x
2ea8ac08b3934dfb89592333f3832937.png
+ e( |! x7 Y0 A  k. f6 M6 k# R* I" I0 P
& u; L: l0 ^& k; f8 ?$ j# ^
————————————————
; a$ [; u% u7 B; g: w版权声明:无聊到发博客的菜鸟3 s8 G/ w* `8 l& I' i- h( `; n; x6 L
如有侵权请联系删除
9 k& }$ H/ b! [* f* Q6 u$ K/ J- j* j  C! q) e+ i; b+ W
9 V% s" ?) \. `3 h/ w
  q. {. {9 C9 J2 g# o' b: G
652df39d09bf4de399b0792b897a4205.png
收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版