技术标签: 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:
文章浏览阅读2.4k次,点赞2次,收藏8次。URL部分和URL预览填写为目标(需要爬取数据的网址)的URL地址。第三部找到User-Agent的value复制。就可以在Excel表格里看到想要的数据了。1、在Excel里数据里打开自网站。命令超时选择1分钟即可。HTTP请求标头参数。_excel爬虫
文章浏览阅读198次。不过类似的提示词在GPT4模型下直接使用并不能产生类似的结果,GPT4使用的是ChatCompletion,可以在System Message里或者JSON格式的User Message里带更多的上下文信息过去,在这个案例里GPT4过于智能的将两个表进行了交叉查询,看到网上有其他开发人员使用了JSON解析的方法来拼出SQL文,有机会可以尝试。###创建SQL查询问题:Dear, 210430预计什么时间有货可发?###创建SQL查询问题:Dear, 210430预计什么时间有货可发?_chatcompletion azure
文章浏览阅读8.3k次,点赞2次,收藏19次。某天登陆服务器后连接oracle数据库时,突然提示磁盘控件不足,导致sqlplus 登陆失败,提示如下图: 通过命令 df -lh /opt/oracle查看oracle安装目录所在磁盘空间,发现确实已使用100%,如下图: oracle安装目录所在磁盘整个大小才20G,为了一劳永逸,果断准备将oracle系统表空间的数据文件迁移到其他磁盘。此时处理思路应该是先关闭oracle服务,然..._oracle的链接数占满sqlplus无法登陆进去怎么处理的
文章浏览阅读1.3w次。进入容器docker exec -it mysql /bin/bash修改配置文件执行一下命令cd /etc/mysqlvi my.cnf#在最后添加:skip-grant-tables #在启mysql时不启动grant-tablesmy.cnf 文件内容# Copyright (c) 2014, 2015, Oracle and/or ..._docker 查看mysql 密码
文章浏览阅读4.1k次。因为网络问题,常常拉不下来(github上的一般能拿下来),所以用国内的一个工具来获取第三方库.gopm:https://gopm.io/1. 拿 github上的包:(前提是安装git)go get -u github.com/gpmgo/gopm稍微等一会儿,然后就可以看到它为我做了几件事:在GOPATH下生成了E:\GoProjects\src\gi..._go get github
文章浏览阅读1.2w次,点赞45次,收藏262次。深度学习是机器学习的分支,大语言模型是深度学习的分支。机器学习是人工智能(AI)的一个子领域,它的核心是让计算机系统能够通过对数据的学习来提高性能。在机器学习中,我们不是直接编程告诉计算机如何完成任务,而是提供大量的数据,让机器通过数据找出隐藏的模式或规律,然后用这些规律来预测新的、未知的数据。深度学习是机器学习的一个子领域,它尝试模拟人脑的工作方式,创建所谓的人工神经网络来处理数据。这些神经网络包含多个处理层,因此被称为“深度”学习。_大语言模型相关ppt
文章浏览阅读199次。Hi,各位同学好呀,这里是M学姐!今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的勤工助学管理系统】学姐根据实现的难度和等级对项目进行评分(最低0分,满分5分)难度系数:3分工作量:5分创新点:3分界面美化:5分界面美化的补充说明:使用vue的基本都能达到5分本项目完成于2022年6月份,包含内容 : 源码 + 论文 + 答辩PPT在开放的互联网平台面前,勤工助学管理系统的信息管理面临着巨大的挑战。传统的管理模式局限于简单数据的管理,无法适应不断变化的市场格局。_ssm+vue勤工助学
文章浏览阅读334次,点赞5次,收藏5次。分布式锁的设计和实现是一个复杂但至关重要的课题,不同的实现方式各具优势,根据系统的实际需求和现有技术栈选择合适的分布式锁方案至关重要。在分布式系统中,由于数据分散存储在不同的节点上,当多个节点同时对同一资源进行操作时,如果没有有效的协调机制,就可能出现并发控制问题,导致数据的不一致和冲突。使用setnx命令尝试设置一个唯一的key-value对,key通常与待保护的资源相关联,value可以是线程ID或随机生成的UUID,如果设置成功,则认为获取到了锁。
文章浏览阅读597次。ThinkServer_TD340_RAID及系统安装Lenovo ThinkServer TD340 RAID及系统安装前言:Lenovo ThinkServer TD340随机配备导航盘,其RAID及系统安装有两种方式可选:导航盘方式和传统方式。导航盘方式较为简洁,且在系统安装完成后无需再进行驱动安装,其驱动已集成在导航盘上,如以此方式安装按导航盘引导进行即可,在此不做详细介绍;传统方式..._联想服务器td340u盘安装win2008
文章浏览阅读2.1w次,点赞2次,收藏5次。方式一:/*** 将字符串的编码格式转换为utf-8** @param str* @return Name = new* String(Name.getBytes("ISO-8859-1"), "utf-8");*/public static String toUTF8(String str) {if (isEmpty(str)) {return "";}try {if (str.equals(n..._字符串转utf-8
文章浏览阅读10w+次,点赞691次,收藏4k次。手把手教你使用YOLOV5训练自己的目标检测模型大家好,这里是肆十二(dejahu),好几个月没有更新了,这两天看了一下关注量,突然多了1k多个朋友关注,想必都是大作业系列教程来的小伙伴。既然有这么多朋友关注这个大作业系列,并且也差不多到了毕设开题和大作业提交的时间了,那我直接就是一波更新。这期的内容相对于上期的果蔬分类和垃圾识别无论是在内容还是新意上我们都进行了船新的升级,我们这次要使用YOLOV5来训练一个口罩检测模型,比较契合当下的疫情,并且目标检测涉及到的知识点也比较多,这次的内容除了可以作为大家_搭建yolo目标检测的环境. 使用yolo-air模块来做实验
文章浏览阅读6k次,点赞10次,收藏81次。网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…最常用的打包命令是 tar,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命令通常都是以 .tar 结尾的。_linux系统基本操作命令