打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级简单)
本帖最后由 硬汉Eric2013 于 2016-1-19 15:31 编辑

5.2   STM32F103移植RTX系统



5.2.1      RTX操作系统移植
     首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.1所示(大家也可以制作其它任意的工程模板,不限制):
                              
图5.1 工程模板
    准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:
第1步:使能RTX
第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的配置向导
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.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的库方式移植的工程就可以运行了。


阅读全文

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
基于RTX51的单片机软件设计
RTX51?Tiny?(上)嵌入8051系列MCU的微型操作系统
定时器的超时任务管理程序
ucos在s3c2410上运行过程整体剖析-从main函数到UCOS初始化完毕
RTOS内功修炼记(四)— 小小的时钟节拍,撑起了内核半边天!
UCOSIII任务管理I
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服