徐自远
【摘要】本文介绍了MDK软件自带的基于时间轮转的RTX操作系统在STM32F103RB芯片上的移植方法,并详细描述了具体的移植过程和使用方法。并用一个LED轮换闪烁的实例演示了其具体应用方法并对其操作系统函数库做了简单介绍。最后通过与其他同类操作系统的横向比较,分析了其优缺点及应用范围。
【关键词】RT?鄄RTX STM32 嵌入式操作系统 MDK Cotex?鄄M3 ARM
【中图分类号】G64 【文献标识码】A 【文章编号】2095-3089(2015)12-0248-02
RL?鄄RTX操作系统是MDK官方内置的一个实时操作系统。其内核是一个基于时间片轮转的实时操作系统,可以同时运行多函数或是任务。在嵌入式系统中嵌入实时操作系统是现在硬件开发的趋势,对比前后台循环方案与状态机方案其优点在于既增加了程序的可读性,同时又提高了系统运行的效率。
1.RL-RTX操作系统介绍
RL?鄄RTX操作系统可以自由地调度系统资源,比如CPU和内存,并且提供一种任务间通信机制。 RTX内核是一个强大的实时操作系统,可以很容易地使用和运行基于 ARM7?鄄TDMI、ARM9 或是 Cortex?鄄M3 CPU 内核的微控制器。
RTX程序使用标准的C结构编写,运用RealViewR 编译器进行编译。在RTX.H头文件定义了RTX函数以及宏,可以让轻松地声明任务并达到实时操作系统所有特性。
RL?鄄RTX操作系统内核大致可分为任务管理、任务调度器、阻塞管理,任务间通讯管理,定时器管理,设备底层驱动6个部分。
2.STM32F103RBT6芯片介绍
STM32系列处理器是为高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex?鄄M3内核芯片。本文应用的STM32F103RBT6芯片为64脚LQFP64封装。其工作频率可高达72MHZ,具有128KB flash, 20KB SRAM 1个CAN总线,1个USB2.0接口,2个SPI,2个I2C接口,资源较为丰富。
3.RL?鄄RTX操作系统在STM32F103RBT6芯片上的移植
本次操作系统移植是基于RL?鄄RTX 4.05版进行的。移植操作系统使用软件编译环境为Keil MDK 4.12版。下面对移植过程做详细介绍。
1)安装MDK软件
从官网下载Keil MDK 4.12版并注册安装。
2)下载STM32固件库工程
在ST官网下载STM32F10x_StdPeriph_Lib_V3.5.0,使用其中工程作为工程模版。
3)建立GPIO工程
依据ST官方库的例子,建立一个GPIO/IOToggle 工程。修改IO端口配置与实际使用电路板的IO端口相对应。编译并运行成功。
4)移植RTX_Kernel
RTX_Kernel操作系统移植步骤如下:
3.1在main.c最前头文件引用列中加入“#include
3.2项目选项里,在Target下,Operating system选择 RTX Kernel。
3.3复制C:\Keil\ARM\Boards\ST\STM32F10X_EVAL\
RTX_Blinky\RTX_Config.c文件到项目目录下,并将RTX_Config.c添加到项目中。(MDK安装在默认目录C盘)
3.4在RTX_Config.c根据硬件条件配置操作系统参数
操作系统参数有很多,在C文件中寻找修改较为复杂,MDK4.12中可以通过向导来配置操作系统的各个参数,其步骤为:①打开RTX_Config.c文件,文件编辑框下方有一个Configuration Wizard选项,点击它可以看到任务参数选项。如图1所示。
图 1 任务参数配置向导
①Number of concurrent running tasks 设置运行任务数
此选项范围为0~250个任务,默认为6个运行任务。该数值定义了可同时运行的最大任务数量,若设置任务超过此数量,则最后一个创建的任务不会运行。
②Number of tasks with user?鄄provided stack 用户定义堆栈的任务数量
此选项范围为0~250个任务,默认为0。此选项可定义一些需要开启更大堆栈区域的任务。
③Task stack size 任务堆栈区域大小设置
范围为200~4096字节,默认堆栈大小为200字节。此选项为每个任务分配独立的堆栈区域空间,RTX_Kernel为私有堆栈任务系统,每个任务有自己私有堆栈区域,并非像RTX51一样为公有堆栈任务系统。若在系统运行中出现堆栈区域溢出的情况则需要增大此参数。
④Check for the stack overflow 检查堆栈溢出
注:开启堆栈溢出检查的话,会使系统性能降低,建议调试时开启,程序调试完毕后关闭此选项。
⑤Run in privileged mode运行在特权模式
⑥Timer clock value设置当前MCU运行频率
范围为1?鄄1000000000HZ,默认为6MHz,由于在本系统中使用时钟频率为48MHz,所以设置其为48000000。
⑦Timer tick value为RTX时间片时间
范围为1?鄄1000000us,默认为10000us,即10ms一个时间片,可以修改此参数来改变任务轮转的速度。
⑧Round?鄄Robin Task switching 任务时间片耗尽自动切换开关
默认为开启。开启RTX操作系统在某一任务时间片耗尽后会自动保存本任务堆栈并切换到其他任务中去。可点开此选项前的“+”号,在弹出的Round?鄄Robin Timeout 为任务设置自动切换时间,默认为5个时间片即50ms。
⑨Number of user timers 用户定时器使用数
范围为0~250个,定义可使用的系统定时器数量。
3.5由于RTX操作系统用到了本芯片中的一些中断向量,所以要移植RTX操作系统必须在中断程序stm32f10x_it.c中屏蔽以下三个中断函数。其分别是:PendSV_Handler(void),SysTick_Handler(void),SVC_Handler(void)。
至此,RTX系统移植完毕,接下去就能编写操作系统代码了。
4.操作系统应用实例
图 2 系统运行流程与操作系统运行流程对比
操作系统的使用能提高程序编写的效率,特别是对一些时效管理与系统延时处理方面。使用前后台循环编程方式与操作系统运行流程对比如图 4所示。
本次系统移植目标是让两个LED以不同频率交替闪烁,要完成此目标并让任务正常运行必须在main.c中添加初始化操作系统的代码:
1)先在main( )函数中添加系统初始化函数os_sys_init (init_task);。用来开启系统任务并结束main函数的运行。此时程序转入init_task任务中。
2)建立初始化任务函数init_task(void)。在程序中编写初始化函数init_task( ),区别于普通的子程序,任务前需要添加前缀”__task”。在初始化任务中使用os_tsk_create( )命令创建task1与task2两个任务,并定义两个OS_TID型任务变量id1,id2记录开启任务的返回值。最后使用os_tsk_delete_self ( );命令删除init_task任务本身。此时task1,与task2任务被开启。操作系统会根据任务轮询机制依次进入task1任务和task2任务。
3)建立两个任务函数task1,与task2。
编译上述代码,将其下载到目标板中,如果LED1与LED2两个发光二极管能以不同的频率闪烁发光说明移植成功了。
RTX 操作系统的API比较简单,它是基于时间片来进行任务间轮转调度的,即相同任务优先级每个任务分得一定的时间片运行时间,运行完时间片后保存现场进行任务切换。而其他实时操作系统中uC/OS?鄄II是不支持时间片轮转的,从uC/OS-III开始才支持时间片轮转调度。
5.RTX操作系统函数库简介
图 4 RTX 任务系统组成图
RTX任务系统组成图如图 4所示。为了深入了解RTX操作系统,对下面对每个模块及其系统函数做简单介绍。
(1)任务创建与调度:
创建任务:os_tsk_create ( );创建指定任务。
删除任务:os_tsk_delete_self ( );删除任务本身。
延时: os_dly_wait( ),延时指定数目的系统节拍事件。
任务切换:os_tsk_pass( ),跳出当前正在运行的任务。
(2)事件管理:os_evt_wait_and( ), os_evt_wait_or( ), os_evt_set(),isr_evt_set( )
让一个进程等待一个事件,这个事件可以由其它进程和中断触发。
(3)邮箱管理:os_mbx_declare( ), os_mbx_init( ),os_mbx_wait( ),os_mbx_send( ), isr_mbx_send( ),建立一个邮箱,里面可以存放一定数目的消息(比如20条)。进程可以等待邮箱队列,如果邮箱里有消息,则取出,进程继续执行;如果邮箱为空,则继续等待。
(3)互斥管理:os_mut_init ( ),os_mut_wait( ) //上锁,os_mut_release( )//解锁
设置进程独占资源,加锁,别的进程需要等待本进程,本进程不会被时间轮转切换。
(4)信号量管理:os_sem_init( ), os_sem_send( ), os_sem_wait( ), isr_sem_send( )
信号量与事件类似,进程等待的信号量大于0时,进程继续执行,信号量-1。发送信号量时,信号量+1.
6.RTX操作系统与其他几种操作系统需求对比
FLASH和RAM的需求对比
RTX是一款优秀的基于时间轮转片的微内核操作系统,适合FLASH和ROM资源不是很足的芯片,特别适合是对成本有要求,无扩展ROM和RAM芯片的单片系统中使用。
RTX的使用要比uC/OS容易,如果在Cortex?鄄M3芯片中使用实时操作系统的话,其优势较为明显。
参考文献:
[1]《STM32自学笔记》蒙博宇编著, 北京市:北京航空航天大学出版社, 2012.
[2]《STM32嵌入式微控制器快速上手》陈志旺等编著, 北京市:电子工业出版社, 2012.