嵌入式学习之初探

举报
ReCclay 发表于 2022/02/22 01:01:39 2022/02/22
【摘要】 推荐一篇博文:完全看懂ARM处理器,言简意赅,基本上都提到了! 1、嵌入式处理器内核的分类 按照字长可以分为:8/16/32/64 位结构 按照存储可以分为:冯诺依曼和哈佛(程序和数据分开存储...

推荐一篇博文:完全看懂ARM处理器,言简意赅,基本上都提到了!

1、嵌入式处理器内核的分类

按照字长可以分为:8/16/32/64 位结构
按照存储可以分为:冯诺依曼和哈佛(程序和数据分开存储)结构
按照指令集可以分为:CISC、 RISC结构

CISC(complex instruction set computer 复杂指令集)
RISC(reduced instruction set computer 精简指令集)

更多深入戳这里

RISC–加载/存储型的,数据处理类的指令仅能处理寄存器中的数据。
无论是对外部设备还是对系统存储器的访问都需要加载/存储指令来完成。


2、IP

IP地址分为A类、B类、C类三个基本类。另外两类分别为组播地址和备用地址(C类和D类)。

C类IP地址范围192.0.0.1 ~ 223.255.255.254

第1、2、3字节为网络地址,第四个字节为主机地址。

C类地址数量较多,使用于局部局域网中,每个网络中最多包含254台计算机。


3、ARM 和 Cortex

ARM7-冯诺依曼结构
Cortex - M3系列是哈佛结构

Cortex 系列分为A-R-M
A系列是面向尖端虚拟内存的操作系统和用户应用。
R系列是针对实时系统
M系列是对微控制器

ARM7 ≠ ARMv7

ARMv7是一种构架。ARM7是一种处理器型号,ARM7是在ARMv4构架上设计出来的处理器


ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构。

ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统,因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间。ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。


ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。

到了ARMv7架构的时候开始以Cortex来命名,并分成Cortex-A、Cortex-R、Cortex-M三个系列。


所以看上去ARM7跟Cortex-M很像,因为他们都是MCU,但确是不同代不同架构的MCU(Cortex-M比ARM7高了三代!),所以性能也有很大的差距。此外,Cortex-M系列还细分为M0、M3、M4和超低功耗的M0+,用户依据成本、性能、功耗等因素来选择芯片。


4、关于指令集

Thumb其实就是阉割版的ARM指令集,16位
Thumb-2指令集是兼容32位与16位指令的;ARM指令集不兼容,如需用到16位,得需要告诉编译器,我要用16位的了
这样来理解更好,Thumb指令集是16位的,ARM指令集是32位的,中间有Thumb-2作为桥接。


ARM处理器有三种工作状态:

1、ARM状态 (指令宽度32)

2、Thumb 及 Thumb-2状态 (前者指令宽度16,后者指令可以32也可以16)(指令宽度小了,也就意味着代码密度要大于ARM状态了,但是存储空间小)

3、调试状态

关于Thumb状态和ARM状态的切换方法:
通过BX指令,写数据到操作数寄存器的最低位。

R0[0]=1 –从RAM状态切换到Thumb状态。
R0[0]=0 –从Thumb状态切换到RAM状态。

还有一个知识点就是ARM处理器复位后的状态都是ARM状态

对了,
关于RAM处理器,Cortex-M系列(ARMv7架构)的指令集只有Thumb-2。


5、ARM的几个常见寄存器

CPSR (Current program status register)

CPSR(当前程序状态寄存器)在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位

通过写入不同值切换到不同的模式,模式有7种。

用户模式:user
快速中断模式 – FIQ
外部中断模式 – IRQ
管理模式 – SVC
终止模式 – ABT
未定义指令模式 – UND
系统模式 – SYS

SPSR

每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。由于用户模式和系统模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。

R13寄存器组

就Cortex-M3来说,拥有R0-R15的寄存器组。其中R13作为堆栈指针SP。SP有两个,分别为R13(MSP)和R13(PSP)即主堆栈指针(MSP)和进程堆栈指针(PSP),但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。这些寄存器都是32位的。


6、冯诺依曼结构和哈佛结构

总体可以这样理解:

冯诺依曼,是一种程序指令储存和数据储存在一起的存储器结构
哈佛结构,是一种将程序指令储存和数据储存分开的存储器结构

更多详情戳这里


7、ARM的七种模式

用户模式(User,usr) 正常程序执行的模式

快速中断模式(FIQ,fiq)用于高速数据传输和通道处理

外部中断模式(IRQ,irq)用于通常的中断处理

特权模式(Supervisor,svc)供操作系统使用的一种保护模式

数据访问中止模式(Abort,abt)用于虚拟存储及存储保护

未定义指令中止模式(Undefined,und) 用于支持通过软件方针硬件的协处理器

系统模式(System,sys) 用于运行特权级的操作系统任务


8、启动文件不能省

在启动文件中我们可以做任何事情,但是通常我们可以做这些:
改变程序大小端排序,
关闭看门狗,
屏蔽中断,
设置各个时钟,
设置从SLEEP或者IDLE启动时的程序,
初始化SDRAM,
设置各模式指向的堆栈,
设置好中断向量表,
判断是从NOR还是NAND FLASH启动,
将文件拷到SDRAM中,


以上也说明了为什么需要一个汇编写的启动文件

设置各个模式下的SP指针以及初始化中断向量的跳转(ARM的中断较多设置也较灵活)也只有汇编干比较合适了。甚至在SOC(片上系统)中每个任务都有自己的堆栈,所以改变堆栈指针的那一部分程序也是放在汇编里做的。总之了解启动文件是一个非常好的切入点。


9、大小端存储

汗颜,,以前专门查过一波(戳这里),现在又忘得差不多了,看来知识真的是得常实践啊~~~~

所谓的大端模式就是,低地址存储高位字节。
所谓的小端模式就是,低地址存储低位字节。


10、立即数

汇编语言中中操作数有三种:寄存器操作数、存储器操作数和立即数。
其中立即数相当于高级语言中的常量(常数),它是直接出现在指令中的数,不用存储在寄存器或存储器中的数,如指令ADD AL,06H中的06H即为立即数。


11、ARM常见指令

RAM六大指令集,更多解释戳这里

LDR -> Load
STR -> Storage


— LDR 字数据加载指令(存储器到寄存器的数据传送指令)

— LDRB 字节数据加载指令

— LDRH 半字数据加载指令

— STR 字数据存储指令

— STRB 字节数据存储指令

— STRH 半字数据存储指令


ARM指令中,用于指定位置”1”的指令是:ORR

ORR R0,R0,#3 ; 该指令设置R0的0、1位,其余位保持不变。


12、实时操作系统的特征

异步IO和中断处理能力
任务切换时间和中断延迟时间确定
优先级中断和调度
抢占式调度
内存锁定
连续文件
同步

13、到底是什么叫内核?

典型的单片机程序在程序指针复位后,首先进行堆栈、中断、中断向量、定时器、串行口等接口设置、初始化数据存储区和显示内容,然后就来到了一个监测、等待或空循环,在这个循环中,CPU可以监视外设、响应中断或用户输入。
这段主程序可以看作是一个内核,内核负责系统的初始化和开放、调度其它任务,相当于C语言中的主函数。


现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。


14、同步IO和异步IO

CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO。

在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了。

因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多线程或者多进程来并发执行代码,为多个用户服务。每个用户都会分配一个线程,如果遇到IO导致线程被挂起,其他用户的线程不受影响。

多线程和多进程的模型虽然解决了并发问题,但是系统不能无上限地增加线程。由于系统切换线程的开销也很大,所以,一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降。

由于我们要解决的问题是CPU高速执行能力和IO设备的龟速严重不匹配,多线程和多进程只是解决这一问题的一种方法。


另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。


15、关于存储器必须要知道的知识

RAM 通常又有DRAM和SRAM之分,SRAM较DRAM电路复杂,但是速度更快,高速缓冲区就是典型的SRAM。 SRAM的复杂决定了它做不大,几十K,,,
内存条就是DRAM 内存条就上G了。。。

Flash闪存有两大类,或非型(NOR Flash)和与非型(NAND Flash)。前者以字节为单位进行随机存取,存储在里面的程序(叫”固件”???)可以被CPU执行。后者以页为单位进行存取,速度较前者慢。读出程序或数据时,是先将其预存入RAM,然后才被使用的。虽然速度较慢,但是其寿命,容量成本等方面有很大优势,常用的U盘基本都是NAND Flash。


16、编码

ASCII

ASCII共128个字符,96个可打印字符,32个控制字符。
ASCII是7位编码,但在计算机里用一个字节存放(计算机最基本的存储和处理单位)。每个字节多出的1位在计算机内部常保持为0,在数据传输中是奇偶校验位。

汉字编码

GB2312 – 两字节编码(每个字节最高位默认为1),包含常用的中国汉字和图形符号。 GB18030 –
与国际Unicode相兼容。单字节对应ASCII,双字节对应汉字(GB2312在这完全适用,但是比它范围广),其余四字节对应其他字符。

Unicode

UTF-8 – 单字节可变长编码,单字节向下兼容ASCII,音节文字对应两字节,CJK汉字(china japan koera
中日韩汉字)对应三字节,其余对应四字节。Linux 常用。

UTF-16 – 双字节可变长编码,CJK汉字及常用字符两字节,其余四字节。JAVA .NET 常用。

17、ARM处理器 ≠ ARM处理器核

概念的区分, 处理器核:在某种架构的基础上具有取指令和执行指令的组件。 处理器:
以处理器核为中心,加上MMU,中断控制器,浮点运算器,总线接口等就构成了RAM处理器。

当然了,单独的处理器核也可以作为某一代RAM处理器的。

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/78900848

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。