干货 | 浅谈如何使用RL_RTX
使用keil自带的RTOS有段时间了,简单说说如何使用RTX吧。
首先简单回答下列几个问题:
1、RTX怎么下载
使用RTX不需要下载源码之类的,只要你装上了keil,那么你就可以使用RTX,RTX的源码、使用手册及配置文件都在keil安装目录下。
2、如何移植
只需在Option for Target ',,,' --》 Target 中的Operation system选项框修改为RTX Kernel,将中断配置文件中的SVC_Handler,PendSV_Handler,SysTick_Handler中断处理函数注释掉(未使用的就忽略),并在需要使用到RTX的文件中包含<RTL.h>头文件即可使用RTX RTOS了。
由于手头没有开发板,只有个当前项目使用的板子,我就使用板子上的两个LED灯简单的演示下如何使用RTX,下面是板子及部分原理图,水平有限,不足之处还望指出!
程序简述:
开发环境:
开发工具:keil V5.20,stm32cubemx 4.18.0
硬件设备:STM32F103C8T6
实现功能:
使用RTX任务点亮LED0,LED1
声明:
以下仅是简单的演示,具体使用时还需要根据具体需求查阅相关手册、资料(我把我手头有的RTX的相关资料已经上传到ee的下载中心了,有兴趣的可以下载看看)
为了完整的演示,我从采用stm32cubemx新建一个裸奔程序谈起(已经建立工程的直接忽略就行),减少盲区。
一、新建裸奔程序
1、新建一个stm32f103c8t6的项目
2、配置LED0、LED1的引脚及配置调试引脚
(由于我采用的是SW串口调好似,这里我选择的是串口调试,由于板子的调试方式不尽相同,这里需要根据实际进行选取)
若使用cube进行配置,SYS选项默认为不使用调试功能,切记需要配置SYS选项,否则将造成烧完程序后下回无法烧写程序,提示找不到设备!
3、时钟配置,这里我没进行配置,采用内部晶振,时钟配置均为默认值
4、配置GPIO(这里按照上述原理图进行配置,设置默认电平为高电平,此时LED未点亮)
5、生成LED_demo项目,并进行首次生成项目的一些配置
5、项目生成后打开项目、添加翻转LED0、LED1的代码并调试裸奔程序(现象:此时板子上的LED0、LED1按顺序闪烁)
裸奔条件下调试完成后,进行RTX移植操作
二、移植RTX RTOS
1、复制配置文件(注意,这里的配置文件根据MCU不同需要选取不同的配置文件,具体查阅手册)
2、导入并编辑配置文件,简单介绍下下列配置
Number of concurrent running tasks:
这里的值代表着当前RTOS可以执行的任务上限,此值可大于程序中创建的任务数量,但不能小于程序中创建的任务数量
Number of tasks with user-provided stack:
由用户自定义桟大小的任务数量,我试过不设置该值自定义任务桟大小,操作成功,因此,这里不设置应该是可以的,理解有误还望指出!
Task stack size:
任务桟大小,就是为创建的任务桟分配的默认桟大小,如果是独立分配的话就跟它无关了。
Check for the stack overflow:
桟溢出检测,调试时在任务视图中可以看到各任务桟占用的百分比,不知道是不是bug,即使我不选中,任务视图中仍然存在桟溢出检测,,,所以选不选一个样
Run in privileged mode:
是否启用抢占调度模式
Hardware timer:
选取硬件时钟源,这里我使用的是系统内核时钟
Timer clock value:
时钟频率,由于先前在cube未对时钟进行配置,默认时钟频率为8MHz,所以这里我填的是8000000
Timer tick:
时间片大小,这里我设置的是1ms
Round-Robin Task switching:
是否启用时间片轮转调度模式
Round-Robin Timeout:
这里的5代表着5个时间片,由于Timer tick设置为1ms,这里代表着每个任务最长可持续运行5ms,接着需要将CPU控制权交给其它在等待队列中的任务
Number of user timers:
软件定时器数量,根据需要设值即可,这里的定时器是“一次性”的,执行一次结束下回需要使用时需要重新创建
ISR FIFO Queue size:
ISR FIFO 队列大小
3、在Optons for Target ",,," 配置中选择操作系统为RTX内核,并将之前谈到的三个中断处理函数注释掉
4、包含头文件、创建任务、移植裸奔程序、启动RTX
5、编译程序进入调试窗口进行相应的设置
打开任务视图
启用界面周期刷新功能,否则任务视图中的任务运行状态无法动态更新
运行程序后在任务视图中就可以看到先前建立的两个任务的运行状态了,此时LED0、LED1同时亮、同时灭。
6、修改程序,添加事件标志位(同步处理),使LED0、LED1与裸奔程序下的依次闪烁一致
此时的现象就与裸奔时一致了,事件标志位的功能与信号量、互斥量一样都是为了解决同步问题,习惯用哪个就使用哪个,至于其它的功能函数,具体的参见RTX的官方指南(已上传至下载中心),这里就不一一详述了,给刚接触RTX的开个头,大神们忽视即可。
与裸奔时的程序现象一样,实物图就不贴了,任务视图如下图所示: