Q:你写的 hello,world 程序,有没有想过里面用到的 printf 是谁实现的?
A:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。
这个问题提示我们,文件系统里还要有库。
简单的自问自答到这里,要想深入了解,可以看一下 busybox 的 init.c,就可以知道 init 进程做的事情了。
当然,也可以看《嵌入式 Linux 应用开发完全手册》里构建根文件系统那章。
03
驱动程序设计的 5 个方法
1. 使用设计模式
设计模式是一个用来处理那些在软件中会重复出现的问题的解决方案。开发人员可以选择浪费宝贵的时间和预算从无到有地重新发明一个解决方案,也可以从他的解决方案工具箱中选择一个最适合解决这个问题的方案。在微处理器出现之初,底层驱动已经很成熟了,那么,为什么不利用现有的成熟的解决方案呢?
驱动程序设计模式大致分属以下 4 个类别:Bit bang、轮询、中断驱动和直接存储器访问(DMA)。
Bit bang 模式:当微控制器没有内外设去执行功能的时候,或者当所有的内外设都已经被使用了,而此时又有一个新的请求,那么开发者就应该选择 Bit bang 设计模式。Bit bang 模式的解决方案很有效率,但通常需要大量的软件开销来确保其实施的能力。Bit bang 模式可以让开发者手动完成通信协议或外部行为。
轮询模式用于简单地监视一个轮询调度方式中的事件。轮询模式适用于非常简单的系统,但许多现代应用程序都需要中断。
中断可以让开发者在事件发生时进行处理,而不用等代码手动检查。
DMA(直接存储器访问)模式允许其它外围设备来处理数据传输的需求,而不需要驱动的干预。
2. 了解实时行为
一个实时系统是否能满足实时需求取决于它的驱动程序。写入能力差的驱动是低效的,并可能使不知情的开发者放弃系统的性能。设计者需要考虑驱动的两个特点:阻塞和非阻塞。一个阻塞的驱动程序在其完成工作之前会阻止其他任何软件执行操作。例如,一个 USART 驱动程序可以把一个字符装入传输缓冲区,然后一直等到接收到传输结束标志符才继续执行下一步操作。