C语言学习
C 语言是比较“低级”的编程语言,常常被调侃为“高级汇编语言”。它的语法规则非常简单,特性也不多,学起来难度不算太大。用 C 语言开发的程序执行性能非常出色,但开发效率就另当别论了。
C 语言编程入门教程,首选《C程序设计语言》,这本豆瓣评分高达 9.4 :
认真学完这本教材,C 语言编程的门道也就摸清了。除了掌握类型、控制流、函数等基本概念外,应该重点消化 数组 、指针 以及 内存管理 等高级知识点。
实践是编程的最佳途径,建议在学习的过程中,多动手编写一些程序,慢慢形成感觉。一开始可以先照抄书上的例子,慢慢地进化到模仿阶段,甚至可以是自制一些玩具程序。
开发 C 语言程序时,应该准确把握程序的 内存布局 :一个变量在内存中是如何存储的?一个结构体在内存中的布局是怎样的?一个数组在内存中是如何排列的?指针和内存地址的关系是怎样的?将指针运算放在内存中看又是怎样的?
如果需要加强对指针的理解,加深对程序内存的认识,可以接着看这本重点讲解指针的:《C和指针》。
硬件编程
硬件编程与特定硬件平台相关,按照是否带操作系统可以分成两种:
无操作系统硬件平台
这类平台一般直接跑应用程序,应用程序也可以直接操作硬件,典型的例子是 单片机 。硬件操作一般以读写 IO 端口的形式进行,而 IO 端口则被抽象成程序变量,程序只需读写相关变量即可控制硬件。
有操作系统硬件平台
这类平台由一个操作系统管理硬件,应用程序通过操作系统间接操作硬件,典型的例子是嵌入式 Linux 。硬件由运行在操作系统内核的 驱动程序 直接管理,而应用程序则通过 系统调用 与驱动程序交互,简介控制硬件。
驱动开发
操作系统通过驱动程序管理、控制硬件设备。因此,实现硬件控制的第一步——为设备编写驱动程序。
由于驱动程序跑在操作系统内核,操作系统知识基础是必须的,特别是 中断处理 、IO 、以及 内存管理 这些。以 Linux 系统为例,《Linux 内核设计与实现》是经典中的经典,不可错过。
《Linux设备驱动程序》则专门讲驱动设计开发,涵盖内核模块开发、字符设备、块设备、中断处理、内存映射、锁以及内核编程调试技巧等等,内容非常丰富。只要吃透这本书,开发驱动根本不在话下。
应用开发
应用程序通过诸如 ioctl 的系统调用,与驱动程序交互,间接控制硬件。因此,想要做好硬件应用开发,除了编程语言基础,还需要掌握与操作系统打交道的技巧,系统调用 是重中之重。
Linux/Unix 系统编程的书很多,最经典的当属《Unix环境高级编程》。这本书罗列了 Unix 系统常用系统调用,涵盖 文件IO 、进程 、线程 、进程间通讯 、内存管理 等等,简直包罗万象。
与硬件开发相关的,可以重点研究 文件IO 、高级IO 、内存管理 这几个章节。
建议在学习过程中,模仿一些常用命令,自己开发一些山寨版练练手。如果你成功开发出一个功能类似 ls 命令的程序,就意味着你对 目录结构 、文件IO 等内容的理解已经到位了。同理,尝试开发一个类似 telnet 的程序,则有助于对 套接字 ( socket )相关系统调用的理解。