基于MDK RTX的Cortex-M3多任务应用设计
时间:05-12
来源:互联网
点击:
1 MDK RL—RTX和COrtex—M3概述
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等。可扩展性强,应用广泛。
2 基于COrtex—M3硬件平台的构建
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所示。
基于该平台,设计一个超温报警器。使用美国半导体Dalias公司的智能温度传感器DS18820采样,LCD显示温度数值,如果短时间内温度超出正常温度,蜂鸣器发出100 dB警报且LED灯闪烁示警。可以进一步在该平台上进行扩展,加入GPS和GPRS模块,当温度超出设定范围时,GPS将现场经纬度以及时间通过GPRS 以短信方式发送给监控中心,GPRS模块自动拨打有关人员移动电话或固定电话报警。
3 MDK RL—RTX的配置与移植
RL—RTX在任务管理方面不仅支持抢先式任务切换,而且支持时间片轮转切换。在基于时间片的轮转任务机制下,CPIJ的执行时间被划分为若干时间片,由 RL—RTX分配一个时间片给每个任务,在该时间片内只执行这个任务。当时间片到,在下一个时间片中无条件地执行另外一个任务。所有任务都轮询一次后,再回头执行第一个任务。
RL—RTX最多可以定义256个任务,所有任务都可以同时激活成为就绪态。RL—RTX用户任务具有表1所列的几个状态。
一般情况下,任务切换由时间片控制,但有时需要用事件控制任务切换。RL—RTX事件主要有超时(Timeout)、间隔(Interval)和信号 (Signal)三种。
Timeout:挂起运行任务指定数量的时钟周期,调用OS_DLY_WAIT函数的任务将被挂起,直到延时结束才返回到Ready状态,并可被再次执行。延时时间由SysTick衡量,可以设置从1至OxFFFE的任何值。
Interval:时间间隔,任务在该时间间隔中不运行,该时问间隔与任务执行时间独立。
Signal:用于任务间通信,可以用系统函数进行置位或复位。如果一个任务调用了wait函数等待Signal未置位,则该任务被挂起直到Signal 置位,才返回READY状态,可再被执行。
RL—RTX中主要的系统函数说明如表2所列。
RL—RTX为每个任务都分配了一个单独的堆栈区,各个任务所用堆栈位置是动态的,用task_id记录各堆栈栈底位置。有多个嵌套子程序调用或使用大量的动态变量时,自由空间会被用完。使能栈检查(Stack Checking),系统会执行OS_STK_0VERFLOW()堆栈错误函数进行堆栈出错处理。RL—RTX堆栈管理如图2所示。
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所列。
基于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文件到工程文件夹中,并添加到工程中。
修改文件,使其包含如下内容:
该文件的目的是避免半主机方式软件中断,因为这时所有中断都由RL—RTX统一管理。半主机是用于ARM目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。它由一组已定义的SWI操作来实现。库函数调用相应的SWI(软件中断),然后调试代理程序处理SWI异常,并提供所需的与主机之间的通信。
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等。可扩展性强,应用广泛。
2 基于COrtex—M3硬件平台的构建
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所示。
基于该平台,设计一个超温报警器。使用美国半导体Dalias公司的智能温度传感器DS18820采样,LCD显示温度数值,如果短时间内温度超出正常温度,蜂鸣器发出100 dB警报且LED灯闪烁示警。可以进一步在该平台上进行扩展,加入GPS和GPRS模块,当温度超出设定范围时,GPS将现场经纬度以及时间通过GPRS 以短信方式发送给监控中心,GPRS模块自动拨打有关人员移动电话或固定电话报警。
3 MDK RL—RTX的配置与移植
RL—RTX在任务管理方面不仅支持抢先式任务切换,而且支持时间片轮转切换。在基于时间片的轮转任务机制下,CPIJ的执行时间被划分为若干时间片,由 RL—RTX分配一个时间片给每个任务,在该时间片内只执行这个任务。当时间片到,在下一个时间片中无条件地执行另外一个任务。所有任务都轮询一次后,再回头执行第一个任务。
RL—RTX最多可以定义256个任务,所有任务都可以同时激活成为就绪态。RL—RTX用户任务具有表1所列的几个状态。
一般情况下,任务切换由时间片控制,但有时需要用事件控制任务切换。RL—RTX事件主要有超时(Timeout)、间隔(Interval)和信号 (Signal)三种。
Timeout:挂起运行任务指定数量的时钟周期,调用OS_DLY_WAIT函数的任务将被挂起,直到延时结束才返回到Ready状态,并可被再次执行。延时时间由SysTick衡量,可以设置从1至OxFFFE的任何值。
Interval:时间间隔,任务在该时间间隔中不运行,该时问间隔与任务执行时间独立。
Signal:用于任务间通信,可以用系统函数进行置位或复位。如果一个任务调用了wait函数等待Signal未置位,则该任务被挂起直到Signal 置位,才返回READY状态,可再被执行。
RL—RTX中主要的系统函数说明如表2所列。
RL—RTX为每个任务都分配了一个单独的堆栈区,各个任务所用堆栈位置是动态的,用task_id记录各堆栈栈底位置。有多个嵌套子程序调用或使用大量的动态变量时,自由空间会被用完。使能栈检查(Stack Checking),系统会执行OS_STK_0VERFLOW()堆栈错误函数进行堆栈出错处理。RL—RTX堆栈管理如图2所示。
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所列。
基于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文件到工程文件夹中,并添加到工程中。
修改文件,使其包含如下内容:
该文件的目的是避免半主机方式软件中断,因为这时所有中断都由RL—RTX统一管理。半主机是用于ARM目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。它由一组已定义的SWI操作来实现。库函数调用相应的SWI(软件中断),然后调试代理程序处理SWI异常,并提供所需的与主机之间的通信。
Keil ARM 嵌入式 Cortex C语言 STM32 USB 电源管理 半导体 传感器 LCD LED GPS ADC 单片机 相关文章:
- 单片机C程序延时精度研究(03-25)
- 基于Proteus和ADS的ARM虚拟实验室建设(05-12)
- 基于RTX51 的单片机软件设计(11-28)
- P89V51RD2单片机的自调试与在线编程(02-18)
- SED1335在单片机系统中的设计与应用(03-22)
- C8051F单片机的软件IAP技术(04-06)