查看: 2638|回复: 0

【连载】嵌入式OS入门笔记-以RTX为案例(二):快速移植到RTX

[复制链接]
  • TA的每日心情
    慵懒
    2014-8-14 15:38
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-8-16 01:40:28 | 显示全部楼层 |阅读模式
    分享到:
    导读:本篇笔记将简单介绍RTX,包括基本架构,如何在Keil中配置。需要安装ARM-MDK和一块硬件板,笔记以STM32F4Discovery为例子。
            1.为什么要用RTOS

                尽管把所有程序放在一个大的循环里顺序执行,总是可能的(甚至很多时候是足够的胜任任务的),但是这样做有好几个明显的缺点:

             
    • 过分依赖中断 ISR(Interrupt Service Routine, 中断服务例程)       
    • 同步不同的ISR不容易       
    • 可预测性和延展性很差(大量的ISR,甚至是中断嵌套)       
    • 对局部的修改会对整个系统有水花效应(没有模块化,牵一发而动全身)
            RTOS主要是把要执行的运算包装在小的task里面,这样好的好处是:

             
    • 更好的程序流(program flow)和反应       
    • 多任务(尽管这是假象)       
    • 简单的ISR,强的决定性       
    • 更好的进程间通信       
    • 更好的资源管理       
    • 最关键的是,开发成本低!
                一个不成文的小经验:如果源程序大于1MB,那就有必要用RTOS了!

            2.为什么不要用RTOS

                当然,也有很多情况下我们不希望用RTOS的:

             
    • 项目简单       
    • 不想学RTOS       
    • RTOS尽管性能方便出色,但不是最优的!(好比用汇编还是用C,有经验的程序员可以写出比编译器效率更高的代码,可是编译器大大简化开发过程。)如果需要极致性能优化,那可能RTOS不是你的第一选择,毕竟RTOS是有内存和运行overhead的。       
    • 开发RTOS很耗时间       
    • 不是所有RTOS都是免费的
            3.为什么RTX

                为什么选RTX不选别的RTOS,例如FreeRTOS?

             
    • 免费(royalty-free,买断式的授权)       
    • 好上手       
    • 对硬件要求低       
    • 和ARM软硬件兼容性好(ARM-MDK自带)       
    • 可以查看源代码
                其实主要还是看应用,RTX在行业里声誉还是很好的,稳定性强,开发成本低,而且基本功能齐全。

            4.RTX的结构

                RTX其实是Keil Real-Time Library (RTL)的核心,这个RTL有很多部分的,都是在RTX kernel基础上库。 RTX Kernel本身的话,结构大概如下图:

            主要的组件有:mutex互斥锁,memory pool内存池,mailbox邮箱,time(timer)定时器, event事件, semaphore旗语或信号灯,task management进程管理等等和最核心的Scheduler排程器(进程调度器)。

            5.移植到RTX上很简单!

            移植一个现有的ARM-MDK工程到RTX上非常简单:

            1.在工程配置中选择RTX Kernel作为你的操作系统,如下图:

            2.在你的main.c里添加头文件RTL.H:

            [cpp][/cpp]
            view plaincopyprint?
            1         #include
            #include
            3.复制RTX_Conf_CM.文件到你的工程里。这个文件可以在<>ARMRLRTXConfig 路径下找到。
            4.将你原有的函数改造成task,就是在函数返回类型前添加标记 __task (双下划线) 例如:
            [cpp][/cpp]
            view plaincopyprint?
            2         __task void task(void){

            3         for(;;){

            4         //...

            5         }

            6         }

            __task void task(void){

                for(;;){

                    //...

                    }

            }

            5.初始化RTX并创建第一个task,例如:
            [cpp][/cpp]
            view plaincopyprint?

            7         os_sys_init(task);

            os_sys_init(task);

            基本就这样,具体的关于Task的API,后面的笔记会继续介绍。
            6.几个相关的文件

            完成上述几步后,你会发现你的工程里主要多了这三个文件:

             
    • RTL.h       
    • RTL_Conf_CM.c       
    • RTX_lib.c
            第一个是整个RTL的API函数签名。第二个是RTX的配置文件,你可以通过configuration wizard提供的GUI去配置你的OS。最后一个是内核的配置文件,有一些可以实时调用的配置函数。

            7.RTX的配置

            这里多说说第二个文件,你可以使用text editor去修改代码,也可以使用configuration wizard,如下图:

            这里先逐项简单介绍这里的选项:

             
    • 并行的task数       
    • 用户设定堆栈的task数       
    • 预设堆栈大小       
    • 检查是否堆栈溢出       
    • 是否在kernel mode下运行?这个意思是一般的task是否也在kernel mode下运行,一般不勾选。       
    • 硬件时钟,CM系列的Core SysTick就是专门为OS所设置的,所以如果你原来就有用到这个timer的话,你的移植可能会出现问题。       
    • 硬件时钟频率       
    • 一个tick的时间,预设是10ms,这个和delay函数和排程器有关       
    • 是否轮转式排程?       
    • 轮转式排程的时间片,如果是5,那就是5*10ms=50ms(和tick值有关)       
    • 用户时钟数       
    • ISR队列的大小
            一般主要调的就时钟频率和排程的设置。

            8.题外话-CMSIS-RTOS RTX

                uVision5提供的RTOS是CMSIS-RTOS,有点让人觉得摸不着头脑。其实CMSIS-RTOS是在RTX上的另一层封装。这样做的意义在于,建立在不同RTOS(例如RTX和FreeRTOS)的项目可以用同一套API。对于大部分ARM的核来说,其实其底层就是RTX。

                所以其实本质上是一个东西,只是API名称不同。使用CMSIS-RTOS 的好处就是稍微强的移植性。但是考虑到ARM的市场占有和他们RTX本身的兼容性,不用CMSIS-RTOS好像更好。而且两层封装,很容易把人弄晕。

                当然,如果有需要,可以参考官方文档:移植RTX到CMSIS-RTOS
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 08:47 , Processed in 0.121907 second(s), 17 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.