arm rtx教程_【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)

第5章

RTX操作系统库方式移植(超级简单)

本章教程为大家将介绍RTX操作系统库方式移植,库方式的移植超级简单,应该是所有RTOS里面最简单的了,仅需简单的两步就可以完成。

本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407移植。

5.1 移植前准备工作说明

5.2

STM32F103移植RTX系统

5.3

STM32F407移植RTX系统

5.4

总结

5.1 移植前准备工作说明

1.

RTX系统软件开发平台仅支持MDK,建议使用MDK4.74,因为后面的例子都是以MDK4.74为平台。

2.

找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。

3.

大家使用的简单工程里面不能有SysTick,PendSV和SVC三个系统中断的使用,因为RTX系统

要使用这三个中断。

5.2

STM32F103移植RTX系统

5.2.1

RTX操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.1所示(大家也可以制作其它任意的工程模板,不限制):

图5.1

工程模板

准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:

u

第1步:使能RTX

u

第2步:添加RTX系统的配置文件,配置文件在MDK的安装目录C:\Keil_v474\ARM\RL\RTX\Config

下面,文件名RTX_Conf_CM.c,下面将这个文件复制到MDK工程的User文件夹下面,并添加到MDK工程上

通过这两步,RTX操作系统的移植就完成了。

5.2.2

RTX操作系统配置说明

RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图5.2所示的工程配置向导:

图5.2

RTX的配置向导

u

Task

Configuration

l

Number of concurrent

running tasks

参数范围0 –

250

表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。

l

Number of tasks with

user-provided stack

参数范围0 –

250

表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task

statck size大小。比如:

Number of concurrent

running tasks = 6

Number of tasks with

user-provided stack = 0

表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task

statck size大小的任务堆栈空间。

Number of concurrent

running tasks = 6

Number of tasks with

user-provided stack = 3

表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task

statck size大小的任务堆栈空间。

l

Task statck

size

表示系统分配的任务堆栈大小,单位字节。

l

Check for the stack

overflow

选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。

l

Run in privileged

mode

选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。

u

Tick Timer

Configuration

l

Hardware

timer

Core SysTick

表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。

Peripheral Timer

表示使用外设定时器。

l

Timer clock

value

表示定时器主频,单位Hz。

l

Timer tick

value

表示系统时钟节拍周期,单位us。

u

System

Configuration

l

Round-Robin Task

switching

选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。

l

Round-Robin Timeout

[ticks]

范围1 –

1000。

表示时间片的大小,单位是系统时钟节拍个数。

l

Number of user

timers

范围1 –

250。

表示用户定时器个数,即软定时器个数。

l

ISR FIFO Queue

size

表示ISR

FIFO队列大小。中断服务程序中调用以isr_

开头的函数时,会将请求类型存到此缓冲中。

5.2.3

RTX操作系统应用实例

通过上面对RTX操作系统的配置讲解,这里将其修改为如下图5.3所示的配置:

图5.3

RTX的配置向导

相对默认配置,修改了上图红色箭头所示的三个地方:

1.

任务运行在特权级模式。

2.

滴答定时器主频72MHz,这个也是STM32F103的主频。

3.

系统时钟节拍周期1ms。

修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:

AppTaskLED任务 :LED闪烁。

AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。

#include

"bsp.h"

#include

"RTL.h"

static

void AppTaskCreate (void);

__task

void AppTaskLED(void);

__task

void AppTaskStart(void);

static

uint64_t

AppTaskLEDStk[256/8];

static

uint64_t

AppTaskStartStk[512/8];

OS_TID

HandleTaskLED = NULL;

int main

(void)

{

bsp_Init();

os_sys_init_user

(AppTaskStart,

2,

&AppTaskStartStk,

sizeof(AppTaskStartStk));

while(1);

}

__task

void AppTaskLED(void)

{

while(1)

{

bsp_LedToggle(2);

bsp_LedToggle(3);

os_dly_wait(200);

}

}

__task

void AppTaskStart(void)

{

AppTaskCreate();

while(1)

{

bsp_LedToggle(1);

bsp_LedToggle(4);

os_dly_wait(500);

}

}

static

void AppTaskCreate (void)

{

HandleTaskLED =

os_tsk_create_user(AppTaskLED,

1,

&AppTaskLEDStk,

sizeof(AppTaskLEDStk));

}

按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.4所示的任务执行状态:

图5.4

RTX的调试信息组件

除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

5.3

STM32F407移植RTX系统

5.3.1

RTX操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.5所示(大家也可以制作其它任意的工程模板,不限制):

图5.5

工程模板

准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:

u

第1步:使能RTX

u

第2步:添加RTX系统的配置文件,配置文件在MDK的安装目录C:\Keil_v474\ARM\RL\RTX\Config

下面,文件名RTX_Conf_CM.c,下面将这个文件复制到MDK工程的User文件夹下面,并添加到MDK工程上

通过这两步,RTX操作系统的移植就完成了。

5.3.2

RTX操作系统配置说明

RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图5.6所示的工程配置向导:

图5.6

RTX的配置向导

u

Task

Configuration

l

Number of concurrent

running tasks

参数范围0 –

250

表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。

l

Number of tasks with

user-provided stack

参数范围0 –

250

表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task

statck size大小。比如:

Number of concurrent

running tasks = 6

Number of tasks with

user-provided stack = 0

表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task

statck size大小的任务堆栈空间。

Number of concurrent

running tasks = 6

Number of tasks with

user-provided stack = 3

表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task

statck size大小的任务堆栈空间。

l

Task statck

size

表示系统分配的任务堆栈大小,单位字节。

l

Check for the stack

overflow

选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。

l

Run in privileged

mode

选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。

u

Tick Timer

Configuration

l

Hardware

timer

Core SysTick

表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。

Peripheral Timer

表示使用外设定时器。

l

Timer clock

value

表示定时器主频,单位Hz。

l

Timer tick

value

表示系统时钟节拍周期,单位us。

u

System

Configuration

l

Round-Robin Task

switching

选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。

l

Round-Robin Timeout

[ticks]

范围1 –

1000。

表示时间片的大小,单位是系统时钟节拍个数。

l

Number of user

timers

范围1 –

250。

表示用户定时器个数,即软定时器个数。

l

ISR FIFO Queue

size

表示ISR

FIFO队列大小。中断服务程序中调用以isr_

开头的函数时,会将请求类型存到此缓冲中。

5.3.3

RTX操作系统应用实例

通过上面对RTX操作系统的配置讲解,这里将其修改为如下图5.7所示配置:

图5.7

RTX的配置向导

相对默认配置,修改了上图红色箭头所示的三个地方:

1.

任务运行在特权级模式。

2.

滴答定时器主频168MHz,这个也是STM32F407的主频。

3.

系统时钟节拍周期1ms。

修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:

AppTaskLED任务 :LED闪烁。

AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。

#include

"bsp.h"

#include

"RTL.h"

static

void AppTaskCreate (void);

__task

void AppTaskLED(void);

__task

void AppTaskStart(void);

static

uint64_t

AppTaskLEDStk[256/8];

static

uint64_t

AppTaskStartStk[512/8];

OS_TID

HandleTaskLED = NULL;

int main

(void)

{

bsp_Init();

os_sys_init_user

(AppTaskStart,

2,

&AppTaskStartStk,

sizeof(AppTaskStartStk));

while(1);

}

__task

void AppTaskLED(void)

{

while(1)

{

bsp_LedToggle(2);

bsp_LedToggle(3);

os_dly_wait(200);

}

}

__task

void AppTaskStart(void)

{

AppTaskCreate();

while(1)

{

bsp_LedToggle(1);

bsp_LedToggle(4);

os_dly_wait(500);

}

}

static

void AppTaskCreate (void)

{

HandleTaskLED =

os_tsk_create_user(AppTaskLED,

1,

&AppTaskLEDStk,

sizeof(AppTaskLEDStk));

}

按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.8所示的任务执行状态:

图5.8

RTX的调试信息组件

除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

5.4

总结

本章节为大家讲解了库移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>