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

【经验分享】STM32F2X移植FREERTOS

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:03
1、要移植FREERTOS,首先要去下个,我是去直接下了个最新版的FREERTOS
1 u+ w/ v" V! S% x下完包里有source源文件与demo工程 文件,如果有符合的型号,可以直接移植工程,也省了建立工程;当然就算型号不同也可以直接移植,我这里是自己建立,走一遍,加深印象;
' R6 e* `. m/ j2 p8 q
/ d( k9 ?& [# j' }需要的文件:( C5 q5 v% K! ~3 }9 p' K( v2 `* @
    FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。
6 ]. g. K2 ~8 y+ z    1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c
; t$ e& y$ Z( B& E5 r3 F    该文件位于FreeRTOS\Source, J: t) v3 _; @8 h; \
    2)与内存分配有关的文件共有4个,分别是 heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。7 Z/ d; X( K7 F. s' E  p: p
    该文件位于 FreeRTOS\Source\portable\MemMang
8 ]% `# n& k0 L+ m0 Y; `8 B+ ^. P    3)与移植相关的代码包括 port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。$ ?7 p- E2 o* \% v4 L( I1 P) R
    该文件位于 FreeRTOS\Source\portable\IAR\ARM_CM3
* f! {& g% {4 [, F5 M) T) P! u    4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。
2 g/ u2 P5 X2 B$ [/ q3 x    该文件 FreeRTOS\Source\include8 l, I9 ~, h0 R6 H- |

9 q: |" [9 R$ m) i; D当然我这里把所有的.C都包含进来了。
  b/ {( e$ n" ]( U
$ Z7 d9 h0 y! F; l
20180708092307580.png
! Q, c" ?/ }4 U6 C3 }, M2 b/ a

2 s: h3 P6 V) Y/ o2、接下来修改启动代码2 @; c; |* }9 z8 n# v

5 K7 B+ ?2 O- F3 X" H' n由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。
$ v# ~2 f; k7 D; |0 z6 J0 ]8 Y0 \0 C( p
PendSV_Handler、SysTick_Handler、SVC_Handler这3个函数在startup_stm32f2xx.s启动文件中,启动中需要 使用到这3个,而
7 V* [7 w3 r* p% k. h& A& `5 Y$ ?" B
xPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler在portasm.s中,2者名称不一样,一般操作是在FREERTOSCONFIG.H里增加宏定义,如下 :
* B( H" w  s! a! b* C) o
5 t  n; f; q0 S; I' y#define xPortPendSVHandler   PendSV_Handler0 G7 w6 L% Y6 R7 s7 K; D; Z% I
#define xPortSysTickHandler  SysTick_Handler
6 Q$ F" j2 ~8 N. H
( {, ?$ W6 L6 ?#define vPortSVCHandler      SVC_Handler
5 y0 t: Q( q! \9 B4 ?4 G$ J1 ~5 R. h% W1 G
当然在stm32f2xx.c中需要注释掉原来PendSV_Handler,xPortSysTickHandler;% x( k) ~5 Z# @( y4 B0 m

$ s9 \) T3 a+ m0 J& x3、设置IAR配置
: C, k9 p8 l/ E  K( I$ }; @
- D- ?8 o! Y# |+ k( f3 b常规的我就不讲了,最主要的就是选择好型号,配置路径如下
! K# j& W# B/ \% u* E- g  K
5 P% L. V# C" S. P  {6 q
20180708095005989.png

8 D  m8 k/ W0 I; Z
5 u: a" H$ O/ h1 E; {! }1 d4 m常规不用设置汇编,但此处需要对汇编进行路径定义,要不然编译会出错
) {3 E1 Q8 a- V  ^8 W8 @2 l5 d+ O
; D$ L  S1 w/ m
20180708095109125.png
, c: f2 E% e/ m3 {$ w
' \; f5 K4 J% |; t
其它按常规的来就行了。$ V5 M. x- i6 c3 a  K5 ^, p' R
! M. x7 l! v; v$ ]
4、配置freertosconfig.h
" l, L) h. S  z( i: m. `! R- A- P6 `8 ~! f# h2 i; G% v# p% |3 U5 G# D
对于用户来讲,Freertos已经提供了一个窗口给用户配置文件,即freertosconfig.h
- L* L" @: v. a7 l' {
9 P/ `& y6 r9 M6 B对于里面各项定义,自己可以查询百度下,其中:
" D/ \5 l% j$ u. g- f7 ~) t4 B6 [! Z. R4 Y* M* @
#define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )编译时需要声明,不然会出错;$ }' n: {7 y; B0 ~+ E

2 Q$ W$ h- y0 @+ G4 zfreertosV10.0.1此版本很多宏定义已经没有放置在freertosconfig.h,当用户需要用到哪个模块时,需要自己将宏定义放进来,如要用到系统软定时器组,需要自己添加 :; b5 [% d  w' ~% u! T. z
  1. /* set soft timers para. */
    ' @. @3 I/ k8 B( r& G1 w/ \
  2. #define configUSE_TIMERS 1
    4 T) \8 o' }7 Q8 {$ j" D+ @
  3. #define configTIMER_TASK_PRIORITY  2. y) C2 ?" ~& V4 w! I; D) C; ~
  4. #define configTIMER_QUEUE_LENGTH   3+ u3 P3 R3 k# g. C7 M* P2 C. m* q& m
  5. #define configTIMER_TASK_STACK_DEPTH    512# J7 P2 j+ m* I* [# w# I! X1 b5 E
  6. 6 M5 S6 N  A* V
  7. /*end of set soft timer para */
复制代码
. I9 y$ O- ~' l% x
5、建立完整工程,调试; d5 T) i; n1 s  @$ O
; J0 _$ o; K9 n' `' g
上面配置完毕后,添加自己的工程调试;
4 e; y9 Q6 b4 O- n/ a6 h! R' S
2 ~" E1 _+ k' ~我自己添加工程如下:/ O' Y  P, i, {

/ P. X6 q/ \+ b$ H! x) y
20180708100301588.png
  e8 c8 z9 z( Y2 K

4 q, j! {9 \5 s1 n5 g- W6 w8 @; A& ?接下来设置硬件初始化,添加任务,启动任务;
  f2 L1 ^7 x9 j3 n, U$ ]  U+ y8 F# q" c$ F
特别需要注意的是,任务建立时,给任务分配的空间一定要足,刚开始尽量多分配一点,以免内存不足时,出现莫名其妙的问题,还不好找问题;我调试过程中,就出现了几次这样的问题,后来才发现 是空间不足;9 o7 o' ~2 Y/ [" h) o
8 r4 P& _) {+ L, Q8 ^8 O

  b" N% M$ E7 \5 P; K
赞 收藏 评论0 发布时间:2021-12-2 15:03

举报

0个回答

所属标签

相似技术帖

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