|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
<strong>1 MDK RL—RTX和COrtex—M3概述</strong>
MDK开发套件源自德国Keil公司,是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具。MDKRL—IUX是一个实时操作系统(RTOS)内核,完全集成在MDK编译器中。广泛应用于ARM7、ARM9和Cortex-M3设备中。它可以灵活解决多任务调度、维护和时序安排等问题。基于RL—I订X的程序由标准的C语言编写,由Real—View编译器进行编译。操作系统依附于C语言使声明函数更容易,不需要复杂的堆栈和变量结构配置,大大简化了复杂的软件设计,缩短了项目开发周期。
Cortex—M3是一个32位的核。它是首个基于ARMv7M架构,主要针对价格敏感但又具备高系统效能需求的嵌入式应用设计,如微控制器、汽车车体系统及网络装置等。它内核紧凑,性能更高,采用了Thumb一2指令集架构,中断时间更短,标准化内存映射,带有内置SysTick的集成式NVIC。 SysTick能定期地产生异常请求,作为系统的时基,计时更准确。
MDK RL—RTX和Cortex—M3都源自ARM公司。ARM公司将其无缝整合在MDK开发套件中,因此将RL—RTX移植到Cortex—M3上非常适合。RL—RTX作为一个全功能的内核,可以结合实时软件库中的其他组件。例如,加入实时库中RL—Flasht文件系统组件,就可以读写标准SD卡和 MMC卡上面的文件;加入RL—TCPnet组件,可应用于HTTP Web,ServeI’、TFTP Server和SMTP Client等。可扩展性强,应用广泛。
<strong>2 基于COrtex—M3硬件平台的构建</strong>
STM32F103VB是ST公司基于Cortex—M3的处理器。它有1个128 KB Flash,1个20 KB SRAM,4个16位定时器,100个可编程的I/0引脚,具有I2C、SPI、USB、15SART和CAN接口,2路10通道12位A/D转换器,RTC功能模块,WDT功能和高级电源管理功能。
系统的数据缓存RAM和程序存储器Flash为芯片自带,系统外接A/D转换器构成控制器。基于Cortex-M3核的最小系统框图如图1所示。
<ignore_js_op>
2010-5-12 18:58:09 上传
<strong>下载附件</strong> (5.79 KB)
</ignore_js_op>
基于该平台,设计一个超温报警器。使用美国半导体Dalias公司的智能温度传感器DS18820采样,LCD显示温度数值,如果短时间内温度超出正常温度,蜂鸣器发出100 dB警报且LED灯闪烁示警。可以进一步在该平台上进行扩展,加入GPS和GPRS模块,当温度超出设定范围时,GPS将现场经纬度以及时间通过GPRS 以短信方式发送给监控中心,GPRS模块自动拨打有关人员移动电话或固定电话报警。
<strong>3 MDK RL—RTX的配置与移植</strong>
RL—RTX在任务管理方面不仅支持抢先式任务切换,而且支持时间片轮转切换。在基于时间片的轮转任务机制下,CPIJ的执行时间被划分为若干时间片,由 RL—RTX分配一个时间片给每个任务,在该时间片内只执行这个任务。当时间片到,在下一个时间片中无条件地执行另外一个任务。所有任务都轮询一次后,再回头执行第一个任务。
RL—RTX最多可以定义256个任务,所有任务都可以同时激活成为就绪态。RL—RTX用户任务具有表1所列的几个状态。
<ignore_js_op>
2010-5-12 18:58:09 上传
<strong>下载附件</strong> (11.4 KB)
</ignore_js_op>
一般情况下,任务切换由时间片控制,但有时需要用事件控制任务切换。RL—RTX事件主要有超时(Timeout)、间隔(Interval)和信号 (Signal)三种。
Timeout:挂起运行任务指定数量的时钟周期,调用OS_DLY_WAIT函数的任务将被挂起,直到延时结束才返回到Ready状态,并可被再次执行。延时时间由SysTick衡量,可以设置从1至OxFFFE的任何值。
Interval:时间间隔,任务在该时间间隔中不运行,该时问间隔与任务执行时间独立。
Signal:用于任务间通信,可以用系统函数进行置位或复位。如果一个任务调用了wait函数等待Signal未置位,则该任务被挂起直到Signal 置位,才返回READY状态,可再被执行。
RL—RTX中主要的系统函数说明如表2所列。
<ignore_js_op>
2010-5-12 18:58:09 上传
<strong>下载附件</strong> (14.75 KB)
</ignore_js_op>
RL—RTX为每个任务都分配了一个单独的堆栈区,各个任务所用堆栈位置是动态的,用task_id记录各堆栈栈底位置。有多个嵌套子程序调用或使用大量的动态变量时,自由空间会被用完。使能栈检查(Stack Checking),系统会执行OS_STK_0VERFLOW()堆栈错误函数进行堆栈出错处理。RL—RTX堆栈管理如图2所示。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (8 KB)
</ignore_js_op>
RL—RTX选择Cortex上定时器1产生周期性中断,相邻中断之间的时间就是时间片的长度。在其中断服务程序中进行任务调度,并判断执行了延迟函数的任务的延时时间是否到。这种周期性的中断形成了RL—RTX的时钟节拍。采用Cortex—M3的处理器STM32F103VB的CPU时钟频率为72 MHz,VPBDIV分频值为4,输出的时钟频率为18 MHz。系统推荐的时间片为1~lOO ms。
使用RL—RTX,包含以下几个步骤:
第1步,由于RL—RTX集成在MDK开发套件中,在使用MDK创建工程后,需要在工程中添加RTX内核选项。选择Project→Options for Target,在Operating下拉框中选择RTX内核,使得在编译时把RL—RTX所需的库编译进去。
第2步,在嵌入式应用程序的开发中使用RL—RTX内核,须对其进行配置。复制\Keil\ARM\Startup目录下RTX_Config.c文件到工程文件夹并添加到工程中。该文件中,部分配置参数说明如表3所列。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (15.17 KB)
</ignore_js_op>
基于Cortex—M3平台的超温报警器,可以设计3个任务并发,分别进行数据采集、数据处理和数据显示。3个任务较小,系统安排的任务栈足够使用,栈的容量以32位无符号整型定义,容量为64字。选择硬件平台片上定时器1。
DSl8820具有300 ms的更新速率,在采集数据过程中,通过多次采集取平均值,数据采集任务执行的时间为30 ms,数据处理任务执行时间为40 ms,数据显示任务执行时间为20 ms。根据公式,对响应时间的要求:t(响应时间)=N(进程数目)×q(时间片)。总体响应时间为90 ms,进程数目为3,因此时间片设置为30 ms合适。在任务OS_IDLE_DEMON()中添加休眠代码,空闲时系统休眠,降低功耗。
第3步,复制\Keil\ARM\Startup下Retarget.c文件到工程文件夹中,并添加到工程中。
修改文件,使其包含如下内容:
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (4.1 KB)
</ignore_js_op>
该文件的目的是避免半主机方式软件中断,因为这时所有中断都由RL—RTX统一管理。半主机是用于ARM目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。它由一组已定义的SWI操作来实现。库函数调用相应的SWI(软件中断),然后调试代理程序处理SWI异常,并提供所需的与主机之间的通信。
<strong>4 应用设计</strong>
4.1 多任务应用设计
根据图1所示的最小系统框图,采用由表及里 (out—side-in approach)分解应用的方法设计多任务。该应用的上下文框图如图3所示,中间的圈表示软件应用,矩形框表示应用的输入和输出设备。箭头标有具体含义名,表示输入和输出通信的流程。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (5.47 KB)
</ignore_js_op>
根据上下文框图以及避免“资源冲突”原则,将对同一个外设的访问放在同一个设备中,无论何时切换任务,都不会对任何独立的“外设”造成影响。
将应用分解为4个任务,RL—RTX的第一个任务必须是系统任务Init Task,该任务用来初始化其他3个任务,任务创建完毕后,3个任务都处于READY状态;第2个任务t_phase_ADC Task用来读取A/D采样的数据;第3个任务t_phase_DEA Task用来处理采样的数据;第4个任务t_phase_DIS Task用来将数据送到LCD液晶屏上,显示、控制LED灯闪烁和蜂鸣器高频报警。图4显示了任务触发的流程。
定义任务:
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (3.51 KB)
</ignore_js_op>
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (11.51 KB)
</ignore_js_op>
使用os_tsk_create创建任务t_phase_ADC、t_phase_DEA、t_phase_DIS。
os_tsk_delete_self删除自身任务,实现任务切换。任务的创建和初始化是在主函数中定义的:
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (6.35 KB)
</ignore_js_op>
任务初始化完毕后,3个任务都处于就绪状态。t_phase_ADC任务用来采样,多次采样取平均值,通过给任务t_phase_DEA发信号 signal_func(t_phase_DEA),唤醒t_phase_DEA任务。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (1.44 KB)
</ignore_js_op>
os_evt_wait_and进行控制。该任务判断采样的数据是否在警戒温度范围内,如果出现温度异常,置标志位为1。执行完自身任务后,通过 signal_func(t_phase_DIS),将唤醒t_phase_DIS任务。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (2.15 KB)
</ignore_js_op>
t_phase_DIS任务用来在LCD液晶屏上显示温度值。如果发现标志位为1,则LED灯闪烁和蜂鸣器高频报警。
4.2 应用设计测试
采用基本RMA可调度性测试。式1用来完成系统的基本RMA可调度性测试。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (1.19 KB)
</ignore_js_op>
这里:Ci为与周期性任务i相关的最坏执行时间,Ti为与任务i相关的周期,n为任务的个数。
U(n)是利用系数,式1的右边是理论处理器利用率的上界。如果给定一组任务,其处理器利用率小于理论利用率上界,则这组任务是可调度的。U的值随n的增加而下降;当n的值为无限时,最终收敛于69%。
表4总结了使用RMA进行调度的3个任务的特性。
<ignore_js_op>
2010-5-12 18:58:10 上传
<strong>下载附件</strong> (3.92 KB)
</ignore_js_op>
使用式1,该应用设计处理器利用率计算如下:
<ignore_js_op>
2010-5-12 18:58:09 上传
<strong>下载附件</strong> (1.78 KB)
</ignore_js_op>
应用设计总的利用率是27.42%,低于78%的理论边界。此4个任务的系统是可调度的,该应用设计是成功的。
<strong>结语</strong>
本文描述了如何在Cortex—M3上使用MDK RL—RTX的方法,并给出了一个简单的多任务应用设计。可以看出多任务的程序设计被大大简化了,它不但满足多个任务的时间要求,降低了开发难度,而且程序的可读性和可维护性也有了很大的提高。利用MDK RL—RTX构建的嵌入式工业控制系统具有成本低、性能高等特点,应用广泛,有着良好的发展前景。
<strong>参考文献</strong>
1. 李宁 ARM 开发工具RealView MDK使用入门 2008
2. 任哲 ARM 体系结构及其嵌入式处理器 2008
3. Cesar Marquez Chin Identification of arm movements using correlation of electrocorticographic spectral components and kinematic recordings 2007(2)
4. 查看详情
5. Li Qing Real-time concepts for Embedded Systems 2003
作者:武汉理工大学 方安平武永谊
来源:单片机与嵌入式系统应用 2008 (12) |
|