技术标签: stm32 arm开发 物联网 嵌入式硬件 嵌入式
Microcontroller和Microprocessor啥区别?
Microcontroller就是我们说的微控制器,或者说单片机,通常包括CPU和其它parts,包括程序存储器(只读存储器或者闪存), 数据存储器(随机存储器), IO, Clock等在一起。CPU通常计算能力没那么强,而且比较便宜。
Microprocessor就是我们说的微处理器,通常只包括一个计算能力很强的CPU,比较贵。它会连到外设和其它parts。
Microcontroller把CPU和memory/IO/clock这些部件集成在一个芯片上。这样做的好处有:
注意:
https://zhuanlan.zhihu.com/p/126269758
MCU也就是单片机中几乎都是用哈佛结构,譬如广泛使用的51单片机、典型的STM32单片机(核心是ARM Cortex-M系列的)都是哈佛结构。原因1)是哈佛结构更加稳定安全,2)速度会更快一些,3)MCU的指令和数据需求量都不大,配置不高,所以内存往往使用SRAM而不使用DRAM,这样就导致它更适合哈佛结构。
PC和服务器芯片(譬如Intel AMD那些出的),ARMCortex-A系列嵌入式芯片(譬如核心是ARM CortexA8的三星S5PV210,譬如华为的麒麟970等手机芯片)等都是冯诺依曼结构。这些系统都需要大量内存,所以工作内存都是DRAM,因为他们更适合使用冯诺依曼系统。
CPU
ARM 是ARM公司开发,包括Coretx-M, Cortex-R 和 Cortex-A
Cortex-M: 定位是中低端市场,也就是我们的单片机,也叫微控制器,我们最常用的STM32F103就是Cortex-M3的内核。
Coretx-R: 定位高端实时系统,比如说医疗、工业、汽车、基带等等领域。适合做microprocessor?
Cortex-A: 定位是通用市场,典型的就是平板电脑、手机、数字电视、机顶盒、服务器、打印机等领域。大家手机里装的就是Cortex-A。
注意:Cortex-M不带MMU,所以不能跑Linux,只能跑RTOS或bare metal。
带MMU的是:Cortex-A系列、ARM9、ARM11系列;
不带MMU的是:Cortex-M系列……(STM32是M系列,没有MMU,不能运行Linux,只能运行一些UCOS、FreeRTOS等等)。
AVR: 是ATMEL公司开发,更便宜。
What is difference between ARM and AVR?
AVR and ARM comes under the family of micro-controller. But ARM can be used as both Microcontroller or as Microprocessor. ARM micro-controller and AVR micro-controller differs from each other in terms of different architecture and different sets of instruction, speed, cast, Memory, Power Consumption, Bus Width etc.
ARC: 是Synopsys开发的高端嵌入式应用处理器。
微控制器 MicroController和开发板
STM32 是意法半导体 STMicroelectronics开发,基于Cortex-M。我的理解是STM32 microcontroller 在Cortex-M之上还集成了Flash和SRAM memory等。适合用于消费类、工业控制、机器人、医疗设备、汽车等应用程序。比ESP32具有更多的通用性。
ESP32 是乐鑫科技Espressif公司开发(好像是国货?),基于Tensilica processor(这个是Cadence开发的CPU,不是ARM)。通常用于物联网设备,家庭自动化,Wi-Fi控制,更多是作为一个蓝牙、WiFi的中继功能。
MSP430 是德州仪器TI开发,16位低功耗单片机,适合低功耗嵌入式设备。有专门的TI CCS调试软件跟它配套。
Raspberry Pi加粗样式
Arduino: Arduino社区支持8位的AVR系列MCU(来自Atmel),以及32位的ARM Cortex-M系列和ESP系列MCU。
关于ARM
中断和轮询
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:
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。
嵌入式系统提高可靠性方法:
关于阻塞/非阻塞/同步/异步 IO模型:
我认为异步就是用回调函数。
比较好的链接有:
https://www.cnblogs.com/f-ck-need-u/p/7624733.html
https://www.junmajinlong.com/coding/IO_Model/
同步通信和异步通信
不要跟上面的同步/异步 IO搞混了。
这里的同步通信是指通信双方有时钟同步,异步通信是指通信双方没有时钟同步,靠发送数据帧里面的开始/终止 flag来同步
同步串行通信协议: SPI,SATA
异步串行通信协议: 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。
关于锁
关于sensor传感器系统的设计
https://www.linkedin.com/advice/1/how-do-you-design-implement-camera-sensor#write-the-software
Bare Metal vs RTOS
什么时候用Bare Metal:
MQTT vs Websocket
都是基于TCP长链接。MQTT好像更适合于短消息的发送。
通信可靠性
关于纠错码
关于SPI, I2C, UART和USB。
关于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 上下文切换,因为其状态数据更小,其成本也要小很多。
几个名词不要混淆
几个信号的区别:
CTRL + Z: SIGSTOP NO.19 Suspends a process by sending it the SIGSTOP signal, which the program cannot intercept. This keeps the program in the background, allowing it to be resumed later.
CTRL + C: SIGINT No.2 In the Linux terminal, Ctrl + Z suspends a process, while Ctrl + C forcefully terminates a process
**CTLR + **: SIGQUIT No.3 类似SIGINT?
CTRL + S: No Signal
CTRL + Q: No Signal
kill a task: SIGTERM NO.15
UNIX/Linux/Mac OS 系统中,Ctrl+D 代表输入结束。//但是对应什么信号?
SIGINT SIGTERM SIGKILL是什么区别?
https://www.jianshu.com/p/f6dfbf51c541
a. SIGINT SIGTERM SIGKILL都是结束/终止进程
b. SIGINT信号为ctrl+c发送出来的信号,该信号只能结束前台进程,信号被当前进程树接收到,也就是说,不仅当前进程会收到信号,它的子进程也会收到;
c. SIGTERM可以被阻塞,kill不加任何参数的时候发送的就是这个信号,只有当前进程收到信号,子进程不会收到。如果当前进程被kill了,那么它的子进程的父进程将会是init,也就是pid为1的进程;
d. SIGKILL是不能被捕获的,程序收到这个信号后,一定会退出。这就是kill -9一定能保证将程序杀死的原因。
关于中断:
参考https://mp.weixin.qq.com/s/pe9dgVLt0qK9lToHwmLXXg
关于短时间内来多个中断,后面的中断能否保存下来的问题。我的理解是保存不了。
有两个做法:
关于CS, IP 和 PC:
CS: code segment代码段寄存器。
IP: instruction pointer指令指针寄存器。
PC: programme counter程序计数器。
代码段CS的偏移量在 IP 寄存器中。CS:IP 就等于PC的值。
数据段DS的偏移量会放在通用寄存器中。
Acronym
ALSA: Advanced Linux Sound Architecture
ASIC:
COW: Copy on write
DCE: digital communication device?
DTE: digit terminal device?
GPIO:
I2C:
IDT: interrupt driven table
OTP: one-time programming
RCU: read-copy-update
SPI: Serial Peripheral Interface
UART:
文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景
文章浏览阅读496次。Zblog是由Zblog开发团队开发的一款小巧而强大的基于Asp和PHP平台的开源程序,但是插件市场上的Zblog采集插件,没有一款能打的,要么就是没有SEO文章内容处理,要么就是功能单一。很少有适合SEO站长的Zblog采集。人们都知道Zblog采集接口都是对Zblog采集不熟悉的人做的,很多人采取模拟登陆的方法进行发布文章,也有很多人直接操作数据库发布文章,然而这些都或多或少的产生各种问题,发布速度慢、文章内容未经严格过滤,导致安全性问题、不能发Tag、不能自动创建分类等。但是使用Zblog采._zblog 网页采集插件
文章浏览阅读2.4k次,点赞2次,收藏2次。restUI页面提交1.1 添加上传jar包1.2 提交任务job1.3 查看提交的任务2. 命令行提交./flink-1.9.3/bin/flink run -c com.qu.wc.StreamWordCount -p 2 FlinkTutorial-1.0-SNAPSHOT.jar3. 命令行查看正在运行的job./flink-1.9.3/bin/flink list4. 命令行查看所有job./flink-1.9.3/bin/flink list --all._flink定时运行job
文章浏览阅读1k次,点赞2次,收藏6次。这个项目是基于STM32的LED闪烁项目,主要目的是让学习者熟悉STM32的基本操作和编程方法。在这个项目中,我们将使用STM32作为控制器,通过对GPIO口的控制实现LED灯的闪烁。这个STM32 LED闪烁的项目是一个非常简单的入门项目,但它可以帮助学习者熟悉STM32的编程方法和GPIO口的使用。在这个项目中,我们通过对GPIO口的控制实现了LED灯的闪烁。LED闪烁是STM32入门课程的基础操作之一,它旨在教学生如何使用STM32开发板控制LED灯的闪烁。_嵌入式stm32闪烁led实验总结
文章浏览阅读63次。本文介绍了安装和部署Debezium的详细步骤,并演示了如何将Debezium服务托管到systemctl以进行方便的管理。本文将详细介绍如何安装和部署Debezium,并将其服务托管到systemctl。解压缩后,将得到一个名为"debezium"的目录,其中包含Debezium的二进制文件和其他必要的资源。注意替换"ExecStart"中的"/path/to/debezium"为实际的Debezium目录路径。接下来,需要下载Debezium的压缩包,并将其解压到所需的目录。
文章浏览阅读4.4k次。需求:在诗词曲文项目中,诗词整篇朗读的时候,文章没有读完会因为屏幕熄灭停止朗读。要求:在文章没有朗读完毕之前屏幕常亮,读完以后屏幕常亮关闭;1.权限配置:设置电源管理的权限。
文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测
文章浏览阅读6.3k次,点赞4次,收藏9次。实训时需要安装SQL server2008 R所以我上网上找了一个.exe 的安装包链接:https://pan.baidu.com/s/1_FkhB8XJy3Js_rFADhdtmA提取码:ztki注:解压后1.04G安装时Microsoft需下载.NET,更新安装后会自动安装如下:点击第一个傻瓜式安装,唯一注意的是在修改路径的时候如下不可修改:到安装实例的时候就可以修改啦数据..._sqlserver 127 0 01 无法连接
文章浏览阅读7.4k次。1. Object.keys(item); 获取到了key之后就可以遍历的时候直接使用这个进行遍历所有的key跟valuevar infoItem={ name:'xiaowu', age:'18',}//的出来的keys就是[name,age]var keys=Object.keys(infoItem);2. 通常用于以下实力中 <div *ngFor="let item of keys"> <div>{{item}}.._js 遍历对象的key
文章浏览阅读2.2w次,点赞51次,收藏310次。粒子群算法求解路径规划路径规划问题描述 给定环境信息,如果该环境内有障碍物,寻求起始点到目标点的最短路径, 并且路径不能与障碍物相交,如图 1.1.1 所示。1.2 粒子群算法求解1.2.1 求解思路 粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。 在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的_粒子群算法路径规划
文章浏览阅读353次。所谓稳健的评估指标,是指在评估的过程中数据的轻微变化并不会显著的影响一个统计指标。而不稳健的评估指标则相反,在对交易系统进行回测时,参数值的轻微变化会带来不稳健指标的大幅变化。对于不稳健的评估指标,任何对数据有影响的因素都会对测试结果产生过大的影响,这很容易导致数据过拟合。_rar 海龟
文章浏览阅读607次,点赞2次,收藏7次。–基于STM32F103ZET6的UART通讯实现一、什么是IAP,为什么要IAPIAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给_value line devices connectivity line devices