查看: 90|回复: 0

【连载】嵌入式OS入门笔记-以RTX为案例(三):修改RTX

[复制链接]

主题

好友

11

积分

白丁

  • TA的每日心情
    慵懒
    2014-8-14 15:38
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-8-16 01:41:12 |显示全部楼层
    RTX一般是由ARM-MDK链接到预编译的RL-RTX库的,但是修改RTX内核function或者是增添新的function并且在自己的工程里面 编译和链接修改后的RTX都是没问题的。本篇笔记主要关于如何在利用ARM-MDK在RTX中添加一个新的function,并且在自己的工程文件里面使 用这个新的function。同样地,需要安装ARM-MDK和一块硬件板,笔记以STM32F4Discovery为例子。
       这部分内容可能实战中很少会用到!如果你只是应用开发,可以放心跳过。

    1.从源文件到库

        首先我们要找到RTX的源文件。一般来说路径是 C:KeilARMRLRTX,这个文件夹下我们需要的有:RTX_Lib_CM.uvpot, RTX_Lib_CM, Config和SRC下的CM中的部分文件。

        SRC下CM文件夹中的HAL_CM1,HAL_CM3可以删除掉,因为STM32F4Discovery用的是Cortex-M4的核。而删除的这两个文件其实是Cortex-M1,Cortex-M3的硬件抽象层(Hardware Abstraction Layer)。不同的板子需要有不同的HAL。

    在工程文件夹中,新建一个文件夹,例如MyProjectRTXMod,作为修改后的RTX的源代码文件夹。复制上诉文件并粘贴进RTXMod中,注意保持其相对路径!

    然后用uVision打开RTX_Lib_CM。首先注意到工程下有这些文件:
      SRC下CM文件夹中的HAL_CM1,HAL_CM3可以删除掉,因为STM32F4Discovery用的是Cortex-M4的核。而删除的这两个文件其实是Cortex-M1,Cortex-M3的硬件抽象层(Hardware Abstraction Layer)。不同的板子需要有不同的HAL。

        在工程文件夹中,新建一个文件夹,例如MyProjectRTXMod,作为修改后的RTX的源代码文件夹。复制上诉文件并粘贴进RTXMod中,注意保持其相对路径!

    然后用uVision打开RTX_Lib_CM。首先注意到工程下有这些文件:

    同样地,从工程中删除HAL_CM1,HAL_CM3文件。工程目标也要作相应的改动,点查看Manage Project Items。删除所有CM1,CM3相关内容。CM4,如果你明确你的板子的Edinaness,那么也可以删除额外的工程目标。ST的板子都是小端(Little Endian)。

    接下来就可以Build了。正常情况不会报错。

        那么打开RTXMod中的CM4F_LE文件夹,就能够看到RTX_CN4.lib文件,这个就是我们在自己工程文件下编译的RTX库文件。

    2.建立multi-project workspace

        如果想修改过的RTX被多个工程使用,那么最好的办法就是建立一个多工程的workspace,那么任何对RTX的修改,都会在workspace下的所有工程中得到体现。

        首先在uVision中,选择Project-New Multi-Project Workspace...然后选择一个合适的路径,建立workspace文件,例如在MyProject文件夹中建立一个叫MyWorkspacet的workspace。然后就可以添加相应的工程进入这个workspace了。

        首先添加你的RTX工程文件,其路径应该是MyProject/RTXMod/RTX_Lib_CM。然后添加你想使用RTX的工程文件。uVision5的工程文件好像还不太支持workspace,所以如果工程文件是uVision5的,得先转存为uVision4的工程文件,再添加到workspace中。


    3.添加配置文件和库

        在Blinky能够调用本地的RTX前,需要添加几个文件:

        1.RTL.h:这个文件是编译器自带的头文件,如果要使用修改的RTX的function,那么必须得使用相应修改过的RTX.h。这个文件可以在C:KeilARMRV31INC中找到。在RTXMod下创建INC文件夹,将该头文件复制到这个目录下。并在main.c中,加入其路径,如

    [cpp][/cpp]
    view plaincopyprint?
             
    • #include "C:UsersUserDesktopMyProjectRTXModINCRTL.h"
    #include "C:UsersUserDesktopMyProjectRTXModINCRTL.h"
    这里使用""而不是<>去标明include的文件,是因为""会让编译器先搜索指定路径,而<>会让编译器直接在预编译的库里寻找相关文件。
    2.RTX_Conf_CM.c: 这个文件是RTX的参数配置文件,在MyProjectConfig下,在uVision工程中添加该文件即可。RTX_Conf_CM中include的是原来的RTX,同样得按照main那样,修改include语句。
    3.RTX_CM4.lib: 这个就是我们刚刚第一步编译好的库文件,在MyProjectRTXModCM4F_LE下,同样用uVision添加进工程。
    完成这几步就可以使用自己编译的RTX了。尝试加入os_sys_init(init);或者其他RTX的function,build和run。没有问题。
    4.添加自己的RTX function
    修改RTX function基本比较简单,这里就介绍怎样添加新的RTX function。我们这里考虑一个这样的function:
    [cpp][/cpp]
    view plaincopyprint?
             
    • U32 os_mod_version (void){       
    • return __RL_ARM_VER;       
    • }
    U32 os_mod_version (void){

          return __RL_ARM_VER;

    }

    这个function的主要功能就是返回当前RTX的版本号。这个版本号在头文件RTL.h中有相关定义:
    [cpp][/cpp]
    view plaincopyprint?
             
    • /* RL-ARM version number. */       
    • #define __RL_ARM_VER 473
    /* RL-ARM version number. */
    #define __RL_ARM_VER    473
    首先创建.c文件和相应的.h文件,例如rt_Mod.c和rt_Mod.h,为了和原来的路径系统协调,把这两个文件也放入SRCCM目录下,然后在RTX工程中添加rt_Mod.c文件。
    这个文件需要添加三个头文件,第一就是其对应的.h文件,这里就是rt_Mod.h文件,第二就是RTX_Config.h文件,最后就是rt_TypeDef.h文件,这些都是RTX提供的统一配置和类型定义文件,参考其他的.c文件你可以发现这些文件是必须被include的。
    同时,由于我们这里要使用__RL_ARM_VER,所以也必须要引用RTL.h头文件,所以rt_Mod.c最后就是:
    [cpp][/cpp]view plaincopyprint?    /*----------------------------------------------------------------------------    * RL-ARM - RTX Mod    *----------------------------------------------------------------------------    * Modification to the RTX    * New functions    *----------------------------------------------------------------------------    * Raymond Kwan 2014    *---------------------------------------------------------------------------*/    #include "rt_TypeDef.h"    #include "RTX_Config.h"    #include "rt_Mod.h"    #include "C:/Users/User/Desktop/OS/RTXMod/INC/RTL.h"    U32 os_mod_version (void){    return __RL_ARM_VER;    }    /*----------------------------------------------------------------------------    * end of file    *---------------------------------------------------------------------------*//*---------------------------------------------------------------------------- *      RL-ARM - RTX Mod *---------------------------------------------------------------------------- *      Modification to the RTX *      New functions *---------------------------------------------------------------------------- *      Raymond Kwan 2014 *---------------------------------------------------------------------------*/#include "rt_TypeDef.h"#include "RTX_Config.h"#include "rt_Mod.h"#include "C:/Users/User/Desktop/OS/RTXMod/INC/RTL.h"U32 os_mod_version (void){    return __RL_ARM_VER;}/*---------------------------------------------------------------------------- * end of file *---------------------------------------------------------------------------*/相应地,头文件rt_Mod.h是:[cpp][/cpp]view plaincopyprint?    /*----------------------------------------------------------------------------    * RL-ARM - RTX Mod    *----------------------------------------------------------------------------    * Modification to the RTX    * Header of new functions    *----------------------------------------------------------------------------    * Raymond Kwan 2014    *---------------------------------------------------------------------------*/    extern U32 os_sys_version (void);    /*----------------------------------------------------------------------------    * end of file    *---------------------------------------------------------------------------*//*----------------------------------------------------------------------------*      RL-ARM - RTX Mod*----------------------------------------------------------------------------*      Modification to the RTX*      Header of new functions*----------------------------------------------------------------------------*      Raymond Kwan 2014*---------------------------------------------------------------------------*/extern U32           os_sys_version (void);/*----------------------------------------------------------------------------* end of file*---------------------------------------------------------------------------*/
    最后,在RTL.h中加入函数签名,注意要在Functions Cortex-M部分中添加,而不是Functuions ARM部分添加。
    [cpp][/cpp]view plaincopyprint?    /*----------------------------------------------------------------------------    * Functions Cortex-M    *---------------------------------------------------------------------------*/    #define __SVC_0 __svc_indirect    /* Mod Functions*/    //Return the current RTX Version Number    extern U32 os_mod_version(void);/*---------------------------------------------------------------------------- *      Functions Cortex-M *---------------------------------------------------------------------------*/#define __SVC_0         __svc_indirect/* Mod Functions*///Return the current RTX Version Numberextern U32 os_mod_version(void);
    5.Batch Build和使用新的RTX function

        到这一步,就可以在你要使用新function os_sys_version();添加这个语句。然后注意因为你新添加了一个文件进入RTX projct,它还未被编译,所以要在build你的project前要先编译RTX project。
    当然也可以Batch Build两个工程。注意选择当前Active Project为你的project,而不是RTX project。点击批量构建两个工程文件。ARM-MDK会分开编译这两部分,最后再链接编译好的RTX库到你的project。
    至此,大功告成。
    6.小结

        RTX本身源代码就是开放的,而且由于其轻量级和实用性都很突出,是一个很出色的RTOS。但它也不是面面俱到,能涵盖所有的工程需求的。修改RTX内核只是为了针对具体项目进一步优化OS本身。当然这个工作量不会小。

    另一方面,查看RTX源代码,并尝试修改(或者破坏),也有利于对OS本身的理解。由于现在开发工具和开发手段的优化程度都很高了,很多应用开发并不需要深入到对OS的理解,所以OS源代码总给人庞大而枯燥的感觉。RTX是一个很好的出发点,让我们去了解一些OS更加细节的实现问题。我也希望能够通过结合对RTX内核源代码的理解和书本文献介绍的OS概念结合起来,拓宽和深化自己对OS设计的认识。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /4 下一条

    手机版|电路城

    GMT+8, 2019-7-20 01:36 , Processed in 0.112449 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部