关于嵌入式固件开发

时间:2018-05-14 05:14:15

标签: embedded embedded-linux hardware microcontroller

在过去的几天里,我发现嵌入式硬件顶部的RTOS层非常重要。 我的问题是: 设备驱动程序之间是否存在任何分叉(用C语言直接烧写在微控制器上) 和Linux设备驱动程序?

1 个答案:

答案 0 :(得分:1)

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

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

无论如何,一些通常可以接受的东西可以是以下内容。 Linux的不是,在其“普通”版本中,是一个实时操作系统 - 使用术语RTOS代替,“实时”部分是隐含的。所以,这可能是一个分叉。但是,我认为最重要的是,嵌入式固件试图解决硬件要完成的任务,而无需添加任何其他内容。 Linux O.S.相反是一般目的 - 它意味着它提供了许多服务和功能,在许多情况下,不需要,只会提供更多的成本,更少的性能,更复杂。

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

Linux驱动程序不是针对应用程序,而是针对内核。应用程序很少与驱动程序通信 - 它使用统一的语言(简称“文件系统习惯用法”)与内核通信,内核又代表应用程序调用驱动程序。

我非常清楚的一个简单例子是串口。在Linux下你打开一个文件(可能是/ dev / ttyS0),使用一些IOCTL等来设置它,然后开始读取和写入文件。你甚至不关心中间是否有驱动程序,驱动程序是在不知道应用程序的情况下编写的 - 驱动程序只与内核交互。

在许多嵌入式情况下,您将串行端口设置为直接写入硬件寄存器;然后编写两个中断例程,读取和写入串行端口,从ram缓冲区获取数据并将数据放入ram缓冲区。应用程序直接读取和写入数据到这些缓冲区。特殊事件(或非特殊事件)可以直接从中断处理程序发送到应用程序。有时我会直接在中断例程中实现串行协议​​(校验和,数据包,序列)。它更快,更简单,并且使用更少的资源。但显然这部分软件不再是常识中的“驱动因素”。

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