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

【经验分享】STM32F2X移植FREERTOS

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:03
1、要移植FREERTOS,首先要去下个,我是去直接下了个最新版的FREERTOS) G3 X1 d6 z8 [1 [( \- _; Q& ?8 F, ^
下完包里有source源文件与demo工程 文件,如果有符合的型号,可以直接移植工程,也省了建立工程;当然就算型号不同也可以直接移植,我这里是自己建立,走一遍,加深印象;
6 B7 _7 z( p' `9 R+ i. |% L7 z0 Y! H. w  W
需要的文件:
) w: |* F! ^8 y" e2 }6 a    FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。, D  a5 B& _" v( Q* g7 p' ~
    1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c/ ^* p) C' X4 Q
    该文件位于FreeRTOS\Source
, n) R7 M# R2 B/ S  d- V  g/ j    2)与内存分配有关的文件共有4个,分别是 heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。* _, i' `( I& w7 v5 K9 S
    该文件位于 FreeRTOS\Source\portable\MemMang
+ T7 D" h3 _& f& h    3)与移植相关的代码包括 port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。* S( [5 i( W3 g6 ], |# f& r
    该文件位于 FreeRTOS\Source\portable\IAR\ARM_CM3# C. e% I7 m2 N+ d! I
    4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。: F: s, |& W) k; Y/ r2 D
    该文件 FreeRTOS\Source\include: \# ?: w3 p% E" a7 C

3 e% t' m" ^7 C$ k. j当然我这里把所有的.C都包含进来了。
' W* |3 {5 i- y! }) U7 K; Z& Z  i$ ~; w) ~
20180708092307580.png
/ ?" w' c% y5 H

  E: i6 Z  S9 N3 B6 k2、接下来修改启动代码
6 z0 S9 O+ a+ V3 S! u: Y( h
( `, |5 q5 q8 S9 y2 f& E$ J由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。- H' }* J* R3 t, a! P$ l+ A6 O9 j

' e- K! A5 l' n# T6 x5 hPendSV_Handler、SysTick_Handler、SVC_Handler这3个函数在startup_stm32f2xx.s启动文件中,启动中需要 使用到这3个,而# ]8 K9 j+ n6 y, |' W, ^7 m

7 _, B( u8 Y5 D* {  ExPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler在portasm.s中,2者名称不一样,一般操作是在FREERTOSCONFIG.H里增加宏定义,如下 :
; P$ r8 a+ M9 n# U/ N, o: j  E' e
#define xPortPendSVHandler   PendSV_Handler
/ E$ c, P4 x0 v) E1 @' a9 L#define xPortSysTickHandler  SysTick_Handler7 x8 z& V2 b% G1 r

; g. F# Q: H: c' w& f#define vPortSVCHandler      SVC_Handler9 I" p% j9 l6 y9 Q# L3 k) L! v' H
1 G5 \& b/ W: n$ F7 W8 q/ R
当然在stm32f2xx.c中需要注释掉原来PendSV_Handler,xPortSysTickHandler;6 r0 L" W% U9 S3 z- ?) G- A1 ?

5 ~) \8 d4 ?/ z3、设置IAR配置
/ u: C( D, Q! [& V+ R7 ~; M6 p: Z6 k% L* v" x5 ?* r
常规的我就不讲了,最主要的就是选择好型号,配置路径如下# g$ e7 s. H3 a; J8 g0 X  j: S5 k

5 a0 S% E1 {$ g5 U2 ^' q0 D: x9 l
20180708095005989.png
0 T: Q2 F) Q0 t

8 b; ^* ~  _  E3 @& ]常规不用设置汇编,但此处需要对汇编进行路径定义,要不然编译会出错5 h# |0 M  _( ]# t
! @7 Z/ X% p; Q5 S5 m4 O) L* _
20180708095109125.png
1 o5 C$ l* ~5 x  N
. _/ _& R9 C2 p+ A5 }# O, X/ r
其它按常规的来就行了。+ O3 ~% f8 _4 x  r

* F& H$ K5 [) m3 Q4、配置freertosconfig.h
4 t5 V, y; R, T! J- u  A* G
; s0 {, n! M% ?8 \4 [! W对于用户来讲,Freertos已经提供了一个窗口给用户配置文件,即freertosconfig.h
1 g6 D3 K/ I! h( F0 @: _) F9 N, R
对于里面各项定义,自己可以查询百度下,其中:
4 ]* C; f8 ~2 ]  c" A5 o3 F4 y4 m/ h% f3 C
#define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )编译时需要声明,不然会出错;  x; {! D9 R9 y! P0 x/ d; H

( Q. {* ^; ~7 B  w( dfreertosV10.0.1此版本很多宏定义已经没有放置在freertosconfig.h,当用户需要用到哪个模块时,需要自己将宏定义放进来,如要用到系统软定时器组,需要自己添加 :
6 o0 N- t/ @2 a- u! c8 I
  1. /* set soft timers para. */
    . t0 @# `0 }) n. V
  2. #define configUSE_TIMERS 1
    & Y9 F3 q& Q( G1 h7 I8 |
  3. #define configTIMER_TASK_PRIORITY  2
    " t. B! P8 U. [! e) S  h) y
  4. #define configTIMER_QUEUE_LENGTH   3! U% \  ~3 ~2 `- [, o
  5. #define configTIMER_TASK_STACK_DEPTH    512% L3 q* y. v5 {& V: D

  6. , I: X! p) W2 b7 ^
  7. /*end of set soft timer para */
复制代码

! C9 u& I" i% T5、建立完整工程,调试
( Y# z9 K$ R$ u" A: O7 P* [) C/ d  k, F; s4 Y
上面配置完毕后,添加自己的工程调试;
( B2 P6 C6 X$ @
3 e+ d3 B! M' ]我自己添加工程如下:& x) F) H& o2 o& y( U3 J  x' o% Y! }2 M
5 E4 ~  G! ^2 I$ |1 z: R
20180708100301588.png

$ j9 P% Y' \0 Y/ w% i& C% O
( u9 G8 x$ x! N5 v接下来设置硬件初始化,添加任务,启动任务;
3 U# d- E; O% e5 J! W7 u5 m( z8 [" J( _- u/ y! o0 J* Y
特别需要注意的是,任务建立时,给任务分配的空间一定要足,刚开始尽量多分配一点,以免内存不足时,出现莫名其妙的问题,还不好找问题;我调试过程中,就出现了几次这样的问题,后来才发现 是空间不足;
3 R  N7 m; I6 w% V3 U+ _$ m2 ]# J: w! `% v0 H' m, s2 e# v

+ E# T" |3 U" y0 G% m/ G
赞 收藏 评论0 发布时间:2021-12-2 15:03

举报

0个回答

所属标签

相似技术帖

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