先申明我也是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
! b" W% S# p8 r- v, }5 L( F- a之后工程栏会出现如下的一组Group* [$ o" C5 A) W" d
" M6 K8 [3 T7 \# Q( p
确认无误后可以开始编译,没有问题的话,应该是没有错误的
/ y" h w4 Y z+ A& \6 I* E$ A" VRTX的配置项全部在RTX_Conf_CM.c中,双击打开后选择. i5 _- e# @& _4 }
( L8 G, g8 S1 C/ m* {. Q. F这边是RTX的一些配置文件,暂时先不用设置,就这样就可以
3 N' z& a, M8 ~0 C/ I, f" Q2 i6 d
- #include "bsp.h"
2 J8 e! {( f+ B& ~ - #include "cmsis_os.h"/ M4 B5 }5 ^, s1 a7 s3 |$ p
- 7 b, a' r% L: h* S
- void Led (void const *arg) : q% t4 p$ j, L/ D
- {
* N8 P% P3 r4 _( c9 f u. I - for (;;)
! C# C+ Y! ?& V - {
* v% v; Q/ V$ ^/ V1 Q - bsp_LedToggle(1);
4 {9 P' I0 F$ @1 L8 b - osDelay(100); /* wait for 100ms */
, A- M6 e& y r0 K* J; s - }
2 K9 ?8 y6 H _ - }5 C' P1 s8 Y; l$ R! ^: o
/ k% U7 c/ i: |2 x6 V" c' k1 r- void Led2(void const *arg)1 t/ ^3 s* X- I5 H" w# C
- {" o" N# u: j! \( z# ]
- for(;;)8 P3 ~! p. l q$ p
- {% |9 k+ h& |0 g: ^( k; n
- bsp_LedToggle(2);6 O$ T+ ^4 W- K( X
- osDelay(200);
H# b1 Q* I* {# U - }1 i" j# J2 i( ?( h, b
- 0 P g& G) W6 C- K t/ Q% |
- }
- j2 P5 H) d# o/ _ ]! g1 E - 4 {+ A; B$ P& }% C" M. K" Z
- void Led3(void const *arg)
, A) i. v) n5 x+ W0 X' [9 d - {) V+ x. f& ~, N% X$ D3 x) x
- for(;;)0 D% E8 s- E7 l# `# E
- {9 G S; q. y. { i: r- G3 c/ }
- bsp_LedToggle(3);4 P& [8 F N/ K( R C d( @0 L) f
- osDelay(300);) S6 m- d6 b2 q
- }
) A& w5 G. v7 ~$ Y: j9 Q/ } - }
3 |/ h; o) S6 `- [ - osThreadDef(Led2, osPriorityNormal, 1, 0);/ ~$ \: \7 x4 z
- osThreadDef(Led3, osPriorityNormal, 1, 0);
: F' H3 j- n5 J- U% o7 n - osThreadDef(Led, osPriorityNormal, 1, 512);
. `* v, z: C& a5 N2 l6 v7 {8 x8 z - * E# v1 b+ J* I8 l
- 6 w5 U' G2 K! M! K W7 f& O
- int main (void) {9 S: B* U1 a6 b3 }% K5 S
- bsp_Init();//初始化了GPIO9 `# z) A# @/ o( z7 ^
- osThreadCreate(osThread(Led), NULL);
* Q' r7 K* l; K- \) S0 e - osThreadCreate(osThread(Led2), NULL);- Z) m- \; @5 P7 p7 q: N; G; k
- osThreadCreate(osThread(Led3), NULL);9 ]! ~8 ~% o0 _3 C( `
- osDelay(osWaitForever);
$ k" S3 b$ L( x) C5 Z/ ^- o - while(1);# o6 ^, E' U( A" R: {
- }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 `
; i$ _- m5 N% G
将system and Thread Viewer勾上,Event Viewer在我这边是无法使用的,各位可以试一下,提示一下这个是需要用到SWO这个接口的勾上以后还需要将View->periodic window update勾上,然后界面如下图所示
. R, B& |- f# d# Q4 X; U% F
& s( z! ?9 U. V" |$ g3 ]4 `
4 W: V1 R5 ^) u% G+ H4 f然后点全速运行,线程预览窗口6 b, D. Z) g- `' j* }
! l! s: O! W' N! Q) q; W- B9 J0 k1 y
可以很方便查看该线程的运行的状态,和优先级,还有线程栈的使用率。到这边的话,这个调试功能只有RTX才有,其他的RTOS必须要使用其他的收费辅助软件才可以查看
( h! N) J8 \0 f/ M$ W) A2 {
$ 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
( W& F% e+ D3 \& D$ Q
这个是我做一款调试器,带有一个JINK和两路串口还有一个逻辑分析仪,除逻辑分析以外只占用一个USB接口,可以用公头或者MircoUSB线,以上的代码的仿真调试,小波形抓取,只使用了这一个调试工具,有需要的可以联系我QQ:1501873752; A8 \9 C& }" ?$ n9 {4 z
|
嗯,
好像不能在工程文件夹下,不能将RTX相关的库啊之类的保存吧?我记得
可以啊,公开源文件的,不过现在换成CMSIS RTOS API全部换了
是的呢。
9 s+ Q: y, s1 \' I) y1 U' T