嵌入式笔记(持续更新)

嵌入式笔记:

新的字符设备注册方法: 维护一个cdev结构体,每一个cdev结构体都是一个字符设备
初始化cdev结构体 cdev_init()---->cdev_add()向内核添加字符设备---->cdev_del()删除字符设备
设备树:描述板级设备的信息
compatible:绑定设备和驱动的属性
bootloader启动流程:
第一阶段:
1、硬件设备初始化
2、准备ram空间,将bootloader拷贝的ram
3、设置好堆栈
4、跳转到C代码

第二阶段:
1、初始化硬件设备
2、将内核映像和根文件系统读取到ram空间
3、设置内核的启动参数
4、调用内核

内核启动:
1、设置处理器的工作模式、使能mmu
2、内核初始化

根文件系统
/etc/:配置目录
/bin:开机时必须用到的执行文件

汇编:寄存器存取内存中的数据 LDR STR

objdump 反汇编,objcopy 格式转换

cortex_a系列运行模式:user、FIQ、IRQ、SVC、abort、undef、system
ARM 处理器 3 级流水线:取指->译码->执行
R0~R15 16个通用寄存器组 R0~R14作为通用的数据存储寄存器,r15是程序计数器,保存将要执行的指令,还提供了一个当前程序状态寄存器CPSR和一个备份程序状态寄存器SPSR,SPSR寄存器就是CPSR寄存器的备份。
R13 SP寄存器有8个物理寄存器,程序会初始化R13使其指向对应模式的专用的栈地址,也就是初始化sp指针
R14 LR寄存器:存放当前子程序的返回地址。
R15 PC寄存器:保存当前执行的指令地址;

中断向量表: 存放的中断向量的首地址或者中断服务程序的首地址 中断被执行会跳到某个中断向量表
对应的中断服务函数去执行
M内核系列的中断管理机制:NVIC中断控制器
A系列的中断管理器:GIC 常用中断类型:复位中断、IRQ中断
GIC把中断源分为:SPI共享中断(所有core都共享的中断,外部中断都属于SPI中断)、PPI私有中断(每个核自己的中断)、SGI软件中断(向寄存器写数据出发的中断)
两个逻辑块:Distributor 和 CPU Interface
中断分发器:全局中断使能控制、中断优先级、设置触发方式、设置目标处理器
CPU interface:使能或者关闭发送到cpu core的中断请求信号、应答中断、通知中断处理完成、设置优先级掩码,通过掩码来设置哪些中断不需要上报给 CPU Core。定义抢占策略
CPU响应中断:执行相应的中断服务程序,将现在正在执行的程序指令压入堆栈,跳转到对应的中断服务函数的入口地址,执行完毕后在出栈

大端:高字节存在低地址
小端:高位存在高地址

uart: 空闲为逻辑1的状态,高电平,当发送数据时,会将高电平拉低,在传输数据
数据位:一般为5~8位,低位在前,高位最后传输
波特率:数据传输的速率,每秒传输的数据位数

I2C: SCL和SDA线,速度:标准模式下100kb/s 快速模式:400kb/s 都会接一个上拉电阻,空闲都是高电平
起始位:SCL为高电平时,SDA出现下降沿
停止位:SCL为高点平,SDA出现上升沿
数据传输:SCL为高电平期间必须保持数据稳定,SDA数据变化只能在低电平期间
应答信号:从机SDA拉低电平表示发出应答,表示通信成功
写时序: 起始信号产生,发送从机设备地址数据(包含7位地址数据和1位读写标志),从机应答,重新发送起始信号,发送要写入的寄存器的地址,从机发送应答信号,发送写入的数据,写数据
完成时发送停止信号
读时序: 主机发送起始信号,发送要读取的从机设备地址,从机响应信号,发送要读取的寄存器地址,从机响应,重新发送起始信号,发送读取的从机设备地址,等待读取数据,读取数据结束时
主机发送NO ACK信号表示读取完成,最后发送停止信号,停止通信

SPI: CS/SS片选信号线 SCK:串行时钟 、MOSI和MISO 输入输出信号
四种工作模式:时钟极性和相位
①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

UBOOT启动流程:
1、编译uboot找对uboot.lds文件
2、跳到Vector.S文件中汇编文件中
3、跳转到函数cpu_init_crit()函数中
4、调用lowlevel_init()函数
5、执行_main()函数

uboot移植:1、配置configs文件下的deconfig文件;2、添加对应的板级文件夹; 3、使用make编译配置文件得到编译文件u-boot.bin;4、烧写到SD卡中,设置SD卡启动;

Linux驱动:
三大类: 字符设备驱动、块设备驱动、网络设备驱动
驱动可以直接编译进内核,开机直接启动,也可以编译成模块,使用的时候可以手动加载和卸载模块,模块加载的时候可以会调用module_init()函数,卸载的时候会调用module_exit()函数
modprobe: 解决模块的依赖关系
字符设备: register_chrdev()注册字符设备 unregister_chrdev()注销字符设备
设备号: 主设备号12,次设备号20

创建一个基本的字符设备流程:模块的加载和卸载函数—>init()—>设备注册—>申请设备号(动态、静态)—>维护file_operation结构体函数操作集
copy_from_user和copy_to_user
ioremap:向寄存器写入数据的时候如果开启了mmu则需要内存映射----获取指定物理地址空间的映射虚拟空间地址。

并发和竞争

自旋锁: 等待的线程会一直处于自旋的状态,浪费处理时间,适用于短期的轻量级的加锁 spinlock
读写锁: 当是写操作时,只允许一个线程持有写锁,当读操作时,所有线程都可以读 rwlock
信号量: 等待的线程进去休眠状态,适用于共享资源的持有时间比较长 设置一个信号量值,这个值大于0表示有资源可以访问 semaphore
互斥锁: 一次只允许一个线程访问一个资源 mutex
Linux中断: request_irq申请中断 申请的中断服务函数属于中断上半部
中断下半部: 工作队列和软中断来处理中断下半部 work_struct
Linux阻塞和非阻塞IO、异步通知
阻塞IO: 设备文件不可用的进程可以进入休眠状态,使用时用等待队列来唤醒 wait_queue
非阻塞IO: 使用select、poll或者epoll函数 将文件描述符放入数组,轮询监听是否有文件可操作
异步通知 :软件层次对中断的一种模拟,signal kill和stop信号不能被忽略 对应file_operation的fasync函数

platform平台设备驱动: 驱动和设备分离 通过总线来适配
总线类型 :bus_type结构体表示总线类型,match就是匹配函数
设备和驱动匹配: 1、of类型匹配,通过of_match_table对比设备树下的compatible列表,如果有就表示匹配,匹配成功会自动调用probe函数;2、匹配name字段是否相同
platform_driver()平台设备驱动注册结构体,结构体包含probe函数;platform_device()表示平台设备结构体(如果支持设备树直接用设备方式)
注册驱动: platform_driver_register()

网络编程

应用层: http(超文本传输信息),FTP(文件传输协议) 等…
传输层: TCP(传输控制协议), UDP(用户数据报协议) 提供端对端的传输.
网络层: ip(网间协议) 提供数据的路由.
网络接口层: ARP(地址解析协议 IP地址–>mac地址)

TCP套接字: 创建socket();绑定bind();listen()监听;accept()接受链接;close()关闭
三次握手: 客户端向服务器发送请求,服务器接受请求并返回一个准备好了的响应信号,客户端发送确认包,完成握手,传送数据
四次挥手: 客户端主动关闭,发送一个断开信号给服务器,服务器返回一个响应信号,表示收到断开信号,服务器主动关闭后,又会发送一次断开信号给客户端,客户端接收到信号会返回一个确认信号,链接断开;

程序编译流程:编译和链接
编译: 编译预处理:宏替换,头文件替换,条件编译、编译优化生成.s文件; 汇编:将代码翻译目标机器指令
链接: 某个源文件调用另一个源文件的定义的变量或者函数需要链接静态链接和动态链接 绘制成目标文件
静态链接库: 就是许多.o目标文件的集合 代码庞大 每一个文件都有一份
动态链接库: 运行时进行链接 指挥存在一份

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值