本章教程为大家将介绍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  总结
本章节为大家讲解了库移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。

RTX操作系统库方式移植相关推荐

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

    武汉安富莱电子有限公司 武汉安富莱电子有限公司 WWW.ARMFLY.COM 安富莱STM32-V4开发板RTX教程 WWW.ARMFLY.COM 安富莱STM32-V4开发板RTX教程 第5章 RT ...

  2. 【RTX操作系统教程】第6章 RTX操作系统源码方式移植

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16616&highlight=RTX%B2%D9%D7%F7%CF ...

  3. 第6章 RTX 操作系统源码方式移植

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可, ...

  4. 【第3版emWin教程】第8章 emWin6.x的带OS方式移植(STM32H7之RGB接口)

    教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第8章   emWin6.x的带OS方式移植(STM32H7之R ...

  5. arm rtx教程_【RTX操作系统教程】第4章 RTX操作系统介绍

    第4章 RTX操作系统介绍 本章节介绍一下RTX操作系统,让大家对RTX有一个整体的了解,Keil RTX 是免版税的确定性实时操作系统,适用于 ARM 和 Cortex-M 设备. 4.1 RTX系 ...

  6. 【RTX操作系统教程】第4章 RTX操作系统介绍

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16553&highlight=RTX%B2%D9%D7%F7%CF ...

  7. stm32使用自定义打点函数方式移植stemwin

    stm32使用自定义打点函数方式移植stemwin 背景 显示过程 移植简述 打点函数 stemwin移植要点 实物效果 背景 oled屏移植stemwin,有两种方式,通过自定义打点方式进行移植,或 ...

  8. Lua操作系统库、流、文件库

    Lua操作系统库.流.文件库 1.Lua中所有的操作系统库函数 (1)os.clock() --功能:返回执行该程序cpu花费的时钟秒数 (2)os.time(...) --按参数的内容返回一个时间值 ...

  9. ZYNQ跑系统 系列(二) petalinux方式移植linux

    移植linux之petalinux 之前一篇博文中,提到了一种通用的传统移植方式,将linux移植到ZYNQ中的ARM芯片中.本文将针对xilinx的专用开发环境petalinux,进行入门和开发,本 ...

最新文章

  1. php 头部utf8,PHP去掉utf8格式文件中的bom头部_PHP教程
  2. slf4j 和 log4基础入门(Maven配置)
  3. 一个实现生产和消费的例子(并且使用了接口和反射技术,动态调用方法)小框架...
  4. 动态网页开发基础【笔记】
  5. 子类构造器Constructor是否可被Override(重写)
  6. MFC的DLL中实现定时器功能
  7. 校招刷题---java选择题笔记04
  8. 001 spring介绍
  9. [转载] 民兵葛二蛋——第31集
  10. CDOJ 483 Data Structure Problem DFS
  11. Android应用文本字体设置
  12. Windows软件打包方法
  13. 如何用C语言编辑一个万年历,如何用C语言编写一个万年历系统?
  14. 端侧智能存算一体芯片的需求、现状与挑战
  15. Phython 数据类型
  16. enter不换行 wps_wps表格按enter键不能换行解决方法教程
  17. wifidog源码分析 - 初始化阶段
  18. 史上最全的app相关的面试题【多测师】
  19. 专题:固体力学中应力与应变分析详解(7.应变分析 7.5应变张量 7.6主应变与主方向 7.7应变莫尔圆)...
  20. ICAP: 互换客户端地址协议 1

热门文章

  1. ubuntu kylin 14.04安装配置redis-2.8.9(转)
  2. Android中网络编程出错
  3. Delphi 调用C#编写的WebService
  4. Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html
  5. 设计模式之 - 简单工厂模式
  6. 昼猫笔记 从此告别复杂代码--JavaScript
  7. 基于Hadoop的数据分析平台搭建
  8. WordPress更新时提示无法连接到FTP服务器的解决方案
  9. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发
  10. 微信月活跃用户数6.97亿 全球十大消息应用第四