技术标签: 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:
文章浏览阅读206次。项目运行环境配置:Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs。项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。推荐pycharm社区版;_分销系统开源 python
文章浏览阅读230次。Docker启动时报错:We could not resolve DockerHub using DNS.解决方法:依次检查Firewalld、NetWorkManager、selinux的状态,并关闭关闭Firewalldsystemctl status firewalldsystemctl stop firewalldsystemctl disable firewalld..._unable to retrieve dockerhub
文章浏览阅读79次。题目链接:https://vjudge.net/problem/LightOJ-12131213 - Fantasy of a SummationPDF (English)StatisticsForumTime Limit:2 second(s)Memory Limit:32 MB...
文章浏览阅读4.1k次。swiper 前进后退按钮的显示和隐藏鼠标进入和离开时,前进后退按钮显示和隐藏<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://unpk_swiper隐藏箭头显示
文章浏览阅读3k次。字符串Go语言中的字符串是通过UTF-8编码,字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 。字符串底层结构是一个起始地址和长度(字节个数)字符串转义符Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等转义符含义/r回车符/n换行符/t制表符/’单引号/"双引号//反斜杠例如://打印一个Windows平台下的一个文件路径package mainimport ( "_go .new.string(
文章浏览阅读3.6k次。python爬虫基本概述一、爬虫是什么二、爬虫可以做什么三、爬虫的分类四、爬虫的基本流程一、爬虫是什么 网络爬虫(Crawler)又称网络蜘蛛,或者网络机器人(Robots). 它是一种按照一定的规则, 自动地抓取万维网信息的程序或者脚本。换句话来说,它可以根据网页的链接地址自动获取网页 内容。如果把互联网比做一个大蜘蛛网,它里面有许许多多的网页,网络蜘蛛可以获取所有网页 的内容。 爬虫是一个模拟人类请求网站行为, 并批量下载网站资源的一种程序或自动..._爬虫脚本是干什么的
文章浏览阅读2.1k次,点赞4次,收藏6次。自然常数小趣事宇宙第一公式:欧拉公式伯努利微积分_数学之美 常数e
文章浏览阅读1.2w次,点赞30次,收藏363次。记录下201电赛F题的openmv 和 K210巡线吧,当时是借鉴了网上有个老哥的想法,也找不到是那个老哥了,抱歉了。本人菜鸟一枚,大佬们有不对的地方请指出。_k210 vs openmv
文章浏览阅读2.8k次。#include #include #include #include #include #include #include #define GETADR(n,str) (str *) calloc (n,sizeof(str)) // 申请N个指定字符串长度的地址#define W16 16 #define C16 32 unsigned char bi
文章浏览阅读410次,点赞4次,收藏6次。上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。
文章浏览阅读114次。原文:C# “贝格尔”编排法采用“贝格尔”编排法,编排时如果参赛队为双数时,把参赛队数分一半(参赛队为单数时,最后以“0”表示形成双数),前一半由1号开始,自上而下写在左边;后一半的数自下而上写在右边,然后用横线把相对的号数连接起来。这即是第一轮的比赛。第二轮将第一轮右上角的编号(“0”或最大的一个代号数)移到左角上,三轮又移到右角上,以此类推。即单..._c# 贝格尔编排算法
文章浏览阅读286次。静态网站的编写主要是用 HTML DⅣV+ CSSJS等来完成页面的排版设计,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉导航栏、鼠标划过效果等知识点,学生网页作业源码,制作水平和原创度都适合学习或交作业用,记得点赞。 精彩专栏推荐 【作者主页——获取更多优质源码】 【web前端期末大作业——毕设项目精品实战案例(1000套)】 旅游景_北京理工大学首页设计源码