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

STM32F407 COSIS-RTOS(原RTX)入门教程

[复制链接]
aderson 发布时间:2017-5-9 15:51
先申明我也是RTX的初学者本教程参考了:安富莱RTX教程iChamber的博客3 H! B. C8 ]& V
硬件平台:STM32F407IGT6核心板1 `5 d' A* Z- _, q
固件库版本:V1.0.2
2 Z4 o% q. b4 ^软件平台:MDK 5.21.1.0
/ |, N4 v4 b- a调试器是:JLINK9 `) c2 T0 s" W6 |& ?7 O
选择RTX的原因是:小巧,速度快,移植方便(基本不用移植)
  F( I5 S. S4 I* G# X
& ^2 q5 T) [% x+ |  l  E  j+ f4 |1 {
; `' {+ i7 [7 g/ v
' o8 N- |3 j' U# ~! B8 Y! _8 ?
" B3 _6 [& S/ R: ^5 ~" s/ |2 e) S
在使用CMSIS-RTOS之前,请确保你有MDK有RTX的license或者是专业版的MDK的license,否则会报错,这个教程的目的是使用RTX,不是去分析RTX的源码所以不会去分析RTX的一些细节部分,我只是写下我的学习笔记供后人参考。9 r' r# U- p, L/ Y, T" f: y; u
先建立一个工程这边不再多说,在最后我会贴上我的工程,我的工程是从安富莱V5开发板上搬过来的,修改了部分LED的管脚达到第一个实验的目的
+ C" @; O" y) q# _5 `1.设置Manage Run-Time Envirsnment,勾选CMSIS->CORE,RTOS(API)->Keil RTX,然后确认9 x( I+ T8 f/ G# U2 A: o8 @+ M
p1.png
! b" W% S# p8 r- v, }5 L( F- a之后工程栏会出现如下的一组Group* [$ o" C5 A) W" d
p2.png " M6 K8 [3 T7 \# Q( p
确认无误后可以开始编译,没有问题的话,应该是没有错误的
/ y" h  w4 Y  z+ A& \6 I* E$ A" VRTX的配置项全部在RTX_Conf_CM.c中,双击打开后选择. i5 _- e# @& _4 }
p3.png
( L8 G, g8 S1 C/ m* {. Q. F这边是RTX的一些配置文件,暂时先不用设置,就这样就可以
3 N' z& a, M8 ~0 C/ I, f" Q2 i6 d
  1. #include "bsp.h"
    2 J8 e! {( f+ B& ~
  2. #include "cmsis_os.h"/ M4 B5 }5 ^, s1 a7 s3 |$ p
  3. 7 b, a' r% L: h* S
  4. void Led (void const *arg) : q% t4 p$ j, L/ D
  5. {
    * N8 P% P3 r4 _( c9 f  u. I
  6.         for (;;)
    ! C# C+ Y! ?& V
  7.         {
    * v% v; Q/ V$ ^/ V1 Q
  8.                 bsp_LedToggle(1);
    4 {9 P' I0 F$ @1 L8 b
  9.                 osDelay(100);  /* wait for 100ms   */       
    , A- M6 e& y  r0 K* J; s
  10.         }
    2 K9 ?8 y6 H  _
  11. }5 C' P1 s8 Y; l$ R! ^: o

  12. / k% U7 c/ i: |2 x6 V" c' k1 r
  13. void Led2(void const *arg)1 t/ ^3 s* X- I5 H" w# C
  14. {" o" N# u: j! \( z# ]
  15.     for(;;)8 P3 ~! p. l  q$ p
  16.     {% |9 k+ h& |0 g: ^( k; n
  17.         bsp_LedToggle(2);6 O$ T+ ^4 W- K( X
  18.         osDelay(200);
      H# b1 Q* I* {# U
  19.     }1 i" j# J2 i( ?( h, b
  20. 0 P  g& G) W6 C- K  t/ Q% |
  21. }
    - j2 P5 H) d# o/ _  ]! g1 E
  22. 4 {+ A; B$ P& }% C" M. K" Z
  23. void Led3(void const *arg)
    , A) i. v) n5 x+ W0 X' [9 d
  24. {) V+ x. f& ~, N% X$ D3 x) x
  25.     for(;;)0 D% E8 s- E7 l# `# E
  26.     {9 G  S; q. y. {  i: r- G3 c/ }
  27.         bsp_LedToggle(3);4 P& [8 F  N/ K( R  C  d( @0 L) f
  28.         osDelay(300);) S6 m- d6 b2 q
  29.     }
    ) A& w5 G. v7 ~$ Y: j9 Q/ }
  30. }
    3 |/ h; o) S6 `- [
  31. osThreadDef(Led2, osPriorityNormal, 1, 0);/ ~$ \: \7 x4 z
  32. osThreadDef(Led3, osPriorityNormal, 1, 0);
    : F' H3 j- n5 J- U% o7 n
  33. osThreadDef(Led, osPriorityNormal, 1, 512);
    . `* v, z: C& a5 N2 l6 v7 {8 x8 z
  34. * E# v1 b+ J* I8 l
  35. 6 w5 U' G2 K! M! K  W7 f& O
  36. int main (void) {9 S: B* U1 a6 b3 }% K5 S
  37.     bsp_Init();//初始化了GPIO9 `# z) A# @/ o( z7 ^
  38.         osThreadCreate(osThread(Led), NULL);
    * Q' r7 K* l; K- \) S0 e
  39.     osThreadCreate(osThread(Led2), NULL);- Z) m- \; @5 P7 p7 q: N; G; k
  40.     osThreadCreate(osThread(Led3), NULL);9 ]! ~8 ~% o0 _3 C( `
  41.     osDelay(osWaitForever);
    $ k" S3 b$ L( x) C5 Z/ ^- o
  42.   while(1);# o6 ^, E' U( A" R: {
  43. }8 g2 `. D2 f0 C7 |: p# \
复制代码
这边初始化了三个线程,线程是由osThreadCreate这个函数来创建,在线程创建的时候是可以给他传一个参数,因为这边我不需要传参数所以直接NULL即可。创建线程的时候一般还需要给该线程分配一个栈,用来保存上下文信息,线程栈是由线程结构体来分配的osThreadDef(Led2, osPriorityNormal, 1, 0)最后一个参数0就是栈的大小单位为字节,如果写0的话,RTX会为该线程分配一个默认大小的栈。因为RTX是Keil自家的,所以调试时非常方便,首先编译以上的代码然后打开调试
9 \6 M% ^) G# a
* ]2 ~5 o0 w- v0 `
p4.png ; i$ _- m5 N% G
将system and Thread Viewer勾上,Event Viewer在我这边是无法使用的,各位可以试一下,提示一下这个是需要用到SWO这个接口的勾上以后还需要将View->periodic window update勾上,然后界面如下图所示
. R, B& |- f# d# Q4 X; U% F p5.png
& s( z! ?9 U. V" |$ g3 ]4 `
4 W: V1 R5 ^) u% G+ H4 f然后点全速运行,线程预览窗口6 b, D. Z) g- `' j* }
p6.png ! l! s: O! W' N! Q) q; W- B9 J0 k1 y
可以很方便查看该线程的运行的状态,和优先级,还有线程栈的使用率。到这边的话,这个调试功能只有RTX才有,其他的RTOS必须要使用其他的收费辅助软件才可以查看
( h! N) J8 \0 f/ M$ W) A2 { p7.png
$ p, A- b4 }' }9 I/ v+ s, K这是三个线程的IO翻转操作,可以看到三个IO几乎是同时翻转,测了下,两组波形相差了2.79个us,之前也有用FPGA做过,那个是完全没有延时的。3 `" y- |- l$ m- f! v

) I7 Q, K! h* l- f

1 @- S" r* p8 |3 e4 I5 c' I——————————————————广告时间——————————————————————4 S! c9 b, F/ l) ~2 k
IMG_1383.JPG ( W& F% e+ D3 \& D$ Q
这个是我做一款调试器,带有一个JINK和两路串口还有一个逻辑分析仪,除逻辑分析以外只占用一个USB接口,可以用公头或者MircoUSB线,以上的代码的仿真调试,小波形抓取,只使用了这一个调试工具,有需要的可以联系我QQ:1501873752; A8 \9 C& }" ?$ n9 {4 z
收藏 4 评论5 发布时间:2017-5-9 15:51

举报

5个回答
qianfan 回答时间:2017-5-9 16:24:28
逻辑分析仪兼容salease的?
aderson 回答时间:2017-5-9 16:46:40
QianFan 发表于 2017-5-9 16:24
1 \/ o, m. O- Z% R' Q# n! n逻辑分析仪兼容salease的?
, o2 C8 r4 r) r# y: j/ N! C
嗯,
huaiqiao 回答时间:2017-5-9 20:48:39
keil5自带的这个RTX,有个不好的地方就是他集成在了mdk中,需要添加。。。。。: A' d4 ]0 Z: ?( c
好像不能在工程文件夹下,不能将RTX相关的库啊之类的保存吧?我记得
aderson 回答时间:2017-5-9 20:57:36
huaiqiao 发表于 2017-5-9 20:48/ z" q0 _. I4 R( E2 u
keil5自带的这个RTX,有个不好的地方就是他集成在了mdk中,需要添加。。。。。
2 [% t* S4 l0 w3 f0 J/ O+ L% M3 K好像不能在工程文件夹下,不 ...

7 t0 _, o- M. E# U8 D* e, @可以啊,公开源文件的,不过现在换成CMSIS RTOS API全部换了
huaiqiao 回答时间:2017-5-11 22:45:16
adersonl 发表于 2017-5-9 20:576 C+ a5 v5 S9 N. p5 B( O% P
可以啊,公开源文件的,不过现在换成CMSIS RTOS API全部换了
8 X  |% A4 T/ ?* e2 V
是的呢。
+ u2 G  y2 ?7 y' ^) M' v* J  B9 s+ Q: y, s1 \' I) y1 U' T
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版