《囚徒》普希金
我坐在阴湿牢狱的铁栏后一只在禁锢中成长的鹰雏和我郁郁地做伴;它扑着翅膀,在铁窗下啄食着血腥的食物。它啄食着,丢弃着,又望望窗外,像是和我感到同样的烦恼。它用眼神和叫声向我招呼,像要说:“我们飞去吧,是时候了,“我们原是自由的鸟儿,飞去吧——飞到那乌云后面明媚的山峦,飞到那里,到那蓝色的海角,只有风在欢舞……还有我做伴……
Linux内核移植
Linux内核基本概念Linux内核特性
可移植性,支持的硬件平台广泛
超强的网络功能
多任务多用户系统
模块化的设计
五大子系统
进程管理子系统
内存管理子系统
文件系统子系统
网络协议子系统
设备管理子系统
目录结构目录结构的描述:
与平台相关的kernel会和与平台无关的kernel功能相辅相成,无关的会依赖相关代码
平台无关与平台无关的目录树:
平台有关–archarch中与平台相关代码:
命名规律当内核中头文件重名如何解决?
头文件命名规范:
内核配置问题
配置哪些目录需要编译
配置哪些文件需要编译 编译时到底文件是哪个目录? Makefile方法与思路
配置步骤:
配置仓库选取,即配置单的修改
交叉编译器的修改
体系结构体的选择
增删改查
体系结构选择的配置,交叉编译方式的选择修改Makefile
各个目录的编译有Makefile进行选择编译。
各个子目录Makefile
obj-y : 编译进内核
obj- : 不编译进去
obj-m: 以模块形式编译条件编译:
**主目录Makefile的修改: **
修改连接的平台相关代码:【h ...
IIC设备驱动及子系统开发
基本概念
设备都有自己得设备地址,EEprom存储设备信息,包括设备地址
一般为7位,前四位已经固化好了,其余三位可以通过设计图,上图,看出接地为000,P0,P1也在数据手册中进行描述,为未接,为0. 即AT24LC08(上图有误)地址为1010 000.
总线速度:标准速度100kbps,快速模式400kbps,高速模式3.4Mbps(一般为100,四百也多一点)
IIC特点: 半双工(串行方式),仅需要两根线(所以又被称为2-wixe总线)
设备操作时序
IIC从机设备地址是由主机写进去的
低电平写,高电平读
IIC开始条件和终止条件,基本时序图如下
读写时序分析按字节进行写操作主设备设备地址为1010 000,发送数据,写到地址0x3,写入0x5。
写入逻辑图
按页进行写操作按页进行写操作如下图。
当前地址读操作当前地址读操作如下图。
随机读操作随机读操作如下图。
序列号读操作序列化读操作如下图。
读写逻辑
结合上图随机读操作进行理解。
写数据
装载AT24C08设备地址:0xA0
设置IIC开始条件
使能ACK
检测状态
装载存 ...
无题
帮助快速上手汇编语言编程,虽然只限于编程
VScode配置调试环境
安装插件TASM/MASM
右键扩展设置,选择Assembler:MASM
右键调试即可开始调试了!
Debug.exe
R命令:查看、改变CPU寄存器的内容D命令:查看内存中的内容T命令:执行一条机器指令G命令:从停顿的地方运行到底
第一段代码:Hello World123456789101112131415161718192021DSEG SEGMENT MESS DB 'Hello, World!',0DH,0AH,24HDSEG ENDSSSEG SEGMENT PARA STACK DW 256 DUP(?)SSEG ENDSCSEG SEGMENT ASSUME CS:CSEG, DS:DSEG BEGIN:MOV AX,DSEG MOV DS,AX MOV DX,OFFSET MESS ...
ARM硬件基础
CPU核心
SIMD:Single Instruction Multiple Data,单指令多数据流。单次处理多条数据。
NEON:加速多媒体和信号处理算法(如视频编码/解码、2D/3D图形、游戏、音频和语音处理图像处理技术、电话和声音合成),其性能至少为ARM5性能的3倍,为ARMv6SIMD性能的2倍。主要处理浮点数
系统外围
RTC:real-time clock
PLL:Phase Locked Loop,为锁相回路或锁相环,用来统一整合时脉讯号,使内存能正确的存取资料。
PWM Timer:脉冲宽度调制(Pulse Width Modulation),脉宽调制
Watchdog Timer:
DMA:帮助存储器与外设进行交互,减轻CPU压力
Keypad:按钮
ADC:Analog to Digital Converter,模数转换器
SISD&SIMDSISD:单指令单数据SIMD:单指令多数据
NEON:对SIMD进行扩展,加入向量表提高数据集的压缩,进而提高浮点数运算效率。
Cache 高速缓存
二级缓存的优化会大大影响程序运行速度。涉及到调优。
...
bootloader概述
bootloader的作用和概述作用boot的目的(跳到C语言中):
关闭看门狗,中断,MMU,CACHE(影响数据完整性)
配置系统工作时钟(不同处理器、外设对于时钟要求不一样)
配置SDRAM的控制器(行地址数、列地址数、多少块,周期性的充电【难点 】
让sp指向可读可写的设备区间中,满足递减栈的规则SDAM
用哪些模式,就要初始化哪些模式下的SP
每个模式值不能覆盖其他模式
代码搬移(code太大需要转移到DRAM)
方式一,执行速度问题,把程序从存储器(nor-flash)搬移到快速的内存
方式二,只把存储器的一部分代码执行出来,把存储在其他位置上的低码搬移到内存,对应存储器的控制器的初始化
bl main
loader的目的:执行应用逻辑,点灯、uart,load linux kernel
ARM汇编
汇编概念
不同系统种汇编指令有差异
如何判断一个立即数是否合规:此数除以4,如果在0-255之间则合规。0x102:是立即数0x104:不是立即数
寻址模式
ARM堆栈
满堆栈:堆栈指针指向栈顶
空堆栈:堆栈指针指向栈底
递增堆栈:从低地址向高地址压栈
递减堆栈:从高地址向低地址压栈
汇编算数操作
内存操作
跳转与状态操作
跳转实质:给PC传程序地址,告诉CPU下一个执行的程序。BL:mov LR,PC 这样执行完可以在LR中找到执行记录返回
常用伪指令
混合编程
在C/C++代码中嵌入汇编指令。
汇编调用C/C+
C/C++调用汇编
C语言嵌入汇编限制条件:
不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令;
在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突;
R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器;
在C中嵌入汇编指令123456789101112131415161718void my_str_cpy( ...
ARM 体系架构粗了解
版本差异
副处理器可以省电70%
CPU组成
基本组成:ALU(计算单元,累加器)、控制器(切换)、寄存器、总线(连接)
处理模式ARM7、ARM9:7中Cortex-A:9种。8种特权模式,一种非特权模式即用户模式
寄存器
SP:堆栈寄存器
LR:链接寄存器
PC:程序寄存器
PSR:程序状态寄存器
APSR:应用程序状态寄存器
CPSR:当前程序状态寄存器
SPSR:已存储程序状态寄存器
只有在用户模式下才是ASPR,其它模式都是CSPR
R0-R12通用寄存器,放通用数据,32bit
各个模式的R0-R12与USR模式是共享的(除了FIQ,R8-R12),PC,CPSR共享的
USRR模式没有SPSR
CSPR指令格式
M:九种模式,五位表示
T:是否使用Thumb指令
F:是否禁用FIQ
I:是否禁用IRQ
A:是否禁用ABT
E:存储字节的顺序(大段还是小段,因为存储时以字为单位,所以需要选择存储顺序)
IT:Thumb2指令的if…then…条件执行
GE:SIMD
J:Jazelle(Java)
Q:累计饱和instructions
V:ALU操作溢 ...
Linux多进程之间的通信(二)
IPC 基本结构简述
IPC通信包括:共享内存,消息队列,信号灯
共享内存打开或创建一个共享内存对象,共享内核在内核是什么样子的?一块缓存,变类似于用户空间的数组或malloc函数分配的空间一样。
查看IPC对象:ipcs -m【查看共享内存】| -q【队列】| -s【信号灯】删除IPC对象:ipcrm -m | -q | -s id【IPC的ID】
共享内存可以通过memcpy写入,也可以通过键盘输入stdin
利用键盘输入读取共享内存123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051/************************************************************************* > File Name: shm_0.c > Author: Merlynr > Mail: lcq1013962426@gmail.com > Created Time: 20 ...