关于嵌入式固件开发
About embedded firmware development
这几天发现了嵌入式硬件最顶层的RTOS层是多么的重要。
我的问题是:
设备驱动之间有没有分叉(用C写直接烧过单片机)
还有 Linux 设备驱动程序?
这个问题有点宽泛,但是可以给出一个本身有点宽泛的答案。
之所以如此广泛,是因为 "embedded hardware" 不是一个精确的术语。该硬件范围从 4 位微控制器或 8 针微控制器到大型 CPU,它们与 linux 机器(台式机和服务器)上典型使用的典型处理器有许多共同点。 Linux 本身可以定制到不再像普通操作系统的程度。
总之,总的来说,可以接受的有以下几点。 Linux 是 而不是 ,在它的 "plain" 版本中,是一个实时操作系统——用术语 RTOS 代替,隐含了 "real time" 部分。所以,这可能是一个分叉。但我认为,最重要的是嵌入式固件试图解决硬件 和 要完成的任务,而无需添加任何其他内容。 Linux O.S。相反是通用的——这意味着它提供了许多服务和功能,在许多情况下,这些服务和功能是不需要的,只会带来更多的成本、更少的性能、更多的复杂性。
通常,在小型或中型嵌入式系统中,甚至没有 "driver":硬件和应用程序直接相互对话。当然,当硬件(或多或少)是标准的(如 USB 端口、以太网控制器、串行端口)时,编程框架可以提供即用型软件,有时称为 "driver" - 但是通常它不是驱动程序,而只是一个带有一组函数的库,用于初始化设备和交换数据。应用程序使用这些库例程来直接管理设备。 O.S。层不存在,或者,如果程序员想使用 RTOS,他必须检查没有问题。
一个Linux 驱动程序不是针对应用程序的,而是针对内核的。并且应用程序很少与驱动程序对话 - 它使用统一语言(通常 "file system idiom")与内核对话,而内核又代表应用程序调用驱动程序。
一个我很熟悉的简单例子就是串口。在 Linux 下你打开一个文件(可能是 /dev/ttyS0),使用一些 IOCTL 之类的东西来设置它,然后开始读写文件。你甚至不关心中间有一个驱动程序,驱动程序是在不了解应用程序的情况下编写的——驱动程序只与内核交互。
相反,在许多嵌入式情况下,您设置串行端口直接写入硬件寄存器;然后你写了两个中断例程,它们读写串行端口,获取和放置数据 from/into ram 缓冲区。应用程序直接将数据读取和写入这些缓冲区。特殊事件(或不太特殊的事件)可以直接从中断处理程序向应用程序发出信号。有时我直接在中断例程中实现串行协议(校验和、数据包、序列)。它更快、更简单,并且使用的资源更少。但显然这款软件已经不是常识中的"driver"
希望这个回答至少能说明整个画面的一部分,画面很大。
这几天发现了嵌入式硬件最顶层的RTOS层是多么的重要。 我的问题是: 设备驱动之间有没有分叉(用C写直接烧过单片机) 还有 Linux 设备驱动程序?
这个问题有点宽泛,但是可以给出一个本身有点宽泛的答案。
之所以如此广泛,是因为 "embedded hardware" 不是一个精确的术语。该硬件范围从 4 位微控制器或 8 针微控制器到大型 CPU,它们与 linux 机器(台式机和服务器)上典型使用的典型处理器有许多共同点。 Linux 本身可以定制到不再像普通操作系统的程度。
总之,总的来说,可以接受的有以下几点。 Linux 是 而不是 ,在它的 "plain" 版本中,是一个实时操作系统——用术语 RTOS 代替,隐含了 "real time" 部分。所以,这可能是一个分叉。但我认为,最重要的是嵌入式固件试图解决硬件 和 要完成的任务,而无需添加任何其他内容。 Linux O.S。相反是通用的——这意味着它提供了许多服务和功能,在许多情况下,这些服务和功能是不需要的,只会带来更多的成本、更少的性能、更多的复杂性。
通常,在小型或中型嵌入式系统中,甚至没有 "driver":硬件和应用程序直接相互对话。当然,当硬件(或多或少)是标准的(如 USB 端口、以太网控制器、串行端口)时,编程框架可以提供即用型软件,有时称为 "driver" - 但是通常它不是驱动程序,而只是一个带有一组函数的库,用于初始化设备和交换数据。应用程序使用这些库例程来直接管理设备。 O.S。层不存在,或者,如果程序员想使用 RTOS,他必须检查没有问题。
一个Linux 驱动程序不是针对应用程序的,而是针对内核的。并且应用程序很少与驱动程序对话 - 它使用统一语言(通常 "file system idiom")与内核对话,而内核又代表应用程序调用驱动程序。
一个我很熟悉的简单例子就是串口。在 Linux 下你打开一个文件(可能是 /dev/ttyS0),使用一些 IOCTL 之类的东西来设置它,然后开始读写文件。你甚至不关心中间有一个驱动程序,驱动程序是在不了解应用程序的情况下编写的——驱动程序只与内核交互。
相反,在许多嵌入式情况下,您设置串行端口直接写入硬件寄存器;然后你写了两个中断例程,它们读写串行端口,获取和放置数据 from/into ram 缓冲区。应用程序直接将数据读取和写入这些缓冲区。特殊事件(或不太特殊的事件)可以直接从中断处理程序向应用程序发出信号。有时我直接在中断例程中实现串行协议(校验和、数据包、序列)。它更快、更简单,并且使用的资源更少。但显然这款软件已经不是常识中的"driver"
希望这个回答至少能说明整个画面的一部分,画面很大。