Update 20200603 Code your hardware using this open source RTOS.md

This commit is contained in:
SilentDawn 2020-08-10 20:35:02 +08:00 committed by GitHub
parent ec91574e4b
commit 4b33cf108e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -7,34 +7,34 @@
[#]: via: (https://opensource.com/article/20/6/open-source-rtos)
[#]: author: (Zhu Tianlong https://opensource.com/users/zhu-tianlong)
在这个开元实时操作系统下驱动你的硬件
使用 RT-Thread 实时操作系统驱动你的硬件
======
编程驱动一个芯片是相当有难度的,但在嵌入式系统上,实时操作系统为你解决很多此类的困难
编程驱动一个微处理器芯片是相当有难度的,但在嵌入式系统开发上,实时操作系统可以为你解决很多此类的困难
![Puzzle pieces coming together to form a computer screen][1]
通用计算的角度,操作系统是提供计算机基本功能的一组软件。操作系统保证了计算机硬件可以探测并响应外围器件(如键盘、屏幕、移动设备、打印机等),并管理内存空间和外部存储空间。
通用计算的角度,操作系统是提供计算机基本功能的一组软件。操作系统保证了计算机硬件可以探测并响应外围器件(如键盘、屏幕、移动设备、打印机等),并管理内存空间和外部存储空间。
虽然一个 CPU 核心同一时间只能运行单个线程,但现代操作系统可以使多个程序表现的像是在同时运行。每一个任务执行的如此之,一系列任务切换的如此之快,以至于看起来多个任务像是在并行进行。这一切都是由叫做 _调度器_ 的子进程来控制的。
虽然一个 CPU 核心同一时间只能运行单个线程,但现代操作系统可以使多个程序表现的像是在同时运行。每一个任务执行的如此之,一系列任务切换的如此之快,以至于看起来多个任务像是在并行进行。这一切都是由 _调度器_ 的子进程来控制的。
操作系统通常是为计算机准备的,安装在硬盘上,管理计算机所要执行的任务。
### 为什么实时操作系统对嵌入式系统而言不可或缺
我曾经在 2008 年接触过嵌入式软件,那时候我还是一名学生,正在学习 [MCS-51][2] 微处理器编程。因为我的主修专业是计算机科学,我在其它课程中的所有程序都是在 PC 上执行的,但为微处理器芯片编程是完全不同的体验。人生中第一次,我看到我的程序在电路板上运行,即使到现在我仍然记得,在我看到自己人生中第一个循环点灯程序成功运行时的那种兴奋和激动。
我曾经在 2008 年接触过嵌入式软件,那时候我还是一名学生,正在学习 [MCS-51][2] 微处理器编程。因为我的主修专业是计算机科学,我在其它课程中的所有程序都是在 PC 上执行的。为微处理器芯片编程是完全不同的体验。人生中第一次,我看到我的程序在裸板上运行,即使到现在我仍然记得,在我看到自己人生中第一个循环点灯程序成功运行时的那种兴奋和激动。
但那种兴奋转瞬即逝。随着为电路板写出越来越多的程序,我遇到了越来越多的问题。这种沮丧并不是我独有的。直接为芯片写程序很困难,这也是 PC 要运行操作系统的很重要的原因。不幸的是,微处理器芯片(或嵌入式系统)通常是没有操作系统的它们只能采用”硬编码“的方式编程,没有操作系统帮助你管理代码的运行。
但那种兴奋转瞬即逝。随着为板写出越来越多的程序,我遇到了越来越多的问题。这种沮丧并不是我独有的。直接为芯片写程序很困难,这也是 PC 要运行操作系统的很重要的原因。不幸的是,微处理器芯片(或嵌入式系统)通常是没有操作系统的它们只能采用”硬编码“的方式编程,没有操作系统帮助你管理代码的运行。
在以”硬编码“的方式为处理芯片编写代码的时候,可能会遇到下列问题:
#### 并发
在裸上是没有管理程序运行的现成守护进程的。嵌入式系统软件中,无可避免的要把所有的逻辑功能放在一个巨大的 `while (1)` 循环中。每个功能包含一个或多个延时函数。CPU 在运行延时函数的时候是顺序执行的,没有任何办法跨越一个不必要的延时,所以运行事务的复位操作只能等待。最终就是很多的 CPU 处理时间浪费在空循环上,这对任务的并发非常不利。
在裸上是没有管理程序运行的现成守护进程的。嵌入式系统软件中,无可避免的要把所有的逻辑功能放在一个巨大的 `while (1)` 循环中。每个功能可能包含一个或多个延时函数。CPU 在运行延时函数的时候是顺序执行的,没有任何办法跨越一个不必要的延时。正因如此,运行事务的复位操作只能等待。最终结果就是很多的 CPU 处理时间浪费在空循环上,这对任务的并发非常不利。
#### 模块化
从软件工程的角度,高內聚低耦合原则在软件开发过程中被不厌其烦的频频强调,但是嵌入式软件的不同模块之间常常是重度耦合的,很多功能都集中在一个巨大的 `while (1)` 循环中,很难切分为模块。设计低耦合软件在编程上只是繁琐一些,但在嵌入式系统上,要低耦合就难以编写比较大型的软件。
与此同时,如果使用了看门狗定时器,程序员还得在调用延时函数时倍加小心。如果延时时间太长,主程序没有及时”喂狗“的时机,那么看门狗将在程序运行过程中被触发。嵌入式系统软件开发过程中,需要考虑的东西太多了,即便是个简单的延时函数,都不能掉以轻心。软件越复杂,就越需要细心,越需要想方设法将一系列具有精细时间关系的交互功能拆分为模块。
与此同时,如果使用了看门狗定时器,程序员还得在调用延时函数时倍加小心。如果延时时间太长,主程序没有得到及时”喂狗“的时机,那么看门狗将在程序运行过程中被触发。嵌入式系统软件开发过程中,需要考虑的东西太多了,即便是个简单的延时函数,都不能掉以轻心。软件越复杂,就越需要细心,越需要想方设法将一系列具有精细时间关系的交互功能拆分为模块。
#### 软件生态
@ -46,26 +46,26 @@
#### 实时性
有些应用领域对实时性有要求,比如有些场景,必须在特定的时间触发特定的软件操作。在工业控制场景,实体控制过程中,机械部件必须以确定的时间和确定的顺序执行动作。如果不能保证控制系统的实时性,整个机器可能出现功能异常,甚至危及工人命。在裸板平台,所有的功能都塞在一个巨大的 `while (1)` 循环中,实时性无从保证。
有些应用领域对实时性有要求,比如有些场景,必须在特定的时间触发特定的软件操作。在工业控制场景,机器实体控制过程中,机械部件必须以确定的时间和确定的顺序执行动作。如果不能保证控制系统的实时性,整个机器可能出现功能异常,甚至危及工人命。在裸板平台,所有的功能都塞在一个巨大的 `while (1)` 循环中,实时性无从保证。
#### 重用性
重用性依赖于模块化。没谁愿意翻来覆去做一成不变的事,对程序员而言更是如此。这不单单是浪费时间,要命的是这使得代码的维护异常复杂。尤其是,因为功能的实现依赖于底层的硬件,所以使用了不同芯片的不同种硬件平台上,同样的功能不得不针对每个硬件平台进行适配。这种情况下,重新早轮子是无可避免的。
重用性依赖于模块化。没谁愿意翻来覆去做一成不变的事,对程序员而言更是如此。这不单单是浪费时间,要命的是这使得代码的维护异常复杂。尤其是,因为功能的实现依赖于底层的硬件,使用了不同芯片的不同种硬件平台上,同样的功能不得不针对每个硬件平台进行适配。这种情况下,重新发明轮子是无法避免的。
### 实时操作系统的优势
幸运的是,有针对各种微处理器芯片的操作系统可用它们被称为实时操作系统RTOS和大多数操作系统一样它们拥有调度器保证代码以可预见的顺序运行。
幸运的是,现在有针对各种微处理器芯片的操作系统可用它们被称为实时操作系统RTOS和大多数操作系统一样它们拥有调度器保证代码以可预见的顺序运行。
我是在 2010 年初次在裸板上使用实时操作系统。那时候,[STM32][4] 系列微处理器MCU开始普及因为这种微处理器性能强大、功能丰富很多人在上面跑操作系统。我使用的是 [RT-Thread][5] 操作系统,有很多基于它的现成组可用。它使用的是 Apache 2.0 许可,和其它操作系统的许可相比,我觉得这个很舒心。我已经使用它作为开发平台 10 年了。
我是在 2010 年初次在裸板上使用实时操作系统。那时候,[STM32][4] 系列微处理器MCU开始普及因为这种微处理器性能强大、功能丰富很多人在上面跑操作系统。我使用的是 [RT-Thread][5] 操作系统,有很多基于它的现成组可用。它使用的是 Apache 2.0 许可,和其它操作系统的许可相比,我觉得这个很舒心。我已经基于它作为平台从事开发工作 10 年了。
使用实时操作系统为裸板编程,操作系统为我们解决了需要处理的大部分问题。
#### 模块化
在操作系统支持下,整个软件可以分割为多个任务(即所说的线程)。每个线程拥有自己独立的运行空间。线程之间互相独立,这促进了软件的模块化。
在操作系统支持下,整个软件可以分割为多个任务(即线程)。每个线程拥有自己独立的运行空间。线程之间互相独立,这促进了软件的模块化。
#### 并发
如果一个线程有延时函数,它将自动给需要 CPU 的线程让度使用权,这提高了 CPU 的整体利用率,也提升了系统的并发性能。
如果一个线程有延时函数,它将自动让出 CPU 资源给需要 CPU 的线程,这提高了 CPU 的整体利用率,也提升了系统的并发性能。
#### 实时性