阶段性总结:
目前已经学习嵌入式两个月,学习了大量相关课程知识,就目前对前期知识进行第二次总结。
课程安排:
一、Linux入门以及vim的简单操作命令
二、C语言基础
三、Linux及Shell脚本基础
四、C语言高级
五、数据结构与算法
六、Linux应用开发
七、网络编程
了解了数据结构的概念,顺序表、链表、栈、队列的一些简单的实现以及一些基础的算法实现(冒泡,查找,折中排序)。
Linix应用开发、学习了文件IO,以及标准IO(主要差别在于缓存区)
文件IO编程
1、文件/文件描述
2、文件操作:开、闭、读、写、定位等
3、文件指针、文件流
4、缓冲
5、流操作:开、闭、读、写、定位等
6、标准流IO流
7、非阻塞IO
多任务编程
1.进程
1.进程的概念
2.进程的控制
3.守护进程
4.进程间通信
5.
2.线程
1.进程的概念和基础
2.线程控制与编程
select机制中一个重要的函数是 select(),函数有4个入参,返回一个整数,select()原型和参数详情如下:
/**
* 参数说明
* 监听的文件描述符数量__nfds、
* 被监听描述符的三个集合*__readfds,*__writefds和*__exceptfds
* 监听时阻塞等待的超时时长*__timeout
* 返回值:返回一个socket对应的文件描述符
*/
int select(int __nfds, fd_set * __readfds, fd_set * __writefds, fd_set * __exceptfds, struct timeval * __timeout)
select 可以监听多少个socket?
答案:1024
select可以监听socket 的哪些事件?
答案:select() 函数有三个fd_set集合,表示监听的三类事件,分别是读数据事件(__readfds集合)、写数据事件(__writefds集合)和异常事件(__exceptfds集合),当集合为NULL时,代表不需要处理对应的事件。
select 如何感知已就绪的fd?
答案:需要遍历fd集合,才能找到就绪的描述符。
select 机制怎么实现网络通信?
代码实现
int sock_fd,conn_fd; //监听socket和已连接socket的变量
sock_fd = socket() //创建socket
bind(sock_fd) //绑定socket
listen(sock_fd) //在socket上进行监听,将socket转为监听socket
fd_set rset; //被监听的描述符集合,关注描述符上的读事件
int max_fd = sock_fd
//初始化rset数组,使用FD_ZERO宏设置每个元素为0
FD_ZERO(&rset);
//使用FD_SET宏设置rset数组中位置为sock_fd的文件描述符为1,表示需要监听该文件描述符
FD_SET(sock_fd,&rset);
//设置超时时间
struct timeval timeout;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
while(1) {
//调用select函数,检测rset数组保存的文件描述符是否已有读事件就绪,返回就绪的文件描述符个数
n = select(max_fd+1, &rset, NULL, NULL, &timeout);
//调用FD_ISSET宏,在rset数组中检测sock_fd对应的文件描述符是否就绪
if (FD_ISSET(sock_fd, &rset)) {
//如果sock_fd已经就绪,表明已有客户端连接;调用accept函数建立连接
conn_fd = accept();
//设置rset数组中位置为conn_fd的文件描述符为1,表示需要监听该文件描述符
FD_SET(conn_fd, &rset);
}
//依次检查已连接套接字的文件描述符
for (i = 0; i < maxfd; i++) {
//调用FD_ISSET宏,在rset数组中检测文件描述符是否就绪
if (FD_ISSET(i, &rset)) {
//有数据可读,进行读数据处理
}
}
}
select实现网络通信流程如下图:
select 机制实现网络通信 演示图
select 函数存在的不足
首先,select()函数对单个进程能监听的文件描述符数量是有限制的,它能监听的文件描述符个数由 __FD_SETSIZE 决定,默认值是 1024。
其次,当 select 函数返回后,需要遍历描述符集合,才能找到就绪的描述符。这个遍历过程会产生一定开销,从而降低程序的性能。
- C语言基础
该部分,主要包括几个核心知识点:三大语法结构、常用的数据类型、函数、结构体、指针、文件操作等。
- 硬件基础知识
该部分,核心知识点在于:电路基础知识、数电模电基础知识、常用的电子元器件等。
- 数据结构
核心知识点:数组、队列、链表、堆栈、树、图、散列表等。
- 操作系统
核心知识点:进程管理、内存管理、文件管理、输入输出管理等。
- 计算机原理
核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统等。
- Linux基础篇
该部分主要学习:Linux常用命令、VIM学习、Linux的Shell编程、Gcc编译、Makefile等。
- 驱动篇
该部分主要学习:内核模块编译原理、字符设备驱动框架、平台设备驱动、设备树、Pinctrl子系统、I2C子系统、中断子系统、块设备驱动框架、Bootloader等
- 内核篇
该部分主要学习:系统调用、存储管理、进程管理、内存管理、文件管理等。
- 应用篇
该部分主要学习:QT编程、TCP/IP协议、HTTP协议等。
月度总结:
希望在剩下的几个月里依旧保持热爱,坚持不懈,对自己未知的知识领域有好学之心,在自己热爱的领域成就热爱与工作共存。