Embedded 关于嵌入式固件开发

Embedded 关于嵌入式固件开发,embedded,embedded-linux,hardware,microcontroller,Embedded,Embedded Linux,Hardware,Microcontroller,在过去的几天里,我发现RTOS层在嵌入式硬件上有多么重要。 我的问题是: 设备驱动程序之间是否存在任何分歧(直接在微控制器上用C编写) Linux设备驱动程序呢 这个问题有点宽泛,但可以给出一个答案,这个答案本身有点宽泛 其广泛性源于“嵌入式硬件”不是一个精确的术语。硬件范围从4位微控制器,或8针微控制器,到大型CPU,这些CPU与linux机器(台式机和服务器)上使用的典型处理器有许多共同点。Linux本身可以定制到不再像普通操作系统的程度 无论如何,有几件事,通常可以接受,可以如下。Linu

在过去的几天里,我发现RTOS层在嵌入式硬件上有多么重要。 我的问题是: 设备驱动程序之间是否存在任何分歧(直接在微控制器上用C编写)
Linux设备驱动程序呢

这个问题有点宽泛,但可以给出一个答案,这个答案本身有点宽泛

其广泛性源于“嵌入式硬件”不是一个精确的术语。硬件范围从4位微控制器,或8针微控制器,到大型CPU,这些CPU与linux机器(台式机和服务器)上使用的典型处理器有许多共同点。Linux本身可以定制到不再像普通操作系统的程度

无论如何,有几件事,通常可以接受,可以如下。Linux在其“普通”版本中不是一个实时操作系统,而是一个术语RTOS,暗示了“实时”部分。所以,这可能是一个分歧。但我认为,最重要的是,嵌入式固件试图在不添加任何其他内容的情况下解决硬件和要完成的任务。相反,Linux O.S.是通用的——这意味着它提供了许多在许多情况下不需要的服务和功能,只会带来更高的成本、更低的性能和更复杂的问题

通常,在中小型嵌入式系统中,甚至没有“驱动程序”:硬件和应用程序直接相互通信。当然,当硬件(或多或少)是标准的(如USB端口、以太网控制器、串行端口)时,编程框架可以提供随时可用的软件,有时称为“驱动程序”——但通常它不是驱动程序,而只是一个库,带有一组初始化设备和交换数据的函数。应用程序使用这些库例程直接管理设备。O.S.层不存在,或者,如果程序员想要使用RTOS,他必须检查没有问题

Linux驱动程序的目标不是应用程序,而是内核。而且应用程序很少与驱动程序对话——它使用统一的语言(特别是“文件系统习惯用法”)与内核对话,内核代表应用程序调用驱动程序

我非常熟悉的一个简单示例是串行端口。在Linux下,打开一个文件(可能是/dev/ttyS0),使用一些IOCTL和类似的方法来设置它,然后开始读写该文件。你甚至不关心中间有一个驱动程序,而驱动程序是在没有应用程序知识的情况下编写的——驱动程序只与内核交互。 相反,在许多嵌入式情况下,设置串行端口直接写入硬件寄存器;然后编写两个中断例程,读取和写入串行端口,从ram缓冲区获取数据,并将数据放入ram缓冲区。应用程序直接将数据读写到这些缓冲区。特殊事件(或不太特殊的事件)可以直接从中断处理程序向应用程序发送信号。有时我直接在中断例程中实现串行协议(校验和、数据包、序列)。它更快、更简单,并且使用更少的资源。但显然,这一软件不再是常识上的“驱动程序”


希望这个答案至少解释了整个画面的一部分,这是非常大的。

驱动程序只是一些直接与硬件对话的代码,然后为应用程序提供某种形式的抽象层(HAL),这样就可以在不知道脏细节的情况下访问硬件。否则,在一个微控制器的驱动程序和一个Linux驱动程序之间会有很大的差异。在后一种情况下,你有各种操作系统的细节和API来考虑,所以驱动程序必须以某种格式。