RA8Cortex-M85Helium入门指南(2)

原创 瑞萨MCU小百科 2024-05-15 12:02



前篇回顾

● RA8 Cortex-M85 Helium入门指南(1)


Helium指令集

这里介绍的是Helium的汇编语言指令集,虽然大部分程序员不会直接使用这些指令,而是通过C语言或者高级语言编程实现,但是了解汇编语言指令集,可以有如下收获:

  • 在优化C代码时,为了确定其是否被充分地矢量化,能够审视编译器的输出以及熟悉指令集是非常有帮助的。

  • 当调试不能正常工作的代码时,通过阅读反汇编代码去理解每一行发生了什么,对于寻找代码的问题是非常有用的。

  • 了解指令集可能有助于编写高效的代码,甚至节省功耗,尤其是在使用原语函数的情况下。


Helium指令结构和其他Cortex-M处理器中的VFP(浮点)指令结构是相似的。


Helium指令格式如下:


Helium指令都是以字母V开始的,然后跟着如下符号,符合中的{}是可选的,<>是必须出现的:

  • mod:指令修饰符,可能没有,也可能是Q(saturating)饱和,H(halving)减半,D(doubling)加倍,R(rounding)四舍五入中的一个。

  • op:具体操作,例如ADD(相加),SUB(相减),CMP(比较)等。

  • shape:有些指令中,可以选择性的指定L(long)或N(narrow),这是 “形态” 相关的修饰符。

    - L:Long表示输入元素在操作前会被扩宽。1个8位的元素可能会被扩宽为16位或32位,或者1个16位元素被扩宽为32位。

    - N:Narrow表示输入元素在操作前会被压缩。

  • extra:有些指令中的特定修饰符,可能是T(top),B(bottom),A(accumulate),X(exchange)或者V(across)中的一个。

  • cond:此处指定的条件仅适用于VPT(Predication)模块。可能是T(Then)或者E(Else)。

  • .dt:数据类型,可能是F(float)浮点,I(integer)整数,S(signed)有符号,U(unsigned)无符号。

  • dst:目标寄存器,可以是通用寄存器(R)或者矢量寄存器(Q)。

  • src:源寄存器,可以是通用寄存器(R)或者矢量寄存器(Q)。

  • rot:旋转,用于一些操作复数的指令。


下面给出一条指令示例展示:

VLDRW.U32 Q0, [R0] 


该指令中的首字母是V,表示这是一条Helium(或是Neon,或者浮点)指令,LDR表示寄存器从内存加载内容,W表示按字大小操作,都为空,数据类型是U32,无符号32位整数。加载的目标是128位寄存器Q0(矢量寄存器),源是标量寄存器R0指向的内存地址。该指令表示将从R0存储的地址中加载4个32位宽的数据到Q0寄存器中。


Helium指令分类如下:


Helium编程方式

  Helium编程方式目前来说,一共4种。

  • 矢量库

  • 自动矢量化

  • 原语函数(intrinsics)编程

  • 汇编指令编程


矢量库

目前,ARM CMSIS DSP和NN是已经对Helium优化好的Helium矢量库。使用矢量库来进行Helium编程,是最简单的方法。

  • CMSIS DSP是数字信号处理函数库,具有针对8位整数,16位整数,32位整数和32位浮点数的不同函数,提供了丰富的函数,包括基本数学函数,复数数学函数,滤波器函数,变换函数,矩阵操作函数,电机控制函数,插值函数,统计函数等。该库包含了这些函数的Helium优化版本,并不断更新迭代中。

  • CMSIS NN是神经网络函数库,以最小的内存开销针对Cortex-M处理器优化的软件内核,同样地,这些函数也可以利用Helium得到最优性能。


CMSIS矢量库中的函数代码有3个C预处理器定义来选择Helium版本。

#define ARM_MATH_HELIUM#define ARM_MATH_MVEI       //支持整型Helium#define ARM_MATH_MVEF       //支持浮点型Helium


比如CMSIS DSP中的 arm_clip_f32函数,可以看到该函数已经使用了Helium原语函数。


比如CMSIS NN中的arm_nn_lstm_update_cell_state_s16函数,可以看到该函数使用了Helium原语函数。


当使用矢量库的时候,不同编译器中的MVE设置


Keil MDK 5(5.38以上版本)


在图标“Options for target”中选择“Target”页面中的“Vector Extensions”,通过下拉列表选择

  • “Not Used”(不使用helium,即宏ARM_MATH_HELIUM没有被定义,使用标量相关函数)。

  • “Integer”(宏ARM_MATH_HELIUMARM_MATH_MVEI被定义,使用整型Helium)。

  • “Integer + Floating Point” (宏ARM_MATH_HELIUMARM_MATH_MVEIARM_MATH_MVEF被定义,使用整型和浮点型Helium)。


IAR EWARM(v9.40.1以上版本)


通过右键选择项目名称后,在 “Options”中的“General Options”页面下的“32-bit”中的“Advanced SIMD(NEON/HELIUM)”。

  • 勾选(即选中,ARM_MATH_HELIUMARM_MATH_MVEIARM_MATH_MVEF被定义,使用整型和浮点型Helium)。

  • 不勾选(即不选中),编译的时候会报“MVE support not enable”错误。


e2 studio


e2 studio中可以使用LLVM或者GCC工具链,在使用矢量库的时候,不需要设置,默认是启用的。如果通过设置编译参数来禁用,编译的时候会报“MVE support not enable”错误。


自动矢量化

自动矢量化就是编译器在C/C++代码中自动检测到可以使用Helium指令并执行优化的过程。优化后的代码在速度和尺寸方面可能与手工优化的汇编代码或包含原语函数的C代码一样高效,这只需要很少的时间去编写和调试代码,而且无须对目标微架构有详细了解。C代码也更有可移植性。


如下面的代码,这是一种很常见的普通写法,一个for循环里面做一些逻辑判断处理。

左右滑动查看完整内容

点击可查看大图


通过使用自动矢量化后的反汇编代码如下,红色框部分的代码里面已经出现了Helium的汇编指令。


自动矢量化和编译器的优化等级设置有关,当Arm Complier 6和LLVM编译器的优化等级为-O2或者更高时,自动矢量化默认使能,在MDK Arm Complier 6中可以使用“-fno-vectorize”选项可以禁止自动矢量化。当优化等级为-O1时,自动矢量化默认禁止,使用“-fvectorize”选项可以使能自动矢量化,当优化等级为-O0时,自动矢量化总是被禁止。其他编译器的行为可能不同,具体可以查阅对应的文档。


原语函数(intrinsics)编程

原语函数是允许利用Helium而不必直接编写汇编代码的一组C/C++函数。ACLE文档中包括Helium原语规范。目前最新的文档为mve-2021Q4。原语函数的实现包含在arm_mve.h文件中。函数包含简短的汇编语言部分,它们被内联到调用的代码中。


ACLE文档

https://github.com/ARM-software/acle/releases/tag/r2023Q2


使用原语函数有如下优点:

  • 程序员能够直接访问Helium指令集,这允许编写充分优化的代码,利用所有Helium特性。

  • C/C++可用于大多数代码,只有当需要优化而矢量化C编译器无法执行优化时,才会使用Helium原语。这就意味着只有在必要时才使用底层代码。

  • 相比于采用汇编语言编写的代码,含有Helium原语的C和C++代码可以移植到一个新的平台,仅需要少量修改,甚至无须修改。

  • 使用原语避免了很多与直接使用汇编语言编码相关的难点。


完整的指令列表详见:

https://developer.arm.com/architectures/instruction-sets/intrinsics/


原语函数中,Helium矢量数据类型名字模式如下所示,这在“arm_mve.h”中有详细定义和描述。

x_t

  • type:元素类型,可能是int整形,uint无符号整形,float浮点。

  • size:元素大小,可能是8位,16位,32位。

  • number_of_lanes:通道总数。可以是16通道,8通道,或者4通道。

如:

uint8x16_t是一个描述16个无符号8位的矢量。

int16x8_t是一个描述8个16位的矢量。

float16x8_t是一个描述4个16位浮点数(半精度)的矢量。

float32x4_t是一个描述4个32位浮点数(单精度)的矢量。


注:Helium是128位寄存器,它的元素大小和通道总数相乘的结果只能是128,不能是64,也就是说,不支持int8x8_t/uint8x8_t/int16x4_t/uint16x4_t/float16x4_t/float32x2_t数据类型。这点和Neon是不同的。Neno可以支持64和128。


Helium矢量数组结构体类型如下:

xx_t

可以发现,矢量数组结构体名字只比单个矢量数据类型多了一个length_of_array。它表示一共有几个helium寄存器组成,即helium寄存器的数量。在该结构体中,包含一个名为val的元素,此结构体类型映射Helium加载和存储操作访问的寄存器,Helium可以用一条指令加载/存储多达4个寄存器。结构定义示例如下:

struct int16x8x2_t

{

int16x8_t val[2];

};


此结构类型仅由加载、存储、转置、交织和去交织指令使用;要对实际数据执行操作,请从各个寄存器中选择元素。如:.val[0] 和.val[1]。


下图代码片段是使用原语函数进行矢量相乘的例子。


原语编程里面还涉及原语预测,原语尾部处理等知识,本处不在展开说明,详细信息可以访问arm官网查阅相关文档了解和学习。


汇编语言编程

在汇编代码中直接编写Helium指令是很没有必要的,通常只会在特殊的场景下才会这样做。即当编程人员可以比编译器更好地分配寄存器时,比如有太多重写变量和输入输出变量。


下图所示为复数矢量点积的汇编语言代码。


需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/



未完待续


推荐阅读

“芯” 高度 • “芯”赋能——瑞萨电子RA8高算力MCU产品介绍

解决方案 | 瑞萨RA8D1&RA8M1产品方案分享

解决方案 | 基于RT-Thread&OpenMV的RA8人机交互方案

更多精彩,敬请关注

评论
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 73浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 70浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 86浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 101浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 171浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 105浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 68浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 41浏览
  • 在电子技术快速发展的今天,KLV15002光耦固态继电器以高性能和强可靠性完美解决行业需求。该光继电器旨在提供无与伦比的电气隔离和无缝切换,是现代系统的终极选择。无论是在电信、工业自动化还是测试环境中,KLV15002光耦合器固态继电器都完美融合了效率和耐用性,可满足当今苛刻的应用需求。为什么选择KLV15002光耦合器固态继电器?不妥协的电压隔离从本质上讲,KLV15002优先考虑安全性。输入到输出隔离达到3750Vrms(后缀为V的型号为5000Vrms),确保即使在高压情况下,敏感的低功耗
    克里雅半导体科技 2024-11-29 16:15 128浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 86浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 170浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 45浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 52浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 106浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 71浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦