TreeMind树图在线AI思维导图
当前位置:树图思维导图模板读书笔记学习方法嵌入式开发学习路线思维导图

嵌入式开发学习路线思维导图

  收藏
  分享
免费下载
免费使用文件
U940269097 浏览量:1212023-08-23 09:39:36
已被使用17次
查看详情嵌入式开发学习路线思维导图

嵌入式开发学习路线

树图思维导图提供 嵌入式开发学习路线 在线思维导图免费制作,点击“编辑”按钮,可对 嵌入式开发学习路线  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:83eda917694f0fa3f6cfec3f05d0aa24

思维导图大纲

嵌入式开发学习路线思维导图模板大纲

1、C/C++语法(5-6周)

1 C语言

程序员的第一个程序

#include<iostream> using namespace std; int main() { cout << "hello world~" << endl; //输出 system("pause"); // 暂停 return 0; }

注释

功能

让其他人能看懂代码

符号

//

单行注释

c++ 标准注释

/* code */

多行注释

C语言特有

问题

注释结尾不确定

利用预处理实现多行注释

#if 0 #endif

主函数

应用程序入口,操作系统调用程序的接口

main

一个项目只能有一个main函数

单个文件只能出现一个

多个文件只能一个文件中有一个

常见的五种

int main() { return 0; }

c++标准主函数形式

int main(void) { return 0; }

C语言标准主函数形式

void 表示不接受任何参数

无void 表示参数类型和数量不确定

int main(int argc, char* argv[]) { return 0; }

c/c++标准主函数形式,使用命令行参数

main() { }

老标准支持的写法,现在的 C语言还支持这种写法

但是尽量不要这么写

c++不支持这种写法

void main() { }

不提倡

c++之父说,这种形式的主函数,在C语言和c++中,都没有被定义

书上说,这种主函数写法逻辑上符合,而且有很多系统支持,但是考虑到代码的移植性,建议用标准型式。标准形式所有系统都支持。

头文件

#include<iostream.h>

老版头文件,继承C语言的头文件习惯,vc6.0可用,vs正常情况下不可以用

#include<iostream> using namespace std;

标准头文件,vc,vs均可用

命名空间

功能:区分同名变量或者函数

创建

namespace name { code; };

名字不能重复

3种使用方法

打开 using namespace name;

name::变量名/函数

:: 作用域运算符

using name::成员;

指定开放某个特定成员

输入输出

c++:

cout(输出)

是个对象,不是关键字,也不是函数,

输出

常量

cout << "hello C3~" ;

cout << ' ' ;

cout << 12.12;

变量

char c = 'a'; int a = 1; double b = 2.1; char *p = "hello C3~"; cout << c << ' ' << a << ' ' << b << ' ' << p;

可以输出一个,也可以连续输出,怎么样好看怎样写

这个比printf智能(需要指定类型输出%c,%d,%s...),cout可以自动识别变量类型

输出控制

控制符

endl

屏幕光标移动到下一行开头

重起一行,立即刷新缓冲区,将缓冲区中的内容立即输出到目标设备。

换行符

\n

重起一行

异同

重起一行显示,屏幕光标移动到下一行开头

endl,多了一个刷新缓冲区的操作,这个操作,会使缓冲的字符立刻显示到屏幕上。 \n,则不保证这一点,也就是说,在一些系统上,\n的显示会慢半拍。常用的这些系统,都不会这样,也就是说,显示这个功能,基本没有区别。

endl的效率,是慢的。多了操作

cin

是个对象,不是关键字,也不是函数

输入

变量

char c = 'a'; int a = 1; double b = 2.1; char *p = "hello C3~"; cin >> c >> a >> b ; cout << c << ' ' << a << ' ' << b << ' ' << p;

可以输入一个,也可以连续输入,怎么样好看怎样写

这个比scanf智能(需要指定类型输出%c,%d,%s...),cin可以自动识别变量类型

c: scanf printf

数据类型

基本数据类型

字符型

char

内存大小

表示范围范围

数值类型

整形

short

int

long

long long

浮点型

float

double

long double

构造类型

数组

[ ]的三种作用

声明变量的时候有[ ],表示声明的是数组变量

函数参数有[ ],此时表示指针

地址+[ ],表示下标运算

一维数组

字符数组/字符串

定义

以'\0'结尾的字符数组

输出输入

c++:cout << name; cin >> name;

C: printf("%s",name); scanf("%s",name);

字符串的声明方式(四种形式)

操作

库函数

strcmp(),strlen(),strcpy,strcat()...等等

其他类型的数组

注意区分初始化和赋值的区别

遍历

注意越界问题

地址

取地址运算符:&

a == &a[0]

首元素的首地址

&a[0], &a[1].....

单个元素地址

&a

数组的地址

二维数组

声明和初始化

地址

&a[1], &a[2], &a[0] == a

一维数组元素地址

&a[0][1], &a[1][0] == a[1]....&a[0][0] == a[0] ;

取元素地址

&a

二维数组的地址

结构体

struct

结构体类型声明方法

有名字,无名字

结构体变量的声明方法

初始化

成员赋值

成员调用方法

取成员运算符

.

->

结构体大小

内存对齐

链表

单向链表

双向链表

c++独有

声明变量可以不用struct关键字

理解声明变量,不是定义结构体,可以对比初始化变量

可以放函数成员

C语言的不可以放函数成员,但是可以放函数地址、

是一个特殊的类

联合/共同体

union

特点

所有成员共享内存

大小

最大的成员的大小

一般初始化最大的成员

延伸

大小端模式

大小端模式的测试方法

枚举

enum

声明以及使用

使用有意义的字符串

大小

4字节

实为int类型的数的集合

指针

内存申请与释放

C++

new

申请单个空间

int *p = new int; * p = 1;初始化一个值

Node *p = new Node;

其他类型同理

申请数组空间

int *p = new int[10];

memset(起始地址,设置的值,字节数),设置内存初始值

堆区的空间不像是栈区的那种,可以在声明的时候初始化。

其他类型同理

失败返回一个NULL,同C语言的malloc一样

delete

delete p; <==> new type;

对于标准来说,不匹配释放,结果是不确定的。

delete [ ] p;<==> new type [count];

一定要加上,

delete NULL 是安全的, free(NULL)会崩溃的

C: malloc() free()

malloc

free

区别

new delete 可以触发构造和析构

同时释放一块空间大于1次,是不行的

指针声明和空间分配方式不同,使用完全相同,所以说,在c++里,除了对象空间申请之外,用malloc 和 free是完全可以的,

指针类型

基本数据类型的指针

数组指针 与 指针数组

一维数组

二维数组

二级指针

函数指针

结构体指针

指针的大小

地址+1 是加了一个类型的大小

64bit编译器

8字节

32bit编译器

4字节

*的三种作用(c/c++)

声明的时候有*,表示指针变量

*+地址,表示地址操作符,取内容

数字*数字,表示乘法

引用变量

概念

引用是已定义的变量的别名(另一个名称),两者用法完全一样了

同类理解

typedef 是给类型起别名

声明与定义

基本数据类型变量的引用

int b = 12; int &c = b; int &d = b; int &e = d;

定义的时候就要初始化

不能指向其他的了

看地址

其他类型同理

常量的引用

const int &n = 12; const char &c = 'a'; const float &f = 123.123f;

复合数据类型的引用

数组的引用

int a[2]; int (&b)[2] = a; int a[2][3]; int (&c)[2][3] = a;

方式同数组指针一样

结构体的引用

类型 & 名字 = 结构体实例;

指针的引用

int* p = NULL; int* (&d) = p;

引用与函数

做函数参数

最主要的功能

修改参数的值

void Change(int& a) { a = 12; }

void Change(int a) { a = 12; }

void Change(int* a) { *a = 12; }

交换两个数的值

void ExChange(int& a, int& b) { int ntemp = a; a = b; b = nTemp; }

引用与返回值

不要引用局部变量就行

注意:操作非法内存的结果是未知的

引用与指针的区别

1、引用声明就要初始化,指针不用 int *p = NULL;

2、引用不能指向其他变量了,指针则可以任意指向。p = &a; p = &d;

3、引用不占存储空间,指针占空间

4、引用效率更高,指针式间接操作

5、引用更安全,指针可以偏移

6、指针更灵活,直接操作地址,指针更通用c语言和c++都行

&的三种作用

声明变量的时候有&,表示引用

变量前边+&,表示取地址

数&数,表示位与运算

运算符

优先级

结合性

运算符优先级表

这个表格不用记,写代码的时候直接加括号

流程结构

顺序

由上向下一步一步执行

循环

可控循环的三要素

循环控制变量有初始值

循环执行条件

真 == 1;

假 == 0;

初始值的变化

三种结构

入口条件循环

for(初始值;条件;变化)

for循环结构执行次序

while(条件)

退出条件循环

do{} while()

至少执行一次,循环体内部语句

continue

结束本次循环,继续下一次循环

break

跳出所在循环

c++增强的for循环

变量定义的位置

vc和vs结构内定义循环控制变量的作用域区别

分支跳转/选择

if (条件){} else if(条件){} else{}

switch(ID) { case ID: break;}

goto

可以根据逻辑,写成循环结构或者跳转结构

建议不用

函数

声明,定义

函数类型

无参数,无返回值

C:标准C语言,函数没参数需要写个void

c++:不用写void

无参数,有返回值

return ;

返回局部变量

有参数,有/无返回值

传值与传址

参数缺省值/默认值

形式

int fun(int a = 0, char c = 'b', float f = 12.12 );

全部指定

int fun(int a , char c = 'b', float f = 12.12 );

部分指定

一定是从右向左,逐个指定

int fun(int a = 12, char c , float f = 12.12 );

随意指定是会报错的

使用

有默认值得参数,传递实参会覆盖默认值,不传递实参会使用默认值,极大的增加了函数调用的灵活性

注意

使用函数原型

函数声明时候写默认

函数定义处不要写

不使用函数原型

直接写就行了

函数指针

函数重载

定义

同一作用域内

相对的一个位置,大家理解即可

函数名字相同

参数列表不同

参数类型不同

这两个条件是 或 的关系

参数个数不同

形式

void fun(int a); void fun(int a, int b); void fun(char c); void fun(float f, double d);

调用

系统会根据参数的形式,自动找到要调用的函数

例子

int main() { fun(1); fun('a'); fun(2,3); fun(12.13f, 123.123); }

何时使用,或者有什么好处

函数调用更灵活了

注意

默认参数和重载结合使用,可能会造成调用不明确

例子

void fun1(int a, int b, int c = 0); void fun1(int a, int b); int main() { fun(1,2); //传递两个参数,编译正常,运行时候就会报错 }

返回值不作为函数重载的条件

int fun(); void fun(); //这种声明方式报 重定义 错误

参数是浮点型float,double的护卫重载的函数,一定要注意参数传递

递归函数

展开再理解

文件操作

文件操作流程

打开文件

fopen

文件的打开方式

文本模式

二进制模式

操作文件

fread(),fwrite(),fgets(),fputs()

读取文件

int fgetc(FIlE * stream)

char * fgets(char * str, int num, FILE * stream)

size_t fread(void* ptr, size_t size, size_t count, FILE* stream): 从文件中读取数据。

写入文件

int fputc(int ch, FILE* stream)

int fputs(const char* str, FILE* stream)

size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream): 写入数据到文件.

关闭文件

fclose()

文件写入磁盘的钥匙

内存管理

位运算

进制转换

二进制与16进制,十进制与16进制, 十进制与2进制

位运算符

&,|,~,^

区别于逻辑运算符

内存分区

变量的作用域

堆区,栈区,全局区,静态/全局常量区,代码区

栈区

堆区

全局区

静态/全局常量区

代码区

0 未成功与成功之后的结果

1 内存分配未成功,你却使用

2 内存虽然分配成功,但是没有初始化你就引用他

3 内存分配成功,并且初始化成功,但是操作的时候超过内存边界

4 内存泄露

申请了,还不free,就好像泄露了

5 内存释放了,你却继续使用

6 内存碎片

7 内存

类型转换

隐是类型转换

显示类型转换

强制类型转换

2 C++(封装、继承、多态)

类和对象

类和面向对象的关系

面向对象是一种编程思想

类是一个语法

意义:面向对象的编程思想,要以这个语法(类)来实现。 大家暂时不要强行理解面向对象这种思想,因为这个理解是要基于很多项目经验的,不是一朝一夕就能领悟的。 学好类,就行了

定义:具有相同属性和行为的对象的集合(人类,就是一个人的集合,胖胖秦就是这个类的一个具体个体,或者叫对象)

类实例

class CPeople { public: int age; void Test() { age = 12; cout << age << endl; } }; int main() { CPeople op; op.Test(); CPeople* op1 = new CPeople; op1->Test(); delete op1; return 0; }

类声明

class 类名 { };

跟结构体基本是一样的,只不过关键字是class

结构体是类的一个特定情况

声明对象

CPeople op;

CPeople* op1 = new CPeople;

成员调用

栈区普通对象

对象.成员

op.Test();

堆区指针对象

对象->成员

op1->Test();

delete op1;

类的所有成员(个别特殊static),必须通过对象访问

访问修饰符

关键字

private

类内可见

类内不写访问修饰符,默认是private

protected

类内以及子类可见

public

类外可见

c++的结构体,默认是public

友元

关键字

friend

友元函数

friend void fun();

需要声明

friend int main();

不需要声明

友元类

使用protected成员有两种方法

继承

友元

使用private成员

友元

特点

不受访问修饰符影响

可以有多个友元

缺点:破坏了类的封装性,不是迫不得已,不要用

接口,

作用范围

书写位置开始,一直到下个修饰符,或者类结尾的花括号 }

拓展功能

作为类内成员分类的工具,这个,修饰符,写多少都行

安全性

函数成员

构造函数

产生

普通数据成员不能够在类内直接赋值,因为只有对象创建的时候才分配空间 那么,我们的数据如何赋予初始值呢。我们可以定义一个成员函数,对成员统一赋值

void init(int b) { a = a; }

形式

类名(参数列表){}

无返回值

作用

对数据成员赋初始值

调用

对象定义的时候

栈区对象

堆区对象

声明指针并不会调用构造函数,new空间的时候调用

类型

默认构造函数

什么都不做,即空的

只要宏观声明的构造函数,默认的就没有了

无参数

有参数构造函数

通过对象传递

可以指定默认值

多个构造函数构成重载

成员函数定义

类内定义

类外

类内声明

意义是用于多文件

类外定义

初始化列表

初始化与赋值的区别

意义上

初始化是一个变量或者对象产生之时就赋予一个初始值,伴随性质

赋值是一个变量或者对象产生之后的任意时刻可以赋予一个值,随意性质

宏观代码上

基本数据类型

作用相同

数组,结构体

初始化,和赋值的形式不同

作用相同

引用,const

只能初始化

不能赋值

函数定义和声明

形式

构造函数之后加个冒号:a(1),b(2)

不是花括号之后

作用

跟构造函数的区别

基本数据类型,用哪个都行

引用,const必须用初始化列表

对数据成员进行初始化

可通过数值对数据成员初始化

可通过构造函数参数对数据成员进行初始化

可通过成员之间相互初始化

成员初始化的顺序

初始化的方式很多,大家根据自己的需要用

执行顺序

在构造函数之前

引用和const

引用

引用成员

引用参数

引用类外

const

参数

常量

注意点

多个构造函数,初始化列表绑定所在的构造函数

数组和结构体如何使用初始化列表

数组

CStu() : arr()

vc无效果

vs有效果

通常设置设置数组元素全为0的方法

memset

for循环

结构体

可直接赋值

用初始化列表反而增加了复杂性

析构函数

作用

清理工作

比如我们用new给成员申请了空间,析构函数内可以释放掉

调用时间决定了他的主要作用

形式

~类名()

只有一个,没有参数

没有重载

默认析构函数

什么都不做,类比默认构造函数

调用

对象声明周期结束时,自动调用

局部对象

临时对象

作用域

所在语句

指针对象

delete

默认

malloc 和 new的区别

new会触发构造函数,malloc不会

free 和delete区别

delete会触发析构函数,free不会

常函数

形式

void fun() const {;}

构造和析构 不可以是常函数

特点

可以使用数据成员,不能修改数据成员

对函数的功能有更明确的限定

常函数的this指针是 const CStu*

常对象只能调用常函数,不能调用普通函数

static

形式

static int a;

static void fun(){}

使用方式

对象调用

类名作用域

静态成员

类外初始化

无static

静态常量整型数据成员可以直接进行初始化

static const float a = 13.12f;

不行

static const int a = 13.12f;

整形

不使用循环,来个自加1

静态成员函数

无this

不能调用成员成员,可以调用静态成员

可以作为一种指挥该类所有对象的作用

他是属于类的属性,不是对象,即所有对象共有一个

可以通过类名调用

可以通过对象调用

拷贝构造/复制构造:copy

形式

CStu(const CStu&)

本质即构造函数

参数是本类的常引用

何时调用

1、新建一个对象,并将其初始化为同类现有对象

CStu a;

声明一个对象

1、CStu a1(a);

2、CStu a2 = a;

3、CStu a3 = CStu(a);

4、CStu* a4 = new CStu(a);

赋值不会的

CStu s; CStu p; s = p;

2、当程序生成对象副本时

函数参数传递对象的值

函数返回对象

有何功能

默认的复制构造函数,逐个复制非静态成员(成员的复制成为浅复制)值,复制的是成员的值

系统默认的这个又叫浅拷贝

实践一下,模仿一下默认的

模仿的这个也是浅拷贝

同一个类的多个对象,内存排布是一样的,地址不同

演示问题

指针成员

构造分配空间

析构释放空间

深拷贝

指针成员不能直接赋值,要用内存拷贝,memcpy,strcpyd等

解决拷贝构造所引发的,指针成员二次释放崩溃的问题的方式

深拷贝

传地址

传引用

内联函数

常规函数调用过程

调用时,根据函数地址

跳到函数代码空间,执行指令

执行完,再跳转到调用的位置

综合:来回跳跃+记录跳跃的位置==一定的系统开销(资源+时间)

内联函数

inline

函数声明要加inline

函数定义要加inline

注意:只写声明位置不管事儿

作用

用相应的代码替换调用

比常规函数稍快

代价是占用更多内存

常规函数和内联函数如何选择

特点

时间和空间

1看实际需要

空间换时间

时间换空间

2看性价比

实际

函数代码少,流程直接,调用频繁

循环里的

编译器智能

程序猿请求将函数作为内联函数时,编译器不一定会答应,

函数体过大

递归不能是内联函数

效果:写了等于没写,按常规函数进行编译

这个特性是编译器特性,即不是所有编译器都实现了这一功能

内联函数比宏功能更强

测试一个参数宏

测试参数内联函数

类与内联函数

类内定义都是内联函数

显示定义

隐式定义

定义在外

有inline 是内联

没有inline不是内联

内联函数与多文件

内联函数可以有多个定义,多个定义必须完全一致

所以通常,内联函数写在头文件里

数据成员

相对特殊

引用成员

初始化列表初始化

const成员

初始化列表初始化

静态成员

类外初始化

无this指针

静态常量成员

可在类内直接初始化

也可在类外初始化

指针成员

注意拷贝构造产生的问题

常规

其他类型

this

作用

区分同名的

是指向当前对象的指针

所以我们可以通过指针,访问成员

对象创建的时候才有的

类型

对应对象的类的指针类型

this指针不是成员

this作用域是在类内部,系统默认传递给函数(非静态函数)的隐含参数

继承

继承小实例

class CPeople { public: int hands; int head; void speak(){ } void study(){ } }; class CXiaoming : public CPeople { public: int age; char *name; void speakChinese(){ } void work() { } } class CXiaohua : public CPeople { public: int age; char *name; void alllanguage(){ } } int main() { CXiaoming xiaming; xiaoming.hands;..... CXiaohua xiaohua; xiaohua.hands;...... return 0; }

继承的作用

代码的重用性

继承的格式

class CXiaoming : public CPeople

基类或者叫父类

派生类或者叫子类

可以继承很多层

原理都一样

继承对象的声明以及成员调用调用

普通对象

指针对象

基类也可以自己创建对象

继承的限定词

private

父类中public,protected,在子类中为private,降低访问权限

protected

父类的public成员,子类中为protected,即为降低权限

public

父类如何子类如何

成员的继承

函数成员

构造函数

以无参构造演示,子类和父类构造函数的执行顺序

先调用父类的,父类还有父类就继续向上

父类有参数的构造,需要通过子类初始化列表来传递参数

只关注自己父亲的

多个构造函数选择传递

默认是无参的

参数列表写谁,调用谁

析构函数

调用顺序

由辈分小的到辈分大的

覆盖

父类和子类中出现同名的成员时,C++采用的一种处理方式,就叫覆盖

数据成员同名

类内 ,子类覆盖父类,可以用类名作用域区分

类外: 类名作用域区分

父类子类函数名字相同

子类覆盖父类

使用时可以通过类名作用域区分

父类子类的函数没有重载关系

友元不能被继承

继承

静态只有一份儿

虚继承

多继承

多个基类

子类的子类

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的

父类叫做虚基类

解决多继承中访问不明确的问题

不建议用,结构复杂,内存开销比较大

多态与虚函数

多态与虚函数

多态是一种泛型编程思想

即同样的代码,实现不同的功能

父类的指针,调用子类的函数

虚函数是实现这个思想的语法基础

父类指针指向子类空间

CFather* p = new CSon;

但是不能调用子类的函数

形式

virtual void fun() ;

子类的函数 要和这个函数一样

多个子类,换子类就调用子类的

多态针对于指针对象

多态

即父类的一个指针,可以有多种执行状态,即多态

逻辑

问问题

快速检索到面试官想问什么?

多态

子类重写父类的虚函数

内涵和外延

多态是什么?为什么要用多态?怎么样使用多态

内涵

虚函数表 虚函数指针 内存分布 多态的逆向表现 多态汇编

外延

特点

重写

父类和子类相同,父类是虚函数。叫做重写

虚 针对于 函数成员

子类重写的函数,默认是虚函数,可以显示加virtual,也可以不加

名字参数相同

返回值类型相同

重写

返回值类型不同(只能是当前所在类)

协变

不是内联函数

构造函数不能是虚函数

虚表

虚函数覆盖原理

1、根据父类的指针,找到父类的函数

2、看父类的这个show是不是虚函数

进入到虚表,执行表中这个(自己/重写)

不是

执行自己

CFather* p = new CSon; p->show();

取虚表地址,以及内容

对象空间的最开始四字节内容,就是虚表(虚函数列表)的地址,叫虚指针

(int*)*(int*)p+0 (int*)*(int*)p+1 (int*)*(int*)p+2

取到的是函数地址,想要调用,要转换成对应类型的函数指针

void (*p)(int a) = (void (*)(int))(*((int*)*(int*)p+1))

虚析构

delete哪个类型的指针,就调用谁的析构函数

多态中,如果释放父类指针,只会调用父类的析构函数,所以加了虚析构,就会子类父类都调用了

纯虚函数

纯虚函数

形式

virtual void fun() = 0;

特点

可以没有函数实现

继承这个基类的子类必须实现它,才能定义对象

抽象类

有纯虚函数的就是抽象类

接口类

全是纯虚函数的,叫接口类

可以有构造函数,和成员什么的

3 现代C++

不重要

2、Linux操作系统原理和实战(4-6周)

1 Linux系统命令

常用命令

ls

列出文件信息

ls [-l -h -a]

-l:以列表方式查看

-h :显示文件大小

-a:显示隐藏文件

pwd

展示当前工作目录

cd

切换工作目录

cd [目标目录]

mkdir

创建文件夹

mkdir [-p]

-p,可选,表示创建前置路径

就是可以创造多层级目录

注意

只能在HOME目录中创建文件夹,创建的文件只要包含在HOME目录就可

touch

创建文件

touch 参数

参数是被创建的文件路径

cat

查看文件内容

cat 参数

参数是文件的路径

more

查看文件内容(支持查看文件翻页)

按空格键表示翻页

cp

复制文件、文件夹(-r)

cp [-r] 参数1 参数2

参数1 :当前目录的被复制的文件

参数2 :当前目录的复制的文件

-r 复制文件夹使用

mv

移动文件、文件夹

mv 参数1 参数2

参数1:被移动的

参数2: 要移动去的地方,参数2如果不存在,则会进行改名

rm

删除文件、文件夹

rm [-r -f] 参数...参数

参数:支持多个

-r,删除文件夹使用,指的是删除的类型包含文件夹

-f,强制删除,不会给出确认提示,一般root用户会用到

支持通配符

which

查看命令的程序本体文件路径

对于命令的查找

which 参数

参数:被查看的命令

find

搜索文件

find 路径 [ -name ]或[-size] 参数

注意

支持通配符

建议将参数用“”表达

grep

过滤关键字

grep [ -n] 关键字 文件路径

-n表示显示结果中匹配的行数

建议使用“”将关键字包围起来

可以使用管道符:|

管道符就是将前面的接过作为后面命令的输入

wc

统计

wc

-c:统计BYTES数量

-m,统计字符数量

-l,统计行数

-w,统计单词数量

参数路径可以使用管道符对的输入

echo

输出内容

输出的可以命令,也可以是字符串

不是命令

建议将参数用“”包围起来

是命令

建议‘’把命令包围起来

tail

查看文件尾部内容

tail [-f] 或[-num]参数

-f表示持续文件跟踪,

命令行的不断刷新

-num表示查看倒数num的文件

重定向符

符号左边的内容输出到文件右边中

>

表示覆盖输出

>>

表示追加输出

注意

home目录

每一个用户都有自己的专属工作目录,称为home目录

普通用户

/home/用户名

root用户

/root

相对目录与绝对目录

非/开头的称为相对路径

以/开头的称为绝对路径

特殊路径符

.

当前目录

..

上一级目录

~

用户的HOME目录

rm命令很危险,一定要注意,特别是切换到root用户的时候

实用的命令

ifconfig

作用

显示或设置网络设备

语法

ifconfig [-v] [-a] [-s] [interface]

ifconfig [-v] interface [aftype] options |address ...

参数

down 关闭指定的网络设备

up 启动指定的网络设备

IP地址 指定网络设备的IP地址

del<地址> 删除网络设备IPv6的IP地址

add<地址> 设置网络设备IPv6的IP地址

案例

显示网络设备信息 ifconfig

关闭/打开指定网卡

ifconfig eth0 down

ifconfig eth0 up

配置 IPV4 地址

ifconfig eth0 192.168.1.56 # 为网卡eth0配置IP地址:192.168.120.56

ifconfig eth0 192.168.1.56 netmask 255.255.255.0 # 加上子网掩码

ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255 # 再加上广播包

为网卡配置和删除 IPv6 地址

ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡设置IPv6地址

ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡删除IPv6地址

修改 MAC 地址

ifconfig eth0 down//打开网卡

ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE//更改MAC地址

ifconfig eth0 up//关闭网卡

启用和关闭 ARP 协议

ifconfig eth0 arp # 开启

ifconfig eth0 -arp # 关闭

设置最大传输单元

ifconfig eth0 mtu 1500 #设置能通过的最大数据包大小为 1500 bytes

ping

测试网络主机间网络连通性

语法

ping [参数] 目标主机

参数

-c 指定发送报文的次数

-i 指定收发信息的间隔时间

-s 设置数据包的大小

-t 设置存活数值TTL的大小

Linux系统的TTL值为64或255

Windows NT/2000/XP系统的TTL值为128

Windows 98系统的TTL值为32

UNIX主机的TTL值为255

案例

测试与 www.baidu.com 网站的连通性 ping www.baidu.com

连续 ping 4次 ping -c 4 www.baidu.com

连续 ping 4次,间隔 3 秒 ping -c 4 -i 3 www.baidu.com

测试局域网连通性 ping 192.168.107.128

设置数据包为 1024 字节,TTL为255

telnet

作用 远程登入服务器

语法 telnet [参数] [主机] [端口]

对比

ssh'命令会更加安全一些

案例

登录远程主机 telnet 192.168.107.133

指定端口 telnet 192.168.107.133 6379

su与sudo

su

功能 切换用户

切换到root用户

su - root或 su

su 不更换工作目录,不推荐

su - root更换工作目录,更加彻底切换

切换到目标用户‘

如 su - apple

sudo

功能 普通用户提升到root权限执行命令

文件/etc/sudoers定义哪些用户有权限执行sudo

权限验证

sudo cat /etc/shadow

修改文件

sudo visudo

把目标用户给予特权

如,sudo usermod -aG wheel apple

tcpdump

作用

监听网络流量

语法

参数

案例

tcpdump 监视第一个网络接口上所有流过的数据包

tcpdump -i ens33 监视指定网络接口的数据包

tcpdump -c 20 显示指定数量包

tcpdump -c 10 -q 精简模式显示 10个包

tcpdump host www.baidu.com 监视指定主机的数据包(主机名)

tcpdump host 192.168.107.133 监听指定主机的数据包(IP地址)

tcpdump -i any port 22 -A 监听指定端口号的数据包,并以文本形式展示

ps

作用 显示进程状态

语法 ps [options]

参数

-A 显示所有进程

-a 显示所有终端机下执行的程序

-x 通常与 a 这个参数一起使用,可列出较完整信息

输出后台进程

-e列出程序时,显示每个程序所使用的环境变量

-f 用ASCII字符显示树状结构,表达程序间的相互关系

-u <用户识别码> 列出属于该用户的程序的状况,也可使用用户名称来指定

输出user信息

信息说明

UID,进程所属用户

PID,进程号

%CPU,该进程所占用CPU百分比

%MEM,该进程所占用内存百分比

VSZ,进程所占用的虚拟内存大小

RSS,进程所占用的实际内存大小

TTY,该进程运行在哪个终端上面,若与终端无关,则显示

START,进程启动时间

STAT,进程状态

常用

R Runnable运行

S Sleepping 中断,在后台等待某个条件的形成或接受到信号

Z Zombie僵死

可能父进程已经结束,子进程还在

不常用

D uninterruptible sleep 不可中断睡眠

T stopped by job control signal 停止

TIME,进程实际占用CPU的时间

COMMAND,该进程对应的执行程序

案例

显示当前系统所有进程状态

ps -aux # 列出目前所有的正在内存当中的程序

ps -A # 显示所有进程信息

ps -ef # 显示所有进程信息,连同命令行

树形显示所有进程 ps -axf

查找特定进程信息 ps -aux | grep ssh

显示指定用户信息 ps -u liangxu

配合 less 命令使用 ps aux | less

结合管道操作符与sort命令,依据处理器使用量(第三列)情况降序排序 ps aux | sort -rnk 3

2 操作系统结构

用户态和内核态的基本概念、区别

GUI

图形化接口

命令接口

交互式命令接口

又称·:联机命令接口

批处理命令接口

又称:脱机命令接口

程序接口

操作系统的四大特性

并发

并发与并行的区别

共享

互斥共享:一个时间段内,摄像头只能分配到一个程序

同事共享:两个程序同时就发送文件操作,微观上也是交替的访问

虚拟

所有的程序的内存之和大于电脑的运行内存

虚拟机的空分复用技术与时分复用技术

异步

允许多道程序并发执行,但由于资源有限,进程也是走走停停的。

操作系统的运行机制

截图

操作系统体系结构

结构图

内核态与用户态

操作系统内核需要运行在内核态

操作系统的非内核对应功能运行在用户态

分类

大内核与微内核

分层结构

优点

最底层是硬件层,最高处的层是用户接口,每一层可调用更低一层

适合调试,自底向上分层的调试

缺点

效率低,不可以夸层调用

模块化

内核

主模块

可加载内核模块

优点

确定了模块间接口,可以多个模块同时开发

支持动态加载新的内核模块,不需要重新编译整个内核

任何一个模块都可以直接调用其他模块,不需要进行消息传递(变态)

缺点

接口的定义未必是合理的

模块之间存在依赖,不好调试

外核

3 Linux内存原理

分页内存管理

物理内存和虚拟内存

内存问题分析与性能优化

Linux内存管理

4 进程和线程

进程和线程的概念和区别

消息队列

进程间通信方式

信号

信号量

共享内存

套接字

管道

线程同步

互斥量

信号量

死锁以及产生的原因及解除与预防

锁的实现

生产者-消费者问题

5 文件系统和设备管理

文件的存储

文件目录

文件IO

IO控制方式

设备控制器

gcc编译器

4步骤截图

四大步骤

预处理

该阶段错误为:头文件没有写出来

编译

该阶段错误,报错会有行号提示,红色字体提醒

汇编

链接

该阶段错误,报错没有行号提示

连接器

参数

-I

指定程序中头文件的位置

gcc -I ~/test hello.c -o hello

-c

只做预处理,编译,汇编

得到二进制文件(看不懂的)

-g

编译时添加调试语句

gdb

功能 调试命令

进入调试

gdb [待调试的文件]

gdb b [num]

指定调试断点的行号

gdb r

调试运行

gdb n

调试下一行

-On

编译优化

n=0~3,n越大优化的越多

-Wall

展示所有警告

子主题 2

-E

生成预处理文件

-D

向程序中动态定义宏定义

动态库与静态库’

静态库

对于空间要求高,时间要求低的核心程序中

动态库/动态库

对于空间要求低,时间要求高的核心程序中

静态库的制作

写.c文件

将.c文件编译成.o文件

使用ar工具制作静态库

ar rcs lib[库名].a -o [.o文件 ]

编译静态库

gcc [源码] [lib库名.a] -o [可执行程序名称]

源码名与库名的位置不能互换

动态库的制作

将.c文件生成.o文件。(生成与为位置无关的代码 -fPIC)

gcc -c

使用gcc - shared制作动态库

gcc -shared -o lib库名.so add.o sub.o div1.o

注意:这里的动态库的库名,前面要有-o

编译可执行程序时,指定所使用的动态库。

gcc test.c - o a.out -l static -L 指定路径

注意:

库名不包括lib,是除了lib的部分

大写的命令后面是文件夹,不是具体文件

-l 与-L都要有,不能缺少

执行程序的时候出错

原因

链接器

工作链接阶段,工作时需要-l与-L

动态链接器

程序在运行时,会找动态库所在的目录位置

解决办法

通过环境变量,export LD_LIBRARY_PATH =动态路径

这是临时生效的方式,若要永久生效,需要写入终端配置文件

1.vim ~/.bashrc

2.写export LD_LIBRARY_PATH =动态路径 保存

建议使用绝对路径

3. . .bashrc 或者source ~/.bashrc 后重启终端,就可使修改配置文件生效

4../a.out 成功

地址回填与数据段合并

概念:字面理解

注意

隐式声明

函数定义与函数声明都不存在,编译器自发的会产生隐形声明

特征

返回值为int

传进去的参数的类型就是声明类型

函数名就是引用过的函数名

vim

工作模式

常用命令

编辑退出与保存命令

w

保存编辑的文本存储

q

离开vi文本编辑器

q!

不想存储,强制离开vi编辑器

wq

保存退出

常见vi编辑的命令

dd

删除当前行

前面一个人数字 就是删除行数

yy

复制

复制的内容可供选择

ZZ

强制退出命令模式

/

查找

n表示下一页面

*

现在当前页找到需要找的,然后用*查找,

n表示下一页面

u

撤销

p

粘贴

3、网络(4-6周)

1网络原理

1 网络模型分层

物数网传会表应

2 IP

ping的原理

ICMP

3 TCP

TCP三次握手和四次挥手

TCP头部格式

TCP重传

TCP滑动窗口/流量控制、拥塞控制

TCP半连接和全连接队列

TCP粘包

TCP内核参数

4 UDP

UDP的应用场景

UDP的特性

用UDP模拟TCP

5 HTTP和HTTPS

HTTP 特性

HTTP/1.1、HTTP/2、HTTP/3 演变

GET与POST

HTTP的优化

如何避免发送HTTP请求

如何减少 HTTP 响应的数据大小?

如何减少 HTTP 请求次数?

2 网络编程

1 socket编程

TCP

UDP

HTTP

2 select

3 poll

4 epoll

epoll的几个重要函数

epoll的底层实现原理

epoll的源码分析

边缘触发和条件触发

3 网络通信模型

1 IO类型

阻塞型 BIO

异步IO AIO

非阻塞型IO NIO

2 事件处理模型

Reactor

Proactor

4、基本数据结构与算法(4-100周)

1链表/数组

2栈/队列

3 树/图

4 十大排序

堆雪差炮击,统计快归西

5 查找算法

顺序表查找

有序表查找

线性索引查找

二叉排序树

平衡二叉树

B树和B+树

哈希表

6 分治/贪心

7 动态规划

8 力扣刷

300道

5 嵌入式硬件基础

1 万用表和示波器以及烙铁

2 能看懂原理图

不需要数电和模电的专业知识

上拉电阻 电容 电感的基本作用

3 会结构设计和画板更好

4 会PCB设计更好

6、相关协议(2-3周)

外设协议

I2C

SPI

UART

Can

USB

以太网

SDIO

物联网协议

MQTT

字符解析协议

json

xml

无线协议

wifi

zigbee

蓝牙

射频协议

7 嵌入式平台应用开发5大方向

嵌入式QT开发

arm体系应用开发

单片机应用开发

嵌入式 Linux 系 统移植及驱动开 发

智能物联网开发

8 调试和测试(2-4周)

1 GDB

2 日志

3 烧录

4 打板

9 工具(1-2周)

IDE

IAR或者VSCODE或者Source insight

代码比对工具

beyond compare

代码检测工具

CPPCheck

硬件

熟练使用万用表

熟练使用示波器

10 项目(6-8周)

最好是包含以上全部知识点的项目

推荐

FreeRTOS

RT-Thread

ESP8266

SIP音视频解决方案

STM32CubeF4

11 其他知识(2-4周)

设计文档

工程架构

cmake

Makefile

代码管理

git

svn

专业技术栈

英文水平要求

六级分数,尤其是阅读方面

LINUX内核

笔试的操作系统与项目介绍

熟悉脚本语言的基本用法

实时操作系统

硬件知识

单板调试与开发

竞赛

中国研究生电子设计竞赛(研电赛)

初赛、决赛时间:预计7月举办初赛,8月举办全国总决赛

中国研究生数学建模竞赛

2023年9月22日—9月26日

中国研究生创“芯”大赛

8月1日至5日

中国研究生人工智能创新大赛

5月8日-7月31日

中国研究生机器人创新大赛

7月20日-7月30日

中国研究生能源装备创新设计大赛中国研究生网络安全创新大赛

相关思维导图模板

泰德利产品中心组织架构——(14人)思维导图

树图思维导图提供 泰德利产品中心组织架构——(14人) 在线思维导图免费制作,点击“编辑”按钮,可对 泰德利产品中心组织架构——(14人)  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:a47213f8debbef1a76fcd45f983e900b

待办事项清单思维导图

树图思维导图提供 待办事项清单 在线思维导图免费制作,点击“编辑”按钮,可对 待办事项清单  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:93552b93316a4906b89ac3861f118edd