嵌入式和物联网系统学习小结_bare metal firmware

AXI (Advanced eXtensible Interface) 高级可拓展接口
3. AHB主要是针对高效率、高频宽及快速系统模块所设计的总线,它可以连接如微处理器、芯片上或芯片外的内存模块和DMA等高效率模块;
APB主要用在低速且低功率的外围,可针对外围设备作功率消耗及复杂接口的最佳化;APB在AHB和低带宽的外围设备之间提供了通信的桥梁,所以APB是AHB或ASB的二级拓展总线 ;
AXI:高速度、高带宽,管道化互联,单向通道,只需要首地址,读写并行,支持乱序,支持非对齐操作,有效支持初始延迟较高的外设,连线非常多;
4. AHB与AXI、APB的区别与联系
AHB是先进的高性能总线,AXI是先进的可扩展接口,APB是高级外围总线;
AHB和APB都是单通道总线,不支持读写并行;而AXI是多通道总线,总共分为五个通道,能够实现读写并行;
AHB和AXI都是多主/从设备,且通过仲裁机制实现总线控制权的分配;而APB是单主设备多从设备,其主设备就是APB桥,不具有仲裁机制;
在数据操作方面,AHB和AXI支持突发传输,APB不支持;此外,AXI支持数据的非对齐操作,AHB不支持;
5. PC值=当前程序执行位置+8;
当突然发生中断的时候,保存的是PC-8+4 = PC-4 (即下一条指令的地址)。

中断和轮询

  1. 如果IO任务频繁发生,可以考虑轮询,这样CPU效率比较高,而且实现简单。
  2. 如果IO任务偶尔发生,可以考虑中断,这样可以有low-power,因为CPU大部分时间可能在睡觉。
  3. 如果IO任务需要马上响应,可以考虑中断。
    关于中断:
  4. 基于时钟的中断,优先级要很高
  5. https://www.zhihu.com/question/27933543
    非阻塞式轮询,请加等待。//不加等待的话, CPU就会满负荷
    不想加等待,请用阻塞式调用。//加了阻塞,CPU可以调度其他进程
    同时轮询多个事件,用异步事件处理机制。//只有异步处理机制能够在短时间内处理庞大的请求数量而且不过分占用资源,多线程/多进程机制是无法做到的。
  6. 有的资料说轮询实时性更好,有的说中断实时性更好。我的想法是中断应该是实时性更好一些。特别是如果轮询中有等待或阻塞的话。

Cache invalidate vs Cache flush:
A cache invalidate simply marks the cache contents as invalid. So the next time you access data, you will get what is in memory.
A cache flush writes back data from cache into memory.
These two will differ only when memory contents get out of sync with cache contents, which will happen only when you have DMA or a 2nd processor writing to the same memory location.

Some examples:

  1. DMA transfer data from DDR memory to HW buffer.
    DDR buffer should be flushed before DMA. Driver buffer is non cacheable so no need for invalidation.
  2. DMA transfer data from HW buffer to DDR (HW received data and want to make it available for CPU)
    DDR buffer should be invalidated before or after (look NOTE below for details) DMA transfering to prevent CPU to use ‘old’ data from cache. Flushing of HW buffer is redundant.
  3. DMA transfer from DDR into another region of DDR.
    ‘Source’ buffer should be flushed, ‘Destination’ buffer should be invalidated. So valid data is in memory for DMA before transfer, and CPU doesn’t take a ‘dirt’ from cache after DMA did it’s job.

https://blog.itpub.net/70005277/viewspace-2790455/
CPU需要进行DMA写操作,也就是把内存中的buffer A写入到设备的FIFO A里面,那么有可能cache里面的数据还没有完全写入到内存的buffer A中,那这时候启动DMA的话,最终传递到设备FIFO A的数据其实不是CPU想写的,因为还有一部分数据早 潜伏在cache A中没有 sync到内存里。这个场景有点类似,我们拷贝内存到U盘,马上拔出,然后发现U盘没有东西。
我们来看一下DMA读的情况,CPU想把设备的FIFO B的数据读到内存buffer B中。那如果在开启DMA传输的时候没有去把内存buffer B的相应的cache invalid的话,那么DMA把数据从FIFO B到了内存Buffer B之后,CPU去读这个内存Buffer B的数据,那么会把之前的 残留在cache line的内容 先读到了CPU,那CPU其实是没有读到最新的FIFO B的数据的。
总结:
DMA写,需要flush cache line。
DMA读,需要invalid cache line。

嵌入式系统提高可靠性方法:

  1. 加Lock for race condition
  2. 加Watch dog及早发现错误。可以加一个专门的watch dog task,优先级设很高。

关于阻塞/非阻塞/同步/异步 IO模型:
我认为异步就是用回调函数。
比较好的链接有:
https://www.cnblogs.com/f-ck-need-u/p/7624733.html
https://www.junmajinlong.com/coding/IO_Model/

同步通信和异步通信
不要跟上面的同步/异步 IO搞混了。
这里的同步通信是指通信双方有时钟同步,异步通信是指通信双方没有时钟同步,靠发送数据帧里面的开始/终止 flag来同步
同步串行通信协议: SPISATA
异步串行通信协议: I2C (数据帧有起始/终止位), UART(双方协商波特率), CAN(从隐性到显性的下降沿可以用作同步,有硬同步和重同步两种)

串行通信和异步通信
大部分都是串行通信,好像只有打印机的通信是异步的?
下面这个表不错,来自https://blog.csdn.net/qq_18677445/article/details/102469255
在这里插入图片描述
SPI: SPI通讯接口的扩展常用于高速的或大数据容量的功能外设拓展,譬如WiFi、Ethernet、SD/TF卡、大容量高速数据存储器等。与I2C通讯接口相比, 虽然SPI通讯接口的拓扑需要占用更多个I/O引脚用于片选或握手信号,但SPI接口的时钟频率远高于I2C。此外,SPI通讯接口支持全双工通讯,但I2C是半双工的。 我们直到SD/TF卡的存储器容量可以按千兆字节(即GB)来计量,而NOR结构型FlashROM的存储容量仅以MB计量,两者的存取速度相差很大(后者速度更快), 而且这两类存储器都采用SPI或QSPI等接口。大容量存储器不使用I2C通讯接口的另一个原因是,I2C的总线寻址和大容量存储器的地址管理会造成数据存取过程中地址信息的传输将占用大量时间, 数据的存取效率极地。
SPI虽然仅支持主从通讯模式,但数据传输速度几乎是I2C的1000倍。
I2C: 音视频设备、视觉传感器和点阵图形显示器接口中常用I2C或SMBus作为这些设备的参数配置通讯接口。好像I2C和SPI不同的地方还有I2C有应答机制(发送后的第9个周期要收到应答?),而SPI没有。
注意: SPI 只可能有一个master,可以有多个slave。
I2C可以有多个master和多个slave。

关于锁

  1. spinlock主要用于多核之间的同步,semaphore/mutex/disable interrupt主要用于同一个核上面不同task之间的同步
  2. spinlock可以用于interrupt handler,semaphore/mutex不可以,semaphore/mutex是基于busy/wait,task会sleep,没有办法唤醒。
  3. spinlock在多核里面是真正的自旋锁,在单核可以抢占的系统里面就相当于disable interrupt。在单核非抢占的系统里面spinlock没有意义,因为没有谁唤醒它,所以单核非抢占系统里面spinlock()实际上是空。
  4. 自旋锁实际上是忙等锁
    https://blog.csdn.net/jfkidear/article/details/11254133
    当锁不可用时,CPU一直循环执行“测试并设置”该锁直到可用而取得该锁,CPU在等待自旋锁时不做任何有用的工作,仅仅是等待。因此,只有在占用锁的时间极短的情况下,使用自旋锁才是合理的。当 临界区很大或有共享设备的时候,需要较长时间占用锁,使用自旋锁会降低系统的性能。
  5. 自旋锁可能导致系统死锁
    https://blog.csdn.net/jfkidear/article/details/11254133
    引发这个问题最常见的情况是 递归使用一个自旋锁,即如果一个已经拥有某个自旋锁的CPU 想第二次获得这个自旋锁,则该CPU 将 死锁。此外,如果进程获得自旋锁之后再阻塞,也有可能导致 死锁的发生。copy_from_user()、copy_to_user()和 kmalloc()等函数都有可能引起阻塞,因此在自旋锁的占用期间不能调用这些函数。
  6. **排它锁(mutex)**只能允许一个读或写。
    **读写锁(rwlock)**允许多读和一写。
    rcu允许多读和多写。其中多读之间没有锁,多写之间有锁。
    //from Linux设备驱动开发详解:基于最新的Linux4.0内核/Linux设备驱动开发详解:基于最新的Linux4.0内核.pdf
    rcu可以看作读写锁的高性能版本,相比读写锁,RCU的优点在于既允许多个读执行单元同时访问被保护的数据,又允许多个读执行单元和多个写执行单元同时访问被保护的数据。但是,RCU不能替代读写锁,因为如果写比较多时,对读执行单元的性能提高不能弥补写执行单元同步导致的损失。因为使用RCU时,写执行单元之间的同步开销会比较大,它需要延迟数据结构的释放,复制被修改的数据结构,它也必须使用某种锁机制来同步并发的其他写执行单元的修改操作。
    **顺序锁(seqlock)**是对读写锁的一种优化,若使用顺序锁,读执行单元不会被写执行单元阻塞,也就是说,读执行单元在写执行单元对被顺序锁保护的共享资源进行写操作时仍然可以继续读,而不必等待写执行单元完成写操作,写执行单元也不需要等待所有读执行单元完成读操作才去进行写操作。但是,写执行单元与写执行单元之间仍然是互斥的,即如果有写执行单元在进行写操作,其他写执行单元必须自旋在那里,直到写执行单元释放了顺序锁。
    对于顺序锁而言,尽管读写之间不互相排斥,但是如果读执行单元在读操作期间,写执行单元已经发生了写操作,那么,读执行单元必须重新读取数据,以便确保得到的数据是完整的。所以,在这种情况下,读端可能反复读多次同样的区域才能读到有效的数据。
    个人理解。用读写锁的时候,读写是互斥的,即写的时候是不能读的,读的时候也是不能写的。而用顺序锁的时候,读写不互斥,即写的时候可以读,读的时候也可以写。但如果读执行单元在读操作期间,写执行单元已经发生了写操作,那么,读执行单元必须重新读取数据,以便确保得到的数据是完整的。
    7.自旋锁和互斥体选用的3项原则。
    //from Linux设备驱动开发详解:基于最新的Linux4.0内核/Linux设备驱动开发详解:基于最新的Linux4.0内核.pdf
    a)当锁不能被获取到时,使用互斥体的开销是进程上下文切换时间,使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定)。若临界区比较小,宜使用自旋锁,若临界区很大,应使用互斥体。
    b)互斥体所保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区。因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁就会发生。
    c)互斥体存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在互斥体和自旋锁之间只能选择自旋锁。当然,如果一定要使用互斥体,则只能通过mutex_trylock()方式进行,不能获取就立即返回以避免阻塞。

关于sensor传感器系统的设计
https://www.linkedin.com/advice/1/how-do-you-design-implement-camera-sensor#write-the-software

  1. sensor的选型(low power consumption, cost, resolution, pixel size, dynamic range, sensitivity, noise, and compatibility with your camera platform,还有电气属性和接口协议等。
  2. firmware design (sensor side)
    包括sensor’s basic functions, such as initialization, configuration, power management, exposure control, gain control, readout, and data transfer. You need to follow the sensor’s programming guide, which provides instructions and examples on how to write the firmware and use the sensor’s registers, timers, interrupts, and other features.
  3. software design (host side)
    The software is the high-level software that runs on the camera’s main processor or system-on-chip (SoC). It interacts with the sensor’s firmware through an interface, such as I2C, SPI, or MIPI CSI. It performs tasks such as image processing, compression, encoding, storage, display, and transmission. The software is usually written in C, C++, or Python, and uses libraries and frameworks that support image processing, such as OpenCV, GStreamer, or TensorFlow. You need to follow the camera’s software development kit (SDK), which provides APIs and documentation on how to write the software and use the camera’s hardware and software resources.

Bare Metal vs RTOS
什么时候用Bare Metal:

  1. Bare metal firmware development thrives in real-time systems where accurate timing and responsiveness are essential.
  2. Bare metal firmware development is especially beneficial in resource-restricted situations, such as embedded systems with confined memory and processing capacity.
  3. Bare metal firmware development is a good solution for unique or highly specialized hardware platforms. These platforms frequently need low-level modification and control since they could have distinctive features, user interfaces, or communication protocols.
    在这里插入图片描述

MQTT vs Websocket
都是基于TCP长链接。MQTT好像更适合于短消息的发送。

通信可靠性

  1. 连接可靠 - ACK机制
  2. 传输可靠 - heartbeat

关于纠错码

  1. Checksum 只能查出1-bit的错误,CRC可以查出2-bit的错误。
  2. ECC 呢?

关于SPI, I2C, UART和USB。

  1. SPI, I2C和UART都是串行。 SPI和I2C是同步,因为有CLK信号来同步。UART是异步,因为没有CLK信号,靠的是波特率。
    USB好像也是串行异步,不过USB的音频传输好像可以自己生成时钟来同步?
  2. SPI一般要4根线(片选,数据发送/接收,时钟),I2C一般要2根线(数据和时钟)。UART一般2根线(数据发送和接收)。注意:可能还有根地线。
    USB 2.0 有4根线: 一对差分线(D+、D-)传送信号,另一对(VBUS、电源地)传送+5V的直流电。USB 3.0有8根线,除VBUS、电源地之外,其余3对均为数据传输线路。其中保留了D+与D-这两条兼容USB 2.0的线路,新增了SSRX与SSTX专为USB 3.0所设的线路。
  3. 一般主控SoC作为SPI的“主”,而外设作为SPI的“从”。
  4. 假设发送一个8bit的字节,UART是从低位到高位发送,SPI和I2C都是从高位到低位发送。
  5. SPI没有开始位,结束位和应答位,效率比SPI高。
  6. SPI 4种工作模式
    from https://www.bilibili.com/video/BV1UG411L7pH/?vd_source=607d67fdd1e8f6a823c13fec42a1374d在这里插入图片描述

关于ARM
1.在Linux里面,ARM处理器分为7种工作模式
·用户模式(usr):大多数应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护
的系统资源是不能访问的。

·快速中断模式(fiq):用于高速数据传输或通道处理。
·外部中断模式(irq):用于通用的中断处理。
·管理模式(svc):操作系统使用的保护模式。
·数据访问中止模式(abt):当数据或指令预取中止时进入该模式,可用于虚拟存储及存储保护。
·系统模式(sys):运行具有特权的操作系统任务。
·未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件
仿真。
ARM Linux的系统调用实现原理是采用swi软中断从用户(usr)模式陷入管理模式(svc)。
21. 在Linux里面,x86处理器包含4个不同的特权级,称为Ring 0~Ring 3。在Ring0下,可以执行特权级指令,对
任何I/O设备都有访问权等,而Ring3则被限制很多操作。
22. 内核空间和用户空间这两个名词用来区分程序执行的两种不同状态,它们使用不同的地址空间。
Linux只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移

关于DMA

关于CPU context switch:
https://mdnice.com/writing/9af582fd2cd84c098c4a615b03fb2135
有哪些类型的 cpu context switch?
根据触发条件的不同,主要有三种类型的上下文切换:
多任务处理 Multitasking
中断信号处理 Interrupt handling
用户态和内核态切换 User and kernel mode switching
: 系统调用
系统调用触发的 CPU 上下文切换,也经常被称为 “特权模式切换”(privileged mode switch),与多任务 multitasking 进程切换触发的 CPU 上下文切换,有很多不同点:
系统调用触发的 CPU 上下文切换,切换前后执行的是用一个进程,而多任务 multitasking 进程切换触发的 CPU 上下文切换,切换前后执行的是不同的进程;
多任务 multitasking 进程切换触发的 CPU 上下文切换,涉及到用户空间的资源包括虚拟内存,栈和全局变量 (virtual memory, stacks and global variables),也涉及到内核空间的资源,比如内核栈和寄存器 (kernel stacks and registers),其状态数据比系统调用涉及的状态数据要大很多;
系统统调用触发的 CPU 上下文切换,相对于多任务处理触发的 CPU 上下文切换,因为其状态数据更小,其成本也要小很多。

几个名词不要混淆

  1. RCU: read-copy-update (RCU) is a synchronization mechanism that avoids the use of lock primitives while multiple threads concurrently read and update elements that are linked through pointers and that belong to shared data structures (e.g., linked lists, trees, hash tables).
    linux内核中有一种叫做RCU(Read-Copy Update)数据共享策略跟COW十分相似,唯一不同在于RCU的新旧数据替换同过特定的回调(callback)机制被动执行,而不是由写操作进程自助完成。
  2. COW: Copy-on-write (CoW) is a resource management technique in Linux that allows the parent and child processes to share the same memory pages. It facilitates multiple processes to share the same memory pages until one process modifies them. Upon modification, the operating system creates a duplicate copy of the original page, which is exclusively granted to the modifying process, while the other processes continue to share the original page.
    COW的本质就是,在并发的环境中,如果想要更新某个对象,首先将它拷贝一份,在这个拷贝的对象中进行修改,最后把指向原对象的指针指回更新好的对象。
    个人理解:RCU是Linux里面的一种数据共享策略,COW是一种非常经典的优化思想,在很多方面上都有具体的应用。
    //from Linux设备驱动开发详解:基于最新的Linux4.0内核/Linux设备驱动开发详解:基于最新的Linux4.0内核.pdf
    例如Linux OS利用COW思想实现lazy copy以节省资源提高性能 (比如说新建进程或线程就可以用copy-on-write 的策略优化,也就是并不真正复制父进程的内存空间,而是等到需要写操作时才去复制。所以 Linux 中新建进程和新建线程都很迅速),java中利用COW思想实现集合的读写分离的并发策略(CopyOnWriteArrayList & CopyOnWriteArraySet),以提高性能且保证并发安全,redis中的数据持久化策略都使用了cow思想,Kafka中利用COW思想实现消息Map,避免更新key-value的时候阻塞住高频的读操作,实现无锁的效果,优化线程并发的性能,等等。
  3. Zero copy:
    https://www.junmajinlong.com/coding/IO_Model/
    网络数据一定要从kernel buffer复制到app buffer再复制到send buffer吗?
    不是。如果进程不需要修改数据,就直接发送给TCP连接的另一端,可以不用从kernel buffer复制到app buffer,而是直接复制到send buffer。这就是零复制技术。
    零复制的概念是避免将数据在内核空间和用户空间进行拷贝。主要目的是减少不必要的拷贝,避免让CPU做大量的数据拷贝任务。
    零拷贝技术有:
    a) MMAP
    b) sendfile()
    c) splice()
    d) tee()
  4. RDMA:
    某些硬件可以完成TCP/IP协议栈的工作,数据可以不经过socket buffer,直接在app buffer和硬件之间传输数据,RDMA技术就是在此基础上实现的。
  5. Cache write through:
  6. Cache write back:
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

img

img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

更多资料点击此处获qu!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值