Xwave的小小技术栈的成长历程~
目录:
0、嵌入式知识储备
“不一定非要按着LINUX学,能用更小的成本实现实时性等功能才算强。”——某主管说
- C/C++
- 编程能力
- RTOS
- 内存管理
- TCP/IP协议栈
- http协议栈
- 接口(UART、I2C、SPI、CAN、USB)
- 中间件(ROS)
LINUX应用开发重点
- 进程、线程调度
- 并发
- 多线程
- 进程间通讯
零、CSDN写作技巧
1、字体颜色和样式
红色样式:红色字体1
绿色样式:绿色字体1
蓝色样式:蓝色字体1
一、C
1、参考实用C笔记
二、C++
1、C++基础
2、XwaveC++笔记
3、C++基础入门
4、C++核心编程
三、LINUX基础
Linux系统结构详解
1、XwaveLINUX应用开发
2、XwaveLINUX驱动开发
3、XwaveLINUX内核学习
四、底层原理
1、编译、链接、装载
结合《王道操作系统》和《程序员的自我修养》对编译、链接、装载的理解
1、编译:
编译包括:预编译、编译、汇编、链接
2、链接:
(是编译器工作的一部分)该步将工程文件中的各个目标文件和库函数进行连接,生成可执行文件。链接形成可执行文件及bin文件后可以反汇编,转成汇编代码检查程序。
3、装载:
现代主流操作系统都是用页映射方式装载ELF文件
当进程建立后:
- (创建虚拟地址空间)页映射函数将虚拟空间的各个页映射至相应的物理空间;
- (读取可执行文件头,建立虚拟空间和可执行文件的映射关系)因此当发生页错误时,操作系统可将内存分配一个物理页,然后将该“缺页”从磁盘中读到内存中。
- (CPU指令寄存器设置成可执行文件入口)启动程序运行。
2、C和C陷阱
3、C和C指针
4、操作系统
参考: B站《王道操作系统》以及幕布
《王道操作系统》学习笔记总目录+思维导图
1、基础概念
1、BIOS(Basic Input/Output System),基本输入输出系统。
2、操作系统是如何运行的:(操作系统也可以看做一个可执行程序)
BIOS(从ROM中)启动——>BIOS(根据启动选项)搜索可用系统映像,将系统映像加载到内存——>调用操作系统初始化函数。
比如启动的是Linux系统,那么调用start_kernel()函数,该函数对Linux内核进行初始化,之后操作系统就运行起来了
3、程序员应如何理解中断 (软件实现逻辑):
4、中断的硬件实现?
中断的出现是为了协调CPU和外设的速度问题?
CPU与外设之间的交互发展:
轮询——>中断
第 1 章 计算机系统概述
1.1 操作系统的基本概念
1.2 操作系统的发展和分类
1.3 操作系统的运行机制和体系结构
引入系统调度也是为保证内核安全的同时,将用户态的各个请求放到一个篮子里由系统调度?
第 2 章 进程管理
2.1 进程与线程
为了解决程序只能串行执行 引入**进程**概念 程序可调度可并行,便可以一边玩QQ 一边听音乐
为了解决进程内的功能只能顺序执行 引入**线程**概念 在QQ中可视频又发文字
**进程**:是系统资源分配和调度的独立单位
**线程**:基本的CPU执行单元程序执行流的最小单元
2.2 处理机的调度
2.3 进程的同步与互斥
2.4 死锁
第 3 章 内存管理
3.1 内存管理的概念
3.2 虚拟内存管理
第 4 章 文件管理
4.1 文件系统
4.2 磁盘组织与管理
第 5 章 I/O管理
5.1 I/O管理概述
块设备可寻址
字符设备不可寻址?
5.2 I/O核心子系统
LINUX0.1
实际使用的是时间片轮询的进程调度
拥有fork(创建进程)等功能的结构体
程序的逻辑地址向内存的物理地址的映射(加载)也在内核中做
程序逻辑地址的产生是lds(链接器)做的
5、计算机组成原理
参考: B站《王道计算机组成原理》以及:
《王道计算机组成原理》学习笔记总目录+思维导图——
BitHachi
1、基础概念
1.1硬件知识
- 嵌入式常用的EMMC和NAND flash的区别(手机常用EMMC)
- bsp 板级支持包;
- ROM、RAM、FLASH、DDR、EMMC
- 寄存器,存储器
- SSD 固态硬盘(Solid State Drives)
1.2计算机基础知识
1、机器字长(CUP位速):计算机一次整数运算所能处理的二进制位数;
2、CPU硬件进化:电子管-晶体管-集成电路
肖克利实验室股份有限公司-仙童半导体公司-Intel/AMD
3、摩尔定律:集成电路晶体管的数目和性能每隔18月翻一倍,实际上半导体存储也符合这一定律。
4、冯.诺依曼机:
“程序存储”:指令以代码的形式事先输入到计算机的主存储器中,
然后按其在存储器中的首地址执行程序的第一条指令,
以后就按该程序的规定顺序执行其他指令,直至程序执行结束。![在这里插入图片描述](https://img-blog.csdnimg.cn/7ace5a6c0e864b17a6e6c412452c31fd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWHdhdmV-,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
5、现代计算机:
6、高级语言(C/C++/JAVA)—编译—>汇编语言—汇编—>机器语言
如果高级语言中调用了库函数,需要在汇编步骤将库函数链接起来。
脚本 语言(javaScript/Python/shell)—解释程序(解释器)—>机器语言
7、现代计算机处理器结构按照指令系统方式划分,可分为复杂指令集计算机和精简指令集计算机
RISC:精简指令集;
CISC:复杂指令集;
RISC技术对比CISC最大的区别就是对CPI的精简
- CPI:执行一条指令所需要的时钟周期数 = 总时钟周期数/IC;IC:总指令数 CPU执行时间:运行一个程序所花费的时间 =
- CPU时钟周期数/主频 = (指令条数*CPI)/主频
- MIPS:每秒执行多少百万条指令 = 指令条数/(执行时间x106) =
主频/CPI
三态门
CPU
内存
总线
硬盘
1.奇偶校验
6、计算机网络&TCP/IP
- 计算机网络(王道考研—参考——BitHachi)
目录
第 1 章 计算机网络体系结构
第 2 章 物理层
第 3 章 数据链路层
第 4 章 网络层
第 5 章 传输层
第 6 章 应用层
------------------------------5-应用层--------------------------------------------
3. xml (extensiable markup language) 可扩展标记语言
4. HTML(HyperText Markup Language) 超文本标记语言
5. 统一资源定位符(URL)
6. 超文本传输协议(HTTP)
7. 文件传输协议( File Transfer Protocol, FTP)
8. 域名系统(Domain Name System, DNS)
-----------------------------4-传输层---------------------------------------------
- TCP/IP(Transmission Control Protocol/Internet Protocol)传输控制协议;
- UDP
7、数据结构与算法
7.1、面试问过的算法题
- 选择排序
- 堆排序
五、嵌入式LINUX开发
如果开发了一个嵌入式的APP应用软件来使用板子的硬件设备,
那么以下开发内容应该是这么运作的:
QT软件->应用开发软件->驱动开发软件
->为调用
0、通用CPU架构
1、LINUX内核
LINUX内核
基本内核知识
2、LINUX驱动开发
3、LINUX应用开发
4、QT开发
1、QT&C++
2、 mainwindow.cpp程序主函数开头:
*MainWindow::MainWindow(QWidget parent) :QMainWindow(parent)
- QMainWindow是父类(基类)而MainWindow是子类(派生类)
- QMainWindow(parent)是基类构造函数
- 类Mainwindow在实现构造函数时,要初始化基类QMainwindow的数据成员但是因为无法继承基类的构造函数,所以才用这种方式初始化基类的数据成员。
*MainWindow::MainWindow(QWidget parent): QMainWindow(parent)
, ui(new Ui::MainWindow)
- ui(new Ui::MainWindow)和QMainWindow(parent)一样,都是构造函数MainWindow(QWidget *parent)里的初始化的一部分,语法用“,”隔开;
5、工作方向
六、单片机开发
1、RTOS内核
1.1、freeRTOS
2、STM32
1.单片机程序的烧录与运行
一般情况下:
0、待烧录的程序文件:
包含:汇编代码(文件头)、代码段,data段,bss段,rodata段等
1、烧录时:
对于烧录在单片机里面的程序,程序的代码段,data段,bss段,rodata段等都存放在单片机的Flash中。
2、上电运行时:
初始化汇编代码将data段,bss段,复制到单片机的RAM中,并建立好堆栈,开始调用程序的main函数。
以后,便有了程序存储器和数据存储器之分,
程序运行时从Flash(即指令存储器,代码存储器)中读取指令,从RAM中读取与写入数据。
2)RAM->存放data段,bss段,堆栈段;
FLASH(ROM)->存放代码段(code 段)与只读数据段(rodata段);
在单片机上RAM存放data段、bss段、堆栈段;
ROM(EPROM、EEPROM、Flash等非易失性存储设备)存放代码,只读数据段。
3)bss段的理解:(Block Started By Symbol)通常是指用来存放程序未初始化的全局变量和静态变量的一块内存区域,特点是可读写的;在程序执行之前bss段会自动清零,所以未初始化的全局变量与静态变量在程序执行之前就已经初始化为0了。
4)rodata段的理解:rodata段存放的是程序只读数据,一般是程序里面的只读变量(如const修饰的变量)与字符串常量。单独设立".rodata"段有很多好处,不光是在语义上支持const字,操作系统加载时可以将".rodata"段的属性设置为只读,保证了程序的安全。
分类情况:
1、一般比较小的系统:
单片机本身内部就有FLASH的。这种FLASH不同于通用的FLASH,他是支持随机地址访问的。这样的单片机,一般程序都存储在FLASH里,然后运行的时候,PC指针也可以到固定的FLASH地址里去取指令,所以呢,程序是运行在FLASH里的。
2、较大一些的系统:
这些系统的程序,相对来说都是比较大的,单片机也都是比较强大的。
他们的FLASH一般都是外挂的大FLASH,这样的FLASH就有个特点,不支持随机地址访问,必须一页一页的访问,这样的话,程序就不能运行在FLASH里,因为下一条指令会招不到。 怎么办呢,那就有办法啊,RAM支持随机地址访问啊,我们把FLASH里面的内容搬移到RAM里,就可以了,这样访问起来就会更快了。
3、总结:
通俗点来讲呢,我们说一个电脑的内存有多大,就是这个RAM,我们的系统和程序都是在那4个G里运行这的。
所以啊,一般说来,一个操作系统的内核,其实是没有太大的。
说白了,就是一些简单的单片机,他的FLASH支持随地地址访问,为了降低程序,程序就运行在了FLASH里面了。
4、详细文章,参考
2.定时任务&消息队列
- 微服务
- 定时任务
- 消息队列
- 消息队列MQ(Message Queue)
单片机与消息队列
单片机开发应用消息队列处理事件主要是为了解耦,减少模块与模块之间的耦合。
消息队列能够使得任务与任务、或者任务与中断之间进行通信。
在单片机软件系统中,先存入的消息先被执行,实现了抢占式多任务操作系统的功能,
使编写的代码结构简洁,层次分明和容易维护,软件运行效率显著提高。
3、ESP8266/32(物联网系列)
七、ROS
中间件
中间件是位于平台(硬件和操作系统)和应用之间的通用服务
ROS就是一种中间件
———————————————————————————