历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2021年09月22日 | ARM协处理器指令

2021-09-22 来源:eefocus

ARM 微处理器可支持多达 16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略 ARM 处理器和其他协处理器的指令。ARM 的协处理器指令主要用于 ARM 处理器初始化 ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在 ARM 协处理器的寄存器和存储器之间传送数据。 ARM 协处理器指令包括以下 5 条:


CDP 协处理器数操作指令

LDC 协处理器数据加载指令

STC 协处理器数据存储指令

MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令

MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令

......


CP15系统控制协处理器


CP15 —系统控制协处理器 (the system control coprocessor)他通过协处理器指令MCR和MRC提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader时钟初始化用到)


CP15的寄存器只能被MRC和MCR(Move to Coprocessor from ARM Register )指令访问

一些要说明的内容,摘录见下::



Co-processors

There are between zero and three possible co-processors. Most desktop ARM systems do not have logic for external co-processors, so we may either use that which is built into the ARM itself, or an emulated co-processor.

CP15 is reserved on the ARM 3 and later processors for internal configuration, as described in this document.

CP0 and CP1 is used by the floating point system. It may either be an external floating point chip (as used with the ARM 3), hardware built into the processor (as in the ARM 7500FE), or a totally software-based emulation (as with the  FPEmulator  that we all know).

Here is a short exercise for you:


    10 DIM code% 16

    20 P% = code%

    30 [ OPT     3

    40   CDP     CP1, 0, C0, C1, C2, 0

    50   ADFS    F0, F1, F3

    60   MOV     PC, R14

    70 ]

   >RUN

   00008F78                    OPT     3

   00008F78 EE010102           CDP     CP1, 0, C0, C1, C2

   00008F7C EE010102           ADFS    F0, F1, F2

   00008F80 E1A0F00E           MOV     PC, R14

   >

What do you notice?  :-)

 


When the ARM executes a co-processor instruction, or an undefined instruction, it will offer it to any co-processors which may be presently attached. If hardware is available to process the given instruction, then it is expected to do so. If it is busy at the time the instruction is offered, the ARM will wait for it.

If there is no co-processor capable of executing the instruction, the ARM will take its undefined instruction trap, in which case the following will happen:


The PSR and PC are both saved (the method differs for 26 bit and 32 bit ARMs)

SVC mode (26 bit) / UND mode (32 bit) is entered, and the I bit of the PSR is set

The instruction at address &00000004 is executed

This trap may be used to add instructions to the instruction set by emulation, or to implement a software emulation of hardware that isn't fitted. The  Floating Point Emulator  works by doing this.

To return, simply pull the saved PC and PSR (depends on 26/32 bit) and push them to the current PC and PSR, like MOVS PC, R14 in 26 bit systems. This will pick up with the instruction following the one which caused the trap.


All of the co-processor instructions can be executed conditionally. Please note that the conditionals relate to the status of the ARM processor, and not the status of any of the co-processors. This is because the ARM always tries the instruction first, and offers it around and maybe takes the undefined application trap, so the conditions are ARM related.

To make this clearer:


    10 DIM code% 32

    20 P% = code%

    30 [ OPT     3

    40   FLTS    F0, R0

    50   FLTS    F1, R1

    60   FMLS    F2, F0, F1

    70   FIX     R0, F2

    80   MOVS    PC, R14

    90 ]

   100 INPUT "First number : "A%

   110 INPUT "Second number: "B%

   120 PRINT USR(code%)

This probably won't assemble without an enhanced BASIC assembler.

Anyway, you might think the ARM will hand over to the floating point co-processor to do the four FP instructions, then hand back afterwards.

If you did, you would be incorrect!


What actually is executed is:


   MCR     CP1, 0, R0, C0, C0

   MCR     CP1, 0, R1, C1, C0

   CDP     CP1, 9, C2, C0, C1

   MRC     CP1, 0, R0, C0, C2

It is worth pointing out that objasm specifies co-processor registers using the CR notation (ie, CR0 - CR15), which is first defined with the CN directive. It does not appear as if default co-processor instructions are defined in Nick Roberts' ASM, though I've only looked in the instructions at the "defined symbols" section...

Darren Salt's ExtBASICasm provides the register names C0 - C15 to refer to the co-processors. So if any of these examples fail when you try to assemble them, please check what format your assembler provides these instructions.


 


 



MRC

The instruction  MRC  transfers a co-processor register to an ARM register. It takes the form:

   MRC    , , , , ,

The co-processor is denoted in most assemblers by  CPx .

The register    is written to  , using operation  . This may, possibly, be further modified by    and  . For an idea of the sorts of times when this might be necessary, consider instructions of the form  LDR Ra, [Rb], #x . 

The final    may be omitted, as it is in the example, but the other parts of the MRC instruction must be supplied.

 



MCR

The instruction  MCR  transfers an ARM register to a co-processor register. It takes the form:

   MCR    , , , , ,

The co-processor is free to interpret the fields as it desires, but the standard interpretation is that the contents of the ARM register are written to the co-processor register using the operation code given, which may be further modified by the second co-processor register and/or the second operation code.




在U-Boot中我们用到了c7 和 c8这两个协处理器,再来看看MCR的详细用法:



MCR指令:


MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。


指令语法格式:


MCR{}

,< opcode_1>,,,{,}


MCR{} p15,0,,,{,}


其中


指令执行的条件码.当忽略时指令为无条件执行。


协处理器将执行的操作的操作码。对于CP15协处理器来说,永远为0b000,当不为0b000时,该指令操作结果不可预知。


作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中


作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。


两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为为C0,opcode_2为0



    mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */


可以看出,其中


rd为r0=0


CRn为C7


CRm为C7


对于这行代码的作用,以此按照语法,来一点点解释如下:


首先,mcr做的事情,其实很简单,就是“ARM处理器的寄存器中的数据传送到协处理器寄存器中”,


此处即是,将ARM的寄存器r0中的数据,此时r0=0,所以就是把0这个数据,传送到协处理器CP15中。


而对应就是写入到“”这个“目标寄存器的协处理器寄存器”,此处CRn为C7,即将0写入到寄存器7(Register 7)中去。


而上面关于Register 7的含义中也说了,“Any data written to this location will cause the selected cache to be flushed”,即你往这个寄存器7中写入任何数据,都会导致对应的缓存被清空。而到底那个缓存被清空呢,即我们这行指令



mcr p15, 0, r0, c7, c7, 0



起了什么作用呢


那是由“两者组合决定”的。


而此处CRm为C7,opcode_2为0,而对于C7和0的组合的作用,参见上面的那个表中Register 7中的Flash I+D那一行,


当opcode_2为0,CRm为0111=7,就是我们要找的,其作用是“Flush I + D”,即清空指令缓存I Cache和数据缓存D Cache。


根据该表,同理,如果是opcode_2=0,而CRm=0101b=5,那么对应的就是去“Flush I”,即只清除指令缓存I Cache了。


而对应的指令也就是



mcr p15, 0, r0, c7, c5, 0


此注释说此行代码的作用是,清理v3或v4的缓存


其中v4,我们很好理解,因为我们此处的CPU是ARM920T的核心,是属于ARM V4的,而为何又说,也可以清除v3的cache呢?


那是因为,本身这些寄存器位域的定义,都是向下兼容的,参见上面引用的内容,也写到了:


ARM 710


Register 7 - IDC flush (write only)

Any data written to this location will cause the IDC (Instruction/Data cache) to be flushed.


即,对于ARM7的话,你写同样的这行代码



mcr p15, 0, r0, c7, c7, 0


也还是向register 7中写入了数据0,这也同样满足了其所说的“Any data written to this location”,也会产生同样的效果“cause the IDC (Instruction/Data cache) to be flushed”。


同理,可以看出此行是去操作寄存器8,而对应的各个参数为:


rd为r0=0


CRn为C8


CRm为C7


opcode_2为0


对照寄存器8的表:



Register 8 - TLB operations (write only)

Any data written to this location will cause the selected TLB flush operation.


The OPC_2 and CRm co-processor fields select which cache


operation should occur:


Function OPC_2 CRm Data


Flush I + D %0000 %0111 -


Flush I %0000 %0101 -


Flush D %0000 %0110 -


Flush D single %0001 %0110 Virtual address”


其含义为:


向寄存器8中写入数据,会导致对应的TLB被清空。具体是哪个TLB,由opcode_2和CRm组合决定,


此处opcode_2为0,CRm为7=0111b,所以对应的作用是“Flush I + D”,即清空指令和数据的TLB。

推荐阅读

史海拾趣

启珑(CHIPLON)公司的发展小趣事

一次性生成5个关于启珑(CHIPLON)公司在电子行业发展起来的相关故事可能内容过多,我可以先为您提供1个相关故事作为示例,如您满意,我可以继续提供。

启珑微电子推出创新DSP系列

近年来,随着数字技术的飞速发展,电子行业对高性能处理器的需求日益增长。在这一背景下,启珑微电子(CHIPLON)凭借其深厚的技术积累和敏锐的市场洞察力,成功推出了全新的CLM320F28335系列DSP(数字信号处理器)。

这款产品一经发布,就引起了行业内的广泛关注。CLM320F28335系列DSP以其高效的32位RISC-V CPU内核、高精度、低成本、低功耗、高性能以及外设集成度高等特点,迅速在市场中占据了一席之地。与传统的定点DSP相比,这款产品的优势显而易见,尤其是在数据处理和A/D转换方面表现更为出色。

值得一提的是,CLM320F28335系列DSP拥有150MHz的高速处理能力,并配备了32位浮点处理单元,这使其在处理复杂算法和大量数据时能够游刃有余。同时,它还具备6个DMA通道,支持ADC、McBSP和EMIF,以及多达18路的PWM输出,其中有6路为高精度PWM输出(HRPWM),这些特性使其在工业自动化、电机控制等领域具有广泛应用前景。

该产品设计的另一个亮点是,它能够直接PIN对PIN替代国际同类产品,这意味着用户在使用启珑的DSP时,无需更改原有的电路板设计或系统软件,即可实现完全的替代兼容,这一设计无疑大大降低了用户的替换成本和使用难度。

随着CLM320F28335系列DSP的成功推出,启珑微电子在电子行业的地位得到了进一步提升。这一产品的成功,不仅展示了启珑微电子强大的研发实力,也为其在激烈的市场竞争中赢得了更多的市场份额。

若您想要探索更多内容,随时可以继续输入。

Automatic Connector公司的发展小趣事

在电子连接器行业,品质是决定企业生死存亡的关键。Automatic Connector公司深知这一点,因此在生产过程中严格执行品质管理标准。公司引进了先进的生产设备和质量检测仪器,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的售后服务体系,及时解决客户在使用过程中遇到的问题。凭借卓越的品质和优质的服务,Automatic Connector赢得了客户的信赖和好评。

台湾奇力(Chip)公司的发展小趣事

奇力公司自创立之初,就致力于LED芯片的研发与生产。在技术积累方面,奇力公司不断引进先进的生产设备和技术人才,通过自主研发和合作创新,不断提升产品性能和质量。随着技术的突破,奇力公司逐渐在LED芯片市场上崭露头角,以其亮度高、性能稳定的产品赢得了客户的信赖。

Ho Chien Electronics Group Inc公司的发展小趣事

奇力公司自创立之初,就致力于LED芯片的研发与生产。在技术积累方面,奇力公司不断引进先进的生产设备和技术人才,通过自主研发和合作创新,不断提升产品性能和质量。随着技术的突破,奇力公司逐渐在LED芯片市场上崭露头角,以其亮度高、性能稳定的产品赢得了客户的信赖。

Alpha (Taiwan)公司的发展小趣事

面对全球环保意识的日益增强,Alpha (Taiwan)公司积极响应号召,致力于绿色电子产品的研发和生产。公司投入大量资金研发环保材料和技术,成功推出了一系列绿色环保电子产品。这些产品不仅具有优异的性能,而且在使用过程中对环境的影响较小,符合现代社会的环保理念。此外,公司还积极参与环保公益活动,宣传环保知识,推动电子行业的绿色发展。

微芯(CMOSIC)公司的发展小趣事

在21世纪初,由一群资深的留学归国科学家组成的团队在深圳创立了微芯生物。他们专注于创新药物研发,特别是在小分子药物领域。初创期,公司面临技术难题和资金压力,但他们凭借对技术的执着和深厚的专业背景,成功研发出多款具有突破性的新药候选物,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

(转载)我的通信的人生

当凯旋的时候 毕业了,嘲笑般的风声向我耳朵边刮来,顿时愣了,大学毕业了,多年经营不起的创业梦接近尾声,走向人生打工路开始了,毕业那晚,很多朋友都去聚会了,只有我和伙伴在商讨放弃多年心血,第二天早上,收拾了包袱,告别了朋友,各奔东西 ...…

查看全部问答>

数值计算中Bcd码校验电路的分析与设计

校验原理  在计算机得数值计算中,数值经常是以Bcd码表示的十进制进行运算的。即一位BCD码用4位二进制位表示。但是BCD的加法需要两个加法器来完成,如果分析一下BCD数的加法过程,原因就很清楚。请看下面:   令A=1000,B=0111,这两个数都是正 ...…

查看全部问答>

关于rt12864显示问题

现有一块12864液晶,显示基本上成功,可以显示预先设定的字符串,字符,但无法显示不确定的float类型值。 如a=12.5554或者其他什么值,求高手一段程序,或指点一二。…

查看全部问答>

DDK 中内存操作函数

      请问各位大虾,我想在我的驱动中加上处理内存的IRP,就是可以写内存,和读内存,要用什么DDK函数,我想给上层调用通过一个地址,就可以读出内存的值。AP通过一个地址和值,调用驱动就可以写内存。…

查看全部问答>

高分在线等:u口的条形码扫描仪设备驱动问题!!!

我们公司有个USB接口的条形码扫描仪 领导想让加到现有的设备上,设备用的是Linux2.4的内核 请问,Linux支持这种USB接口的HID设备吗? 重编内核时,我需要加进哪些驱动选项? 请指教,多谢 或者我该哪些思路来驱动这个设备? …

查看全部问答>

此版版主进来下谢谢

我刚发的一个名为“编译内核遇到的问题100分全部家当了”的帖咋没了?在我参与的帖中找到了进去却报错! 在点击 我的帖子 居然没有这个帖!到底咋回事,我的问题急啊!!麻烦找到了帮我弄出来,作为补偿,给我帖置前!谢谢了~100分…

查看全部问答>

角度传感器

本帖最后由 paulhyde 于 2014-9-15 09:44 编辑 哪位大哥大姐用过角度传感器啊,给我讲讲它的原理嘛,要是有资料的话发给我一份嘛,先谢谢了,我的邮箱…

查看全部问答>

北京中电兴发科技有限公司诚聘C++ 、.NET、嵌入式工程师

C++软件工程师 岗位职责: 1、负责智能交通、平安城市、行业信息化高端应用全线产品配套软件平台的研发; 2、参与系统设计及功能架构; 3、编写代码及完成自测; 4、撰写技术文档。 任职资格:  1、计算机 ...…

查看全部问答>

硕数信息多媒体视频解决方案

从电话到电视,从LAN到INTERNET,从微波到数字化通信,人们的生产生活时刻与影像和声音的传递息息相关,传统的信息交流 方式正在因科学技术的飞速发展而发生着巨大的变化。广播电视与通讯两大产业在这样的背景下延伸和发展,而它们之间却因大量的 ...…

查看全部问答>