跳转到主要内容

ARM Cortex

ARM微处理器核心以及体系结构的发展历史

kelly /

英国的ARM公司是嵌入式微处理器世界当中的佼佼者。ARM一直以来都是自己研发微处理器内核架构,然后将这些架构的知识产权授权给各个 芯片厂商,精简的CPU架构,高效的处理能力以及成功的商业模式让ARM公司获得了巨大的成功,使他迅速占据了32位嵌入式微处理器的大部分市场份额,甚 至现在,ARM芯片在上网本市场的也大有与INTEL的ATOM处理器一较高低的实力。

目前,随着对嵌入式系统的要求越来越高,作为其核心的嵌入式微处理器的综合性能也受到日益严峻的考验,最典型的例子就是伴随3G网络的推广,对手机 的本地处理能力要求很高,现在一个高端的智能手机的处理能力几乎可以和几年前的笔记本电脑相当。为了迎合市场的需求,ARM公司也在加紧研发他们最新的 ARM架构,Cortex系列就是这样的产品。在Cortex之前,ARM核都是以ARM为前缀命名的,从ARM1一直到ARM11,之后就是 Cortex系列了。Cortex在英语中有大脑皮层的意思,而大脑皮层正是人脑最核心的部分,估计ARM公司如此命名正有此含义吧。

<strong> 一.ARMv7架构特点</strong>

下表列出了ARM微处理器核心以及体系结构的发展历史:

详细解读Cortex-A32处理器,打造您的超高能效嵌入式环境

kelly /

Cortex-A32是ARM架构中独一无二的产品,拥有重要地位。Cortex-A32基于ARMv8-A架构,却是针对32位设计的处理器。下图介绍了Cortex-A32与ARMv8-A架构的匹配程度,并与Cortex-A35进行了对比。

<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002722-8836-1.png&q…; alt=""></center>

<center><i>图一:Cortex-A32和ARMv8-A</i></center>

这些Cortex-A处理器支持的指令集,您都知道吗?

kelly /

自25年前ARM1的诞生起,ARM指令集便不断演变。Cortex-A处理器实际支持两个指令集,每个指令集都有各自的扩展。

<strong>ARM指令集 </strong>

ARM指令集基于首款ARM处理器支持的原始指令集。该指令集已经过了数次扩展。简而言之,这是一个负载-存储指令集,拥有不同指令组,主要用于数据处理、存储访问、系统控制和控制流程。现代的ARM指令集非常强大,适用范围非常广泛。在指令集内,所有指令被编码为32位固定长度的字,并且必须与字边界一致。

<strong>Thumb指令集 </strong>

Thumb指令集是ARM指令集的子集,其中每个指令被编码为16位半字,并且必须与半字边界一致。Thumb指令集最初的依据是,在编译高级语言(如C语言)时,减小最常用的指令的大小,从而提高代码密度。由于指令越小,会有更多指令可以汇集在给定的高速缓存,对运行指令的高速缓存就越有利。

<strong>高级SIMD扩展</strong>

高级SIMD扩展也被称为NEON,是一组庞大的指令集,通过扩充寄存器集实现SIMD向量处理能力。

【下载】ARM汇编语言

kelly /

简介:

伪操作又称为伪指令,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。

宏指令是一段独立的程序代码,它通过伪操作来定义。宏通过宏名来调用,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。

<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002605-8356-20c0bf7…; alt=""></center>

ARM中main()和__main() 的区别

kelly /

当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是:

IMPORT main

B main

直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。

在ARM ADS环境中,还另外提供了一套系统级的呼叫机制。

IMPORT __main

B __main

__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。所以说,前者是库函数,后者就是我们自己编写的main()主函数;

因此我们用的B __main其实是执行库函数,然后该库函数再调用我们的main() 函数,因此在单步调试时会看到先要跑一段程序(其实是库函数),然后再单步到我们自己的main函数(这个同时也说明如果有B __main 则就对应必须有main函数,否则编译出错),如果我们用 B main来进入我们的主函数的话,那在单步调试时就看到直接进入到我们自己的main函数了,中间不会看到其他程序;

那么用B __main和用B main 这两这进入我们的main函数方式有什么不同呢?