对于学习嵌入式Linux开发,务必先搞定C语言,这里的C语言既包括基础的C语言语法,也包括对于Linux的调用和编程实现,很多同学都容易忽视后者。
我之前写过关于嵌入式Linux的整体路线,也不矛盾,因为嵌入式Linux有很多技术和方向,需要不断的探索学习,今天主要说的是从C语言角度切入。
如果有感兴趣想入门的同学也欢迎参加我的一对一咨询,可以在职业生涯初期快速进步,非常超值的个人投资。
首先是C语言基础学习思路:
对于C语言基础,可以直接选择一本书或者一个比较好的教程都可以,这部分是大同小异的。
我个人比较喜欢《C语言程序设计现代方法》这本书,也是我看了很多本C语言书籍之后的考量。
C语言的基础知识主要包括:
一、基本语法
语句:C语言的代码由一行行语句组成,语句是程序执行的一个操作命令。C语言规定,语句必须使用分号结尾。
表达式:C语言的各种计算主要通过表达式完成。表达式是一个计算式,用来获取值。
语句块:C语言允许多个语句使用一对大括号{}组成一个块,也称为复合语句。
空格与注释:空格主要用来帮助编译器区分语法单位,增加代码的可读性。注释是对代码的说明,编译器会忽略注释。
二、数据类型
C语言提供了丰富的数据类型来支持不同的数据操作和存储需求,包括:
整型:如char(1字节)、short(2字节)、int(通常为4字节)、long(通常为4或8字节)、long long(8字节),用于存储整数值。
浮点型:如float(4字节,单精度)、double(8字节,双精度)、long double(通常为8或16字节,更高精度),用于存储带小数部分的近似值。
字符型:char类型用于存储单个字符。
布尔型:_Bool类型用于存储布尔值(true或false)。
指针型:指针是一种特殊的数据类型,用于存储变量的内存地址。
数组型:数组是一种存储相同类型数据的集合,可以通过索引访问其中的元素。
结构体:struct用于定义一种包含不同数据类型成员的复合数据类型。
共用体:union用于定义一种可以存储不同数据类型的数据结构,但只能同时存储其中的一种数据类型。
枚举型:enum用于定义一组具有离散取值的常量。
空类型:void表示没有类型,用于返回没有值(void函数)或作为通用指针类型。
三、变量与常量
变量:变量是内存中的一块区域,用于存储数据。变量名必须以字母或下划线开头,只能包含字母、数字和下划线,且不能使用C语言的关键字。变量需要先定义后使用,定义时需要指定其类型。
常量:常量是程序运行过程中值不变的量。在C语言中,常量可以用直接的数值表示,也可以通过#define预处理指令或const关键字定义。
四、运算符
C语言提供了丰富的运算符,包括:
算术运算符:如+(加)、-(减)、*(乘)、/(除)、%(取模)。
关系运算符:如==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
逻辑运算符:如&&(逻辑与)、||(逻辑或)、!(逻辑非)。
位运算符:如<<(左移)、>>(右移)、~(按位取反)、|(按位或)、^(按位异或)、&(按位与)。
赋值运算符:如=(赋值)、+=(加后赋值)、-=(减后赋值)等。
条件运算符:? :,用于实现简单的条件判断。
其他运算符:如逗号运算符,、指针运算符*和&、求字节运算符sizeof、强制类型转换运算符(类型)等。
五、控制结构
C语言提供了三种基本控制结构来实现程序的流程控制:
顺序结构:按照书写顺序执行每条语句。
选择结构:根据条件表达式的值选择执行不同的语句块。C语言提供if语句和switch语句来实现选择结构。
循环结构:在指定条件下重复执行某些操作。C语言提供while语句、do-while语句和for语句来实现循环结构。
六、函数
函数定义:函数是完成特定功能的代码块。C语言中的函数包括标准库函数和自定义函数。自定义函数需要按照一定的格式进行定义,包括函数返回类型、函数名和参数列表。
函数调用:通过函数名和参数列表来调用函数,执行函数体内的代码。函数调用可以实现代码的重用和模块化编程。
函数参数传递:C语言采用值传递的方式传递函数参数。调用函数时,实参的值会复制给形参,函数体内对形参的修改不会影响实参的值。
七、指针
指针概念:指针是C语言中的一个重要概念,它存储了变量的内存地址。通过指针,可以直接访问和修改该地址上的数据。
指针运算:可以对指针进行算术运算(如加、减)和关系运算(如比较)。这些运算基于指针所指向的数据类型的大小进行。
指针与数组:数组名在大多数情况下被视为指向数组首元素的指针。因此,可以使用指针来遍历和操作数组中的元素。
指针与函数:可以将指针作为函数的参数和返回值,以实现动态内存分配、数组传递等功能。
八、输入输出
标准输入输出函数:C语言提供了标准输入输出函数,如printf()用于向标准输出设备(通常是屏幕)输出格式化的数据,scanf()用于从标准输入设备(通常是键盘)读取格式化的数据。
文件输入输出:C语言还支持文件输入输出操作,可以使用fopen()、fclose()、fread()、fwrite()等函数进行文件的打开、关闭、读取和写入操作。
学完基础知识想继续提升就需要练习:
这里的练习有多种方法,我个人是学完之后就可以做单片机开发有关的项目了,通过项目中练习,但是这种方法门槛高,比较适合在校同学(而且是大一大二这种)。
对于求职就业更好的手段则是刷题,刷题可以先看面试题,这种题更多的是对于C语言基础逻辑的考察,更适合入门刷题。
对于LeetCode这种算法题,则需要补充数据结构和常规算法的知识,不然会无法切入。这个我在之前的文章也说过,总得来说,编程学习是有所谓的嵌套知识的,你感觉难很大的原因都是你不知道什么知识嵌套进来了,看不懂搞定也是自然。
必须掌握的编程基础“四大件”详解
所以对于这种情况,我才有了一对一咨询,帮忙同学快速入门的想法和服务,也是欢迎大家咨询。
然后就是Linux上C语言编程的学习:
这步其实是可以直接开始的,但是由于很多C语言都是入门同学,上来直接搞Linux,很有可能被环境搞死,所以这个暂时往后放了。对于Linux下的学习也是分几个步骤。
1.环境的使用
你需要先安装环境,这里涉及到虚拟机,镜像系统的安装,还有编程环境的搭建。然后就是上边C语言基础部分的实践都可以在Linux下践行。
2.编译调试工具的学习
对于gcc,很多在Windows下编程的同学接触是比较少,所以转到Linux后这是首先需要了解学习的部分。
另外还有Makefile,这也是需要了解学习的部分,之前在Windows下都是集成好的。
至于调试工具,最常用的事GDB,这是一个很强大的工具,很多所谓的Linux高手都是因为玩的一手好调试,毕竟对于工作来说,解bug的时间比写代码都多,会调试是必须的。
3.最后就是Linux应用编程学习了:
到这里其实才是接近工作的真实场景,如果你之后想做的是Linux应用开发工程师,就需要学习这部分知识。
进程管理:理解Linux中的进程概念,学习如何创建和管理进程。
文件操作:学习如何在Linux中使用系统调用进行文件读写和其他文件操作。
网络编程:掌握套接字编程,了解如何建立和管理网络连接,实现数据传输。
多线程编程:学习如何在Linux中创建和管理线程,理解并发和同步机制。
进程间通信(IPC):了解如管道、消息队列、共享内存和信号等进程间通信机制。
动态链接库:了解Linux支持动态链接库(共享库)的概念,以及如何在运行时动态加载和卸载共享库。
系统调用:理解系统调用是用户空间程序和内核之间进行通信的方式,掌握常用的系统调用函数,如open、read、write、close等。
操作系统API:学习如何使用Linux操作系统提供的API来实现应用需要完成的任务。
调试工具:掌握调试工具的使用方法,如GDB等,以便更好地解决程序中的问题。
性能优化:了解如何进行性能优化,包括代码优化、内存管理优化等,以提高应用的运行效率。
4.最后,就是项目的练习
发现没有,如果你连C语言还没搞定,就想直接做项目,难度是很大的,因为你缺少很多必备的知识和学习方法,这不是正确的学习方法。
未完待续,持续更新!以防后边找不到可以点赞收藏下!