ARM裸机程序 vs ARM-Linux程序

软件的诞生和操作系统的起源

电子技术从出现至今发展飞快,从Intel开发出第一块芯片开始,人类进入了电子信息时代。

芯片内有集成电路,使用电子信号0和1的组合表示信息,进行运算处理。

芯片有自己的指令集,不同的指令进行不同的操作,指令就是输入给芯片的0和1信号。

这些指令由程序员来设计编写,芯片通过执行这一系列指令来执行任务。

所以,最初的程序就是机器码,由CPU直接访问指令的存储地址,然后执行。

执行结果是输出的计算结果或者控制外部硬件或外设的动作。

然后程序语言升级,由汇编语言升级为C语言,更易阅读理解和编写。

这是一个庞大的产业,无数人参与其中,硬件、软件快速迭代,百花齐放。

但这也带来了问题,软件控制硬件,如果硬件改了,软件也要改。

不同的硬件配置,也需要不同的驱动程序。

自然需要制定标准,这样减少冲突,跟有利于用户和整个市场。

当标准不断完善,功能更加清晰,各个硬件外设或者软件模块发展更加成熟。

慢慢的,不断完善的底层的、支持性的软件模块组合在一起,构成了操作系统。

操作系统的目的之一,就是屏蔽硬件的差异化,使编程人员在OS之上写代码,而不用具体理解硬件的细节或差异。

这会大大提高软件的开发效率,提高软件质量,加快软件推向市场。

ARM程序的选择,Bare Metal(裸机) ,还是Linux OS?

回到ARM芯片,如果是简单的应用,直接使用裸机程序就好。

如果是很复杂的程序,就需要使用OS。

裸机程序就是程序或软件直接在硬件上运行,可以直接面对硬件进行操作。

就像单片机开发里面,GPIO、IIC、SPI等,都是用代码直接操作寄存器来完成相应的功能。包括中断也要自己处理。

内存也是自己直接分配使用,整个地址空间是透明的统一的。

这种一般都是简单的处理器芯片,Micro Controller Unit 简称MCU。

但现在的情况,这种单片机的开发,厂商都会提供开发包,里面有各种现成的各种外设操作或相关应用的参考样例,减少了开发难度。

同时,也有很多库可以使用,减少开发工作量。比如ARM-M0芯片开发时,开发IDE里就会link一个微型的标准C库,一些基本函数可以直接调用,比如字符串操作等。

在嵌入式Linux里,程序是运行在Linux Kernel之上的。

kernel是操作系统的核心,几乎控制了系统中的一切。软件和硬件的各种操作都要经过kernel。

用户一般创建的是User Space Applications, 是无法直接访问硬件,所以需要通过Kernel Space来访问硬件。

在User space中,所见的只是一大块内存和Kernel的接口。

这样做的最大好处就是user space applications是硬件无关的。

Kernel的核心职责和操作:进程管理、内存管理、进程间通信、设备驱动、电源管理等。

---------------------------------------------- 

使用Linux操作系统有很多好处:

1,代码安全性提高。普通单片机程序开发,写错一个控制指针或者数组操作越界,整个系统就挂掉了。

但用OS的话,有内存保护功能,不同的进程不会影响到对方的内存。

OS能够使运行的程序的一些任务在supervisor模式下运行,一些任务在用户模式下运行,权限不同,降低操作风险。

2,集成了大量的外设驱动,开发时对底层硬件的驱动控制可以不用操心或者改动很少。这样提高了程序的可移植性,上层应用程序是硬件无关的。

即使这个设备没有驱动,在OS上进行驱动开发也会容易很多,有参考模板、有可复用函数等。

3,对多线程或多进程的支持,包括优先级管理。这部分功能如果要自己实现显然很复杂并不能保证性能和稳定性。

当然也有一些RTOS系统能支持thread,这是一个选择问题,选择自己需要的、喜欢的、合适的、长期有效的技术生态(community)。

4,OS上已经实现和集成了很多可用的库,减少我们的工作量,更快更有效的完成软件开发工作。

同样,基于OS已有的库,会跟容易开发出更强的库,这样不断加强,使得选择更多,自己的应用可以借用第三方的库,减少风险提高效率。

5,Linux操作系统有很强的可裁剪性,便于不同的规模的应用选择需要的功能或模块。

6,Linux是行业通用的,应用广泛的,接受度高,生态完善,还是免费。

就比如说我正在开发个基于I2C外设的应用,MCU里要写驱动I2C外设的代码。

在硬件第一版时,要做bringup,这时如果使用Linux,就可以利用现成的I2C tools来协助检测I2C设备,读取写入I2C信息。

具体可看后面有一篇介绍Linux I2C tools的文章。

使用嵌入式Linux OS也有一些缺点:

1,相对小规模应用来讲系统太复杂了。

2,相对裸机开发来说,学习曲线太陡峭

3,对资源要求较高,运行起Linux Kernel有最小的硬件资源条件。

4,系统会不断更新升级,要注意整个Linux Kernel和相关库的版本管理。

5,相对裸机程序,Linux OS是个通用系统,内部机制为众所知,所以要注意安全和保护问题。

----------------------------------------------  

裸机程序的优点:

1,性能出众。同样应用比运行LinuxOS的快大概100倍。

2,对于小规模应用,开发简单、快速。

3,可考性高。

缺点:

1,复杂度随着系统规模和功能的增加成指数级增加。

2,一些基本的或标准的函数需要自己开发,来适配相应的硬件。

3,没有多线程支持

---------------------------------------------- 

关于Linux OS的实时性(Real-time)

一个运行在userspace的application由内核调度,执行线程管理。

但这也意味着,如果OS需要管理其他的系统调用或进程,这个app可以被kerenl随时打断.

所以那些时间敏感的GPIO访问的应用是不适合Linux系统,需要特殊处理。

也有专门用于实时系统的Linxu扩展,比如RTLinux。

----------------------------------------------  

那么问题来了,裸机程序和Linux的程序的编译有何不同?

裸机程序和Linux程序编译后的文件格式是一样的,都是基于ARM架构的可执行指令集。

主要区别在于裸机程序和Linux程序使用的C标准库不同。

一般Linux上用的C库是GNU的C标准库,glibc。如果是ARM平台则是基于ARM平台编译的glibc。

这个根据使用的编译工具链不同,也可能使用不同的基于Linux的C标准库。

而裸机程序用的C标准库可能没有,或者可能是别的库文件,比如newlib(嵌入式专用的C标准库)。

这个也是根据不同的编译器及工具链或环境,可能使用不同的标准库。

后面会就ARM使用的编译环境或工具链做说明再发个博文。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: arm-none-linux-gnueabi-gcc 是一种编译器,它可以用来编译程序以在没有操作系统的 Linux on ARM 架构设备上运行。 "arm" 指的是这些设备使用的处理器架构,"none" 指的是没有操作系统,"linux" 指的是目标环境是 Linux,"gnueabi" 指的是使用 GNU 的 Embedded Application Binary Interface。 ### 回答2: arm-none-linux-gnueabi-gcc是一种适用于ARM处理器的GNU编译器,它适用于运行Linux操作系统的ARM处理器。它是一种交叉编译器,可以在一种操作系统上编译代码并在另一种操作系统上运行该代码。 arm-none-linux-gnueabi-gcc能够编译C、C++和汇编语言。它还支持各种优化选项,并可以生成目标文件、可执行文件以及动态链接库。 arm-none-linux-gnueabi-gcc使用GNU工具链作为其基础环境,该工具链包含了众多的编译器、调试器等,可以实现完整的软件开发流程。它还支持多种架构和操作系统,包括ARM、x86、MIPS和PowerPC等处理器。 在嵌入式系统开发中,通常需要使用交叉编译器来开发和调试嵌入式系统的应用程序,因为该应用程序将在另一种体系结构和操作系统上运行。arm-none-linux-gnueabi-gcc正是一种非常流行的交叉编译器,它适用于ARM架构的嵌入式系统,是很多嵌入式系统开发者必备的工具之一。 总之,arm-none-linux-gnueabi-gcc是一种适用于ARM处理器的GNU编译器,它可以在Linux操作系统上运行,并可以生成目标文件、可执行文件以及动态链接库。它使用GNU工具链作为基础环境,支持多种架构和操作系统,在嵌入式系统开发中有着广泛的应用。 ### 回答3: arm-none-linux-gnueabi-gcc是一种交叉编译器,它用于将C、C++等高级语言编写的代码编译成ARM指令集的可执行文件,以便在ARM架构的嵌入式系统上运行。 其中,arm表示目标平台为ARM架构,none表示针对的是裸机环境,即没有操作系统支持的单片机或嵌入式设备;linux表示编译生成的可执行文件是在Linux系统上运行的,gnueabi表示使用GNU工具链和嵌入式应用程序二进制接口(EABI)。 arm-none-linux-gnueabi-gcc作为一种交叉编译器,它具有比较高的灵活性和可移植性,可以在主机环境中生成适用于嵌入式设备的应用程序。使用该编译器可以大大简化程序的开发过程,同时也可以提高程序的性能和效率。 在使用arm-none-linux-gnueabi-gcc进行编译时,需要注意一些问题,如目标平台的架构、芯片类型、系统版本等。此外,还需要了解所编写的程序所需要的库文件,并将其链接到目标文件中。 总之,arm-none-linux-gnueabi-gcc是一种重要的编译器,它为嵌入式系统开发提供了强大的编译能力,为开发人员提供了方便快捷的开发方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值