打印
[应用相关]

RTX操作系统- RTX源码方式移植

[复制链接]
4233|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quray1985|  楼主 | 2016-2-17 20:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTX操作系统源码方式移植
    本章教程为大家将介绍RTX操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可,不需要做任何的底层工作,也不需要用户做任何修改。
    本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407移植。
    6.1    移植前准备工作说明
    6.2    STM32F103源码方式移植RTX系统
    6.3    STM32F407源码方式移植RTX系统
    6.4         总结


6.1  移植前准备工作说明
1.  RTX系统软件开发平台仅支持MDK,建议使用MDK4.74,因为后面的例子都是以MDK4.74为平台。
1.     找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。
2.     大家使用的简单工程里面不能有SysTick,PendSV和SVC三个系统中断的使用,因为RTX系统要使用这三个中断。
6.2   STM32F103源码方式移植RTX系统

6.2.1      RTX操作系统移植
    首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.1所示(大家也可以制作其它任意的工程模板,不限制):
                              
图6.1 工程模板
    准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
第1步:在工程模板创建RTX文件夹
     再在RTX文件夹中创建如下三个文件夹
     inc文件夹用于存放头文件。
     portable文件夹用于存放移植接口文件。
     src文件夹用于存放源码文件。


沙发
quray1985|  楼主 | 2016-2-17 20:12 | 只看该作者
第2步:添加源码文件到相应文件夹
1.  文件夹inc中需要添加的文件如下:
    文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
    其余文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
2.  文件夹portable中需要添加的文件如下:
    这5个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM,其实HAL_CM1和HAL_CM4可以不必添加,因为这两个文件是分别用于CM1内核和CM4内核的芯片。
3.   文件夹src中需要添加的文件如下:
    这11个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
4.   文件夹User中还需要添加如下两个文件:
    文件RTX_Conf_CM.c在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\Config
    文件RTX_Lib.c在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
第3步:将源码文件添加到MDK的工程项目中
    添加后的效果如下:
第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
    这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中
   

使用特权

评论回复
板凳
quray1985|  楼主 | 2016-2-17 20:12 | 只看该作者
Includes.h文件中的内容如下:
/*
*********************************************************************************************************
*
*    模块名称 : 头文件汇总
*    文件名称 : includes.h
*    版    本 : V1.0
*    说    明 : 当前使用头文件汇总
*
*    修改记录 :
*        版本号    日期        作者     说明
*        V1.0    2015-08-02  Eric2013   首次发布
*
*    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#ifndef  __INCLUDES_H__
#define  __INCLUDES_H__

/*
*********************************************************************************************************
*                                         标准库
*********************************************************************************************************
*/
#include  <stdarg.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>


/*
*********************************************************************************************************
*                                         其它库
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                           OS
*********************************************************************************************************
*/
#include "RTL.h"


/*
*********************************************************************************************************
*                                           宏定义
*********************************************************************************************************
*/




/*
*********************************************************************************************************
*                                        APP / BSP
*********************************************************************************************************
*/

#include  <bsp.h>


#endif

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
6.10.png (29.04 KB, 下载次数: 0)
下载附件
2016-1-20 15:08 上传


至此,RTX的移植工作就完成了,剩下就是系统配置和应用了

使用特权

评论回复
地板
quray1985|  楼主 | 2016-2-17 20:14 | 只看该作者
6.2.2     RTX操作系统配置说明
    RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.2所示的工程配置向导:
图6.2 RTX配置向导
1.  Task Configuration
1.   Number of concurrent running tasks
       参数范围0 – 250
       表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
2.   Number of tasks with user-provided stack
      参数范围0 – 250
       表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
            Numberof concurrent running tasks = 6
            Numberof tasks with user-provided stack = 0
        表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
            Numberof concurrent running tasks = 6
            Numberof tasks with user-provided stack = 3
         表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
3.   Task statck size
      表示系统分配的任务堆栈大小,单位字节。
4.   Check for the stack overflow
      选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
5.   Run in privileged mode
      选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
2.  Tick Timer Configuration
1.  Hardware timer
      CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
      PeripheralTimer 表示使用外设定时器。
2.   Timer clock value
      表示定时器主频,单位Hz。
3.   Timer tick value
      表示系统时钟节拍周期,单位us。
3.  System Configuration
1.  Round-Robin Task switching
      选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
2.  Round-Robin Timeout [ticks]
      范围1 – 1000。
      表示时间片的大小,单位是系统时钟节拍个数。
3.   Number of user timers
      范围1 – 250。
      表示用户定时器个数,即软定时器个数。
4.   ISR FIFO Queue size
      表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。

使用特权

评论回复
5
quray1985|  楼主 | 2016-2-17 20:15 | 只看该作者
6.2.3     RTX操作系统应用实例
    通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.3所示配置:
图6.3 RTX配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频72MHz,这个也是STM32F103的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
#include "includes.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;

/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: 标准c程序入口。
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{   
     /* 初始化外设 */
     bsp_Init();
   
     /* 创建启动任务 */
     os_sys_init_user (AppTaskStart,             /* 任务函数 */
                       2,                        /* 任务优先级 */
                       &AppTaskStartStk,         /* 任务栈 */
                       sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
     while(1);
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskLED
*    功能说明: LED闪烁
*    形    参: 无
*    返 回 值: 无
*    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
    while(1)
    {
         bsp_LedToggle(2);
         bsp_LedToggle(3);
         os_dly_wait(200);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskStart
*    功能说明: 启动任务,也就是最高优先级任务。
*    形    参: 无
*    返 回 值: 无
*    优 先 级: 2
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
     AppTaskCreate();
   
    while(1)
    {
         bsp_LedToggle(1);
         bsp_LedToggle(4);
         os_dly_wait(500);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskCreate
*    功能说明: 创建应用任务
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
     HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
                                        1,                       /* 任务优先级 */
                                        &AppTaskLEDStk,          /* 任务栈 */
                                        sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
}


使用特权

评论回复
6
quray1985|  楼主 | 2016-2-17 20:15 | 只看该作者
按照第三章的3.4小节中介绍的调试方法,可以看到如下图6.4所示任务执行状态:
图6.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
6.3 STM32F407源码方式移植RTX系统

6.3.1     RTX操作系统移植
    首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.5所示(大家也可以制作其它任意的工程模板,不限制):
                              
图6.5 工程模板
    准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
第1步:在工程模板创建RTX文件夹
    再在RTX文件夹中创建如下三个文件夹
    inc文件夹用于存放头文件。
    portable文件夹用于存放移植接口文件。
    src文件夹用于存放源码文件。
第2步:添加源码文件到相应文件夹


使用特权

评论回复
7
quray1985|  楼主 | 2016-2-17 20:16 | 只看该作者
1.  文件夹inc中需要添加的文件如下:
    文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
    其余文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
  2.  文件夹portable中需要添加的文件如下:
    这5个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM,其实HAL_CM1和HAL_CM3可以不必添加,因为这两个文件是分别用于CM1内核和CM3内核的芯片。
3.   文件夹src中需要添加的文件如下:
    这11个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
4.   文件夹User中还需要添加如下两个文件:
    文件RTX_Conf_CM.c在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\Config
    文件RTX_Lib.c在MDK 安装目录中的路径C:\Keil_v474\ARM\RV31\INC
第3步:将源码文件添加到MDK的工程项目中
    添加后的效果如下:
第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
    这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中
   

使用特权

评论回复
8
quray1985|  楼主 | 2016-2-17 20:17 | 只看该作者
Includes.h文件中的内容如下:
/*
*********************************************************************************************************
*
*    模块名称 : 头文件汇总
*    文件名称 : includes.h
*    版    本 : V1.0
*    说    明 : 当前使用头文件汇总
*
*    修改记录 :
*        版本号    日期        作者     说明
*        V1.0    2015-08-02  Eric2013   首次发布
*
*    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#ifndef  __INCLUDES_H__
#define  __INCLUDES_H__

/*
*********************************************************************************************************
*                                         标准库
*********************************************************************************************************
*/
#include  <stdarg.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>


/*
*********************************************************************************************************
*                                         其它库
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                           OS
*********************************************************************************************************
*/
#include "RTL.h"


/*
*********************************************************************************************************
*                                           宏定义
*********************************************************************************************************
*/




/*
*********************************************************************************************************
*                                        APP / BSP
*********************************************************************************************************
*/

#include  <bsp.h>


#endif

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/

第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
至此,RTX的移植工作就完成了,剩下就是系统配置和应用了


使用特权

评论回复
9
quray1985|  楼主 | 2016-2-17 20:18 | 只看该作者
6.3.2     RTX操作系统配置说明
RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.6所示的工程配置向导:
图6.6 RTX配置向导
1.  Task Configuration
1. Number of concurrent running tasks
    参数范围0 – 250
    表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
2.  Number of tasks with user-provided stack
    参数范围0 – 250
    表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
       Numberof concurrent running tasks = 6
       Numberof tasks with user-provided stack = 0
    表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
       Numberof concurrent running tasks = 6
       Numberof tasks with user-provided stack = 3
    表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
3.  Task statck size
    表示系统分配的任务堆栈大小,单位字节。
4.  Check for the stack overflow
    选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
5.   Run in privileged mode
     选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
2.  Tick Timer Configuration
1.  Hardware timer
    CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
    PeripheralTimer 表示使用外设定时器。
2.  Timer clock value
     表示定时器主频,单位Hz。
3.  Timer tick value
    表示系统时钟节拍周期,单位us。
3.  System Configuration
1.  Round-Robin Task switching
    选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
2.  Round-Robin Timeout [ticks]
    范围1 – 1000。
    表示时间片的大小,单位是系统时钟节拍个数。
3.  Number of user timers
    范围1 – 250。
    表示用户定时器个数,即软定时器个数。
4.  ISR FIFO Queue size
    表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。


使用特权

评论回复
10
quray1985|  楼主 | 2016-2-17 20:19 | 只看该作者
6.3.3     RTX操作系统应用实例
    通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.7所示配置:
图6.7 RTX配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频168MHz,这个也是STM32F407的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
     AppTaskLED任务 :LED闪烁。
     AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
#include "includes.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;

/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: 标准c程序入口。
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{   
     /* 初始化外设 */
     bsp_Init();
   
     /* 创建启动任务 */
     os_sys_init_user (AppTaskStart,             /* 任务函数 */
                       2,                        /* 任务优先级 */
                       &AppTaskStartStk,         /* 任务栈 */
                       sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
     while(1);
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskLED
*    功能说明: LED闪烁
*    形    参: 无
*    返 回 值: 无
*    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
    while(1)
    {
         bsp_LedToggle(2);
         bsp_LedToggle(3);
         os_dly_wait(200);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskStart
*    功能说明: 启动任务,也就是最高优先级任务。
*    形    参: 无
*    返 回 值: 无
*    优 先 级: 2
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
     AppTaskCreate();
   
    while(1)
    {
         bsp_LedToggle(1);
         bsp_LedToggle(4);
         os_dly_wait(500);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskCreate
*    功能说明: 创建应用任务
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
     HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
                                        1,                       /* 任务优先级 */
                                        &AppTaskLEDStk,          /* 任务栈 */
                                        sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
}


使用特权

评论回复
11
quray1985|  楼主 | 2016-2-17 20:20 | 只看该作者
按照第三章的3.5小节中介绍的调试方法,可以看到如下图6.8所示任务执行状态:
图6.8 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
6.4  总结
     本章节为大家讲解了RTX的源码移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1488

帖子

5

粉丝