嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX

嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX


本篇笔记将简单介绍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:
#include <RTL.h> 
3.复制RTX_Conf_CM.文件到你的工程里。这个文件可以在<<YourKeil Directory>>\ARM\RL\RTX\Config 路径下找到。
4.将你原有的函数改造成task,就是在函数返回类型前添加标记 __task (双下划线) 例如:
__task void task(void){  
for(;;){  //...     }  
}  

5.初始化RTX并创建第一个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。


文章转载自:http://blog.csdn.net/raym0ndkwan/article/details/32859989


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再解析下内核自旋锁和优先级翻转问题

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼&#xff1f;Linux内核自旋锁之前写的自旋锁的文章&#xff0c;现在再加一篇&#xff0c;可能单纯的一两次说明不能把问题说清楚。所以再写一篇文…

ios 逆向编程(环境搭建)

首先如果你想要逆向其他的APP 动态的查看 或者修改人家APP里面的东西 1&#xff0c; 首先要有一台越狱的手机 最好是9.1以下的&#xff0c;因为9.2以上&#xff08;包括9.2&#xff09;就不能完美越狱了 2&#xff0c;手机也要5s以上的&#xff08;因为从5S开始支持arm64架构&…

最大、最小堆的实现

最大最小堆 堆是一种经过排序的完全二叉树&#xff0c;其中任一非终端节点的数据值均不大于&#xff08;或不小于&#xff09;其左子节点和右子节点的值。 最大堆和最小堆是二叉堆的两种形式。 最大堆&#xff1a;根结点的键值是所有堆结点键值中最大者。 最小堆&#xff1a;根…

嵌入式OS入门笔记-以RTX为案例:四.简单的时间管理

嵌入式OS入门笔记-以RTX为案例&#xff1a;四.简单的时间管理 上一节简单记录了进程task。有了进程以后&#xff0c;我们需要关心怎么样分配CPU资源&#xff08;或者运行时间&#xff09;给每个进程。那么就要引入排程&#xff08;scheduling&#xff09;的概念。排程一般都是O…

我等这个含蓄的技术男当上了CEO

大家好&#xff0c;祝大家五一节日快乐&#xff01;今天没有写技术文章&#xff0c;今天想吹一个人&#xff0c;他是我的朋友&#xff0c;他做公众号很久了&#xff0c;技术文章写的也不错&#xff0c;但是阅读和关注量一直没有上来&#xff0c;我之前好几次在公众号上转发了他…

广东总冠军

lets go tiger 看这篇文章之前&#xff0c;先看看我们看球的视频 恭喜广东拿下总冠军&#xff01; 恭喜胡明轩夺得FMVP&#xff01; 我当时预测的是周鹏或者胡明轩拿下FMVP&#xff0c;最后是胡明轩&#xff0c;广东后场三条枪表现都非常亮眼。如果是上一场广东夺冠&#xff0c…

每日一题(1) —— 数组计算

判断下面代码是否可执行&#xff1f;如果可执行&#xff0c;执行结果是多少&#xff1f; #include <stdio.h>int main(void) {int array[10] {0, 2, 3, 4, 5, 6, 7, 8, 9, 10};0[array] 1;printf("%d\n", (-1)[array 5]);return 0; } 分析&#xff1a; C语…

内存文章汇总,并剖析mmap

在看这篇文章之前&#xff0c;可以先看看下面这几篇文章Linux内存&#xff0c;先看这篇文章Linux内存寻址方式Linux虚拟内存TLBLinux物理内存初始化Linux io内存存在的意义~修改cmdline 把内存改成512MB用mtrace定位内存泄漏什么是内存泄漏&#xff1f;Linux内存管理slub分配器…

[综述泛读] A survey on web services composition (IJWGS, 2005)

Time: 2.5 hours Dustdar S, Schreiner W. "A survey on web services composition." International Journal of Web and Grid Services: 1-30. 2005 (30 pages, 单栏) (gs:169) Schahram Dustdar (维也纳技术大学, full prof) Dusdar是Distributed Systems Group的老…

韦老师的开发板和嵌入式书籍赠送

大家五一快乐&#xff01;我知道这个时候大家都没有什么心思学习&#xff0c;所以找了联合了几个朋友一起给大家送点东西。这几个技术号主都非常用心的给大家分享技术文章&#xff0c;我相信&#xff0c;跟他们一起&#xff0c;你们也能变得更加优秀。奖品包括&#xff1a;1. 韦…

每日一题(2)—— -2与2的比较

分析下面的代码&#xff0c;求运行结果。 #include <stdio.h>int main(void) {if(-2 > 2){printf("11111\r\n");}else{printf("22222\r\n");}return 0; }分析&#xff1a; -2和2都没有声明存储类型&#xff0c;编译器默认按int存储&#xff0c;所…

truffle unbox react 出坑指南

最近几天差点就被这鬼东西给逼疯了&#xff0c;truffle init 、truffle unbox webpack 不管我怎么运行都是对的&#xff0c;唯独truffle unbox react 不管在哪个windows都会报错&#xff0c;换了好几台电脑&#xff0c;心都累完了&#xff0c;还好我坚持了下来&#xff0c;找了…

单片机6年想转嵌入式Linux ,不知如何下手?

刷知乎看到下面这个提问。单片机6年想转嵌入式Linux &#xff0c;不知如何下手&#xff1f;现在挺尴尬&#xff0c;做的单片机产品总是感觉重复重复再重复&#xff0c;想学习点新东西&#xff0c;不知道如何转。说实话&#xff0c;这个问题自己关注了很久。今天就借题主这个问题…

每日一题(3)—— -2与2的比较(二)

分析下面的代码&#xff0c;求运行结果。 #include <stdio.h>int main(void) {if(-2L > 2UL){printf("11111\r\n");}else{printf("22222\r\n");}return 0; }分析&#xff1a; 常量后面接L表示long型存储&#xff0c;UL表示unsigned long型存储&a…

嵌入式技术面试时的10大潜规则

编排 | strongerHuang微信公众号 | 嵌入式专栏找工作也是一门技能&#xff0c;有的人很快就找到自己喜欢的工作&#xff0c;有的人找了很久也没找到合适的工作。下面给大家分享几点找工作过程中存在的“潜规则”内容。嵌入式专栏1面试的本质不是考试&#xff0c;而是告诉面试官…

每日一题(4)—— (a ^ b 2)

分析下面的代码&#xff0c;求运算结果。 #include <stdio.h>int main(void) {int a 6, b 4;printf("%d\n", a ^ b << 2);return 0; }分析&#xff1a; 主要是考的是“优先级”和按位“异或”&#xff0c; 左移运算符优先级高于按位异或运算符&#…

轻轻的你来了,悄悄的你走了,邓总没有带走一个bug

写这篇文章的时候&#xff0c;比较晚&#xff0c;所以思绪是清晰的&#xff0c;这个时候刚好是邓总来公司跟我交接离职的最后一天。给邓总制作的告别MV&#xff1a;我跟邓总2017年12月在恒大认识&#xff0c;我们入职时间相差一周&#xff0c;我入职的时候就开始注意到旁边的这…

神奇的css3(2)动画

四、Css3 2D动画 1、2D 转换方法 函数 描述 matrix(n,n,n,n,n,n) 定义 2D 转换&#xff0c;使用六个值的矩阵。 translate(x,y) 定义 2D 转换&#xff0c;沿着 X 和 Y 轴移动元素。 translateX(n) 定义 2D 转换&#xff0c;沿着 X 轴移动元素。 translateY(n) 定义 2D…

固定宽度弹性布局(以适应各种各辨率)

最佳网页宽度及其实现——新手可了解一下 1.设计网页的时候&#xff0c;确定宽度是一件很苦恼的事。以minifun.cn为例&#xff0c;根据Google Analytics的统计&#xff0c;半年多以来&#xff0c;访问者的屏幕分辨率一共有81种。最小的分辨率是122x160&#xff0c;这应该是手机…

B站这套教程火了,火速搬运!限时删除~

最近好多粉丝给我留言&#xff0c;寻求人工智能入坑资源&#xff0c;想利用人工智能来实现一些大胆的想法、项目或创意&#xff0c;或是想进入AI行业搞钱。不过细聊之下&#xff0c;大部分伙伴苦于不知从何入手&#xff0c;找不到重点。更甚至被烧脑的算法劝退&#xff0c;折腾…