zoukankan      html  css  js  c++  java
  • 【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)

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

    原文来源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16596&highlight=RTX%B2%D9%D7%F7%CF%B5%CD%B3%BD%CC%B3%CC

            本章教程为大家将介绍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大小。比如:
            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大小的任务堆栈空间。
    l Task statck size
          表示系统分配的任务堆栈大小,单位字节。
    l Check for the stack overflow
          选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
    l Run in privileged mode
          选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
    u Tick Timer Configuration
    l Hardware timer
          CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
          PeripheralTimer 表示使用外设定时器。
    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闪烁。

    1. #include "bsp.h"            /* 底层硬件驱动 */
    2. #include "RTL.h"
    3. /*
    4. **********************************************************************************************************
    5.                                                    函数声明
    6. **********************************************************************************************************
    7. */
    8. static void AppTaskCreate (void);
    9. __task void AppTaskLED(void);
    10. __task void AppTaskStart(void);
    11. /*
    12. **********************************************************************************************************
    13.                                                     变量
    14. **********************************************************************************************************
    15. */
    16. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    17. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    18. /* 任务句柄 */
    19. OS_TID HandleTaskLED = NULL;
    20. /*
    21. *********************************************************************************************************
    22. *    函 数 名: main
    23. *    功能说明: 标准c程序入口。
    24. *    形    参: 无
    25. *    返 回 值: 无
    26. *********************************************************************************************************
    27. */
    28. int main (void)
    29. {   
    30.      /* 初始化外设 */
    31.      bsp_Init();
    32.    
    33.      /* 创建启动任务 */
    34.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    35.                        2,                        /* 任务优先级 */
    36.                        &AppTaskStartStk,         /* 任务栈 */
    37.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
    38.      while(1);
    39. }
    40. /*
    41. *********************************************************************************************************
    42. *    函 数 名: AppTaskLED
    43. *    功能说明: LED闪烁
    44. *    形    参: 无
    45. *    返 回 值: 无
    46. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    47. *********************************************************************************************************
    48. */
    49. __task void AppTaskLED(void)
    50. {
    51.     while(1)
    52.     {
    53.          bsp_LedToggle(2);
    54.          bsp_LedToggle(3);
    55.          os_dly_wait(200);
    56.     }
    57. }
    58. /*
    59. *********************************************************************************************************
    60. *    函 数 名: AppTaskStart
    61. *    功能说明: 启动任务,也就是最高优先级任务。
    62. *    形    参: 无
    63. *    返 回 值: 无
    64. *    优 先 级: 2
    65. *********************************************************************************************************
    66. */
    67. __task void AppTaskStart(void)
    68. {
    69.      AppTaskCreate();
    70.    
    71.     while(1)
    72.     {
    73.          bsp_LedToggle(1);
    74.          bsp_LedToggle(4);
    75.          os_dly_wait(500);
    76.     }
    77. }
    78. /*
    79. *********************************************************************************************************
    80. *    函 数 名: AppTaskCreate
    81. *    功能说明: 创建应用任务
    82. *    形    参: 无
    83. *    返 回 值: 无
    84. *********************************************************************************************************
    85. */
    86. static void AppTaskCreate (void)
    87. {
    88.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    89.                                         1,                       /* 任务优先级 */
    90.                                         &AppTaskLEDStk,          /* 任务栈 */
    91.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
    92. }

    复制代码

    按照第三章的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大小。比如:
          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大小的任务堆栈空间。
    l Task statck size
        表示系统分配的任务堆栈大小,单位字节。
    l Check for the stack overflow
        选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
    l Run in privileged mode
        选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
    u Tick Timer Configuration
    l Hardware timer
        CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
        PeripheralTimer 表示使用外设定时器。
    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闪烁。

    1. #include "bsp.h"            /* 底层硬件驱动 */
    2. #include "RTL.h"
    3. /*
    4. **********************************************************************************************************
    5.                                                    函数声明
    6. **********************************************************************************************************
    7. */
    8. static void AppTaskCreate (void);
    9. __task void AppTaskLED(void);
    10. __task void AppTaskStart(void);
    11. /*
    12. **********************************************************************************************************
    13.                                                     变量
    14. **********************************************************************************************************
    15. */
    16. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    17. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    18. /* 任务句柄 */
    19. OS_TID HandleTaskLED = NULL;
    20. /*
    21. *********************************************************************************************************
    22. *    函 数 名: main
    23. *    功能说明: 标准c程序入口。
    24. *    形    参: 无
    25. *    返 回 值: 无
    26. *********************************************************************************************************
    27. */
    28. int main (void)
    29. {   
    30.      /* 初始化外设 */
    31.      bsp_Init();
    32.    
    33.      /* 创建启动任务 */
    34.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    35.                        2,                        /* 任务优先级 */
    36.                        &AppTaskStartStk,         /* 任务栈 */
    37.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
    38.      while(1);
    39. }
    40. /*
    41. *********************************************************************************************************
    42. *    函 数 名: AppTaskLED
    43. *    功能说明: LED闪烁
    44. *    形    参: 无
    45. *    返 回 值: 无
    46. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    47. *********************************************************************************************************
    48. */
    49. __task void AppTaskLED(void)
    50. {
    51.     while(1)
    52.     {
    53.          bsp_LedToggle(2);
    54.          bsp_LedToggle(3);
    55.          os_dly_wait(200);
    56.     }
    57. }
    58. /*
    59. *********************************************************************************************************
    60. *    函 数 名: AppTaskStart
    61. *    功能说明: 启动任务,也就是最高优先级任务。
    62. *    形    参: 无
    63. *    返 回 值: 无
    64. *    优 先 级: 2
    65. *********************************************************************************************************
    66. */
    67. __task void AppTaskStart(void)
    68. {
    69.      AppTaskCreate();
    70.    
    71.     while(1)
    72.     {
    73.          bsp_LedToggle(1);
    74.          bsp_LedToggle(4);
    75.          os_dly_wait(500);
    76.     }
    77. }
    78. /*
    79. *********************************************************************************************************
    80. *    函 数 名: AppTaskCreate
    81. *    功能说明: 创建应用任务
    82. *    形    参: 无
    83. *    返 回 值: 无
    84. *********************************************************************************************************
    85. */
    86. static void AppTaskCreate (void)
    87. {
    88.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    89.                                         1,                       /* 任务优先级 */
    90.                                         &AppTaskLEDStk,          /* 任务栈 */
    91.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
    92. }

    复制代码

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

     

    图5.8 RTX的调试信息组件


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

    5.4  总结
     

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

  • 相关阅读:
    windows 动态库的封装以及调用
    ffmpeg 转码命令与ffplay
    YUV格式与RGB格式
    Qt QTimer
    Qt QLineEdit
    Qt setStyleSheet
    python查询
    INSERT INTO .. ON DUPLICATE KEY更新多行记录
    PHP读取流文件
    curl上传、下载、https登陆
  • 原文地址:https://www.cnblogs.com/ncepu/p/13694955.html
Copyright © 2011-2022 走看看