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

【经验分享】STM32F2X移植FREERTOS

[复制链接]
STMCU小助手 发布时间:2021-12-2 15:03
1、要移植FREERTOS,首先要去下个,我是去直接下了个最新版的FREERTOS( w, C+ A" i& G2 `! e% N
下完包里有source源文件与demo工程 文件,如果有符合的型号,可以直接移植工程,也省了建立工程;当然就算型号不同也可以直接移植,我这里是自己建立,走一遍,加深印象;7 I4 a1 A! ]8 b; S4 ^
7 M( V& H; x( H
需要的文件:: W( f+ q) a. t7 _
    FreeRTOS的文件结构非常简单,移植或者版本升级替换也非常方便。
- e6 X8 a( b: i    1)与FreeRTOS内核有关的文件数量仅为3个,分别是list.c queue.c tasks.c2 m9 S9 {5 v) z: C
    该文件位于FreeRTOS\Source$ @* L# m* ^- o  M8 F1 E1 \
    2)与内存分配有关的文件共有4个,分别是 heap_1.c,heap_2.c,heap_3.c,heap_4.c。4个文件只需选择其中的1个,STM32选择heap_2.c。/ p9 n+ h- C& X4 s. @! m
    该文件位于 FreeRTOS\Source\portable\MemMang
6 j5 o! S/ k1 j$ ]& N    3)与移植相关的代码包括 port.c,portasm.s,portmacro.h。这些代码不但和编译器有关还和平台(MCU)有关。FreeRTOS先以编译器为大类,然后再以平台(MCU)为小类。在这里选择IAR编译器,平台为ARM_CM3。
2 f7 i( U2 q5 _' R& I- ]; x    该文件位于 FreeRTOS\Source\portable\IAR\ARM_CM3; g; C+ k9 b9 A  R
    4)除了上述内容之外,还包括FreeRTOS内核相关的头文件。
1 E+ ^' u% I  i& Q    该文件 FreeRTOS\Source\include
% v) l3 t# }* h  X( s( O0 G- X4 x' Z3 M2 Q( [6 i
当然我这里把所有的.C都包含进来了。- g$ m8 Y( {6 c. D6 N* s2 K( t
% v0 M1 d7 Z9 A/ \, a
20180708092307580.png
; s$ X6 Y9 s/ j# M/ _2 s4 D/ n; }
3 b$ g& _2 v* m& m( ?2 o$ {/ o
2、接下来修改启动代码
' [4 ], c7 R- ]% ?' _, M- h+ M! K' J2 E
由于SVC_Handle,PendSV_Handle和SysTick_Handle在portasm.s中被重定义,所以需要在启动代码中修改这些中断向量的名称,并声明这些中断向量为外部函数。这也是初次使用FreeRTOS容易范的错误。
, l+ j( U+ @  k3 n" ?$ j* L
  a! {8 e# L6 I9 S& D2 MPendSV_Handler、SysTick_Handler、SVC_Handler这3个函数在startup_stm32f2xx.s启动文件中,启动中需要 使用到这3个,而8 f/ j, \% E  d! U  j; y" V
# B, k8 r4 A) _1 ~$ y0 E7 @2 F
xPortPendSVHandler、xPortSysTickHandler、vPortSVCHandler在portasm.s中,2者名称不一样,一般操作是在FREERTOSCONFIG.H里增加宏定义,如下 :5 r$ c- g* P- V2 S7 y9 ^  O
+ {! l( O/ n' N5 X3 v
#define xPortPendSVHandler   PendSV_Handler4 b! f/ h2 C- A/ {* J
#define xPortSysTickHandler  SysTick_Handler- m2 J0 y; n& M5 ]& |% ^' u5 z
, R; p- }9 R/ f- k
#define vPortSVCHandler      SVC_Handler
8 q1 b- u2 H! k. ~) N* i( U- q- j" z6 {
当然在stm32f2xx.c中需要注释掉原来PendSV_Handler,xPortSysTickHandler;
  y7 r8 C; R; [+ z. v
" ~' r$ Y6 q8 m1 l3、设置IAR配置$ a* c! k. O5 W/ t( v2 Q, N6 s

% _4 q0 A/ q/ C4 ~  N1 m9 o! s常规的我就不讲了,最主要的就是选择好型号,配置路径如下
: q) X* n% h' ?6 q+ s
4 f" U. e9 E8 |" Q
20180708095005989.png
) C9 N: P, N' P. R0 L

' H7 j9 K" c$ O. ]2 L常规不用设置汇编,但此处需要对汇编进行路径定义,要不然编译会出错0 W0 \2 Q$ o# p' f  X. P; F
4 C1 J( P# ^; |0 R- v
20180708095109125.png
$ x* z' z1 X4 R+ J
3 i0 }+ m! N/ Y; w$ Y
其它按常规的来就行了。( a2 V$ r; c4 }: g3 B1 _

" Q  t7 x- b' d+ k3 X" ~" G4、配置freertosconfig.h9 i2 O, I) S2 H% x  E
0 U3 b  E0 Z( M: Y3 V5 o
对于用户来讲,Freertos已经提供了一个窗口给用户配置文件,即freertosconfig.h' v: i! S2 [3 f2 d3 E. i
5 p6 f! p) s, s" ]' A
对于里面各项定义,自己可以查询百度下,其中:
- Z* @% Q& @$ w+ {% y' D1 a4 A9 u# J) h* ~
#define configCPU_CLOCK_HZ ( ( unsigned long ) SystemCoreClock )编译时需要声明,不然会出错;
. F+ E8 b/ j1 r3 |2 p* B! i8 x$ ]
: p; V6 n5 w2 [4 ~' s% I5 m% t* YfreertosV10.0.1此版本很多宏定义已经没有放置在freertosconfig.h,当用户需要用到哪个模块时,需要自己将宏定义放进来,如要用到系统软定时器组,需要自己添加 :
+ d3 [- }2 ^* ?: w+ ]; r
  1. /* set soft timers para. */
    ( Q  f7 g' F8 C
  2. #define configUSE_TIMERS 1
    7 w5 \5 G( r8 V/ Z% [0 M
  3. #define configTIMER_TASK_PRIORITY  26 A4 d3 _0 L2 ^% J7 `0 E) n
  4. #define configTIMER_QUEUE_LENGTH   32 A: Y9 q' t/ A- f% p; a' d8 ~
  5. #define configTIMER_TASK_STACK_DEPTH    5123 D/ v% L0 R& T" Q& |; {, q

  6. ) g- C" u! E  q( B9 j4 I" j8 [
  7. /*end of set soft timer para */
复制代码
: }* V7 [4 m- l9 _
5、建立完整工程,调试' V! e; }* X( |4 u
) m3 n+ h+ l7 \$ @
上面配置完毕后,添加自己的工程调试;
: H7 I2 y* k( l
- y; |. p+ T2 S- c$ N$ d# _; f  V我自己添加工程如下:4 t; H0 c4 l* b& @. {, p6 n

. R. o) n* t$ J% O: Q+ L& a. v
20180708100301588.png

9 l, F+ O4 M1 U4 `" V9 Y% P" q
( f) k# f, m7 L- l3 N接下来设置硬件初始化,添加任务,启动任务;  x/ @& r2 ]  H" h7 M/ w

6 G2 b6 F" c! B2 U; k5 G特别需要注意的是,任务建立时,给任务分配的空间一定要足,刚开始尽量多分配一点,以免内存不足时,出现莫名其妙的问题,还不好找问题;我调试过程中,就出现了几次这样的问题,后来才发现 是空间不足;7 ?. M2 c8 C% j9 v4 }

) g( F1 u0 }% X  A8 x+ j0 _" f( t- \+ g% L+ V
收藏 评论0 发布时间:2021-12-2 15:03

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版