在线时间4749 小时
UID3441752
注册时间2017-11-21
NXP金币82850
TA的每日心情 | 开心 2025-7-11 08:53 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 39276
- 最后登录
- 2025-7-21
|
低成本高性能的 I.MXRT1010
建立在 Cortex-M7内核上的第一颗跨界I.MXRT1050,消除了对外围器件架构的需求。例如,片内完全集成的电源管理功能DC-DC转换器消除了对外部电源PMIC专用芯片的需求。512 KB-2MB的片上SRAM意味着可以消除外部DRAM,从而进一步降低总的器件成本。此外,片上Flashless的闪存不仅可以实现更高的操作频率,还可以将i.MX RT的成本降低到只有竞争对手MCU成本的一小部分。在系统级,通过使用标准片外NOR闪存进行数据存储,降低了总体BOM成本。与集成片上闪存相比,片外闪存编程更快、更便宜。由于直接编程的简单性,标准片外闪存的编程速度更快,例如,与片上集成嵌入式闪存MCU相比,编程一个外部2MB串行闪存可以快60%。与更复杂的多引脚数的 MCU相比,外部闪存的使用也简化并降低了编程设备的成本,因为外部闪存器件的引脚数量更少,已经可以同质替换的选择余地更大。
即使将外部闪存(8-16MB)的成本包括在i.MX RT1050的成本中,i.MX RT1050的CM/$价值比竞争对手高出3-5倍。
在40nm工艺的 i.MX RT1010 家族中有许多智能的外设,500 MHz Arm® Cortex®-M7 内核,具有如下特性:
16 KB L1 指令缓存
8 KB L1 数据缓存
支持 VFPv5架构的全浮点 FPU (单精度)
支持 Armv7-M Thumb 指令集
集成 MPU, 最多 16 个独立的保护区
总共 128 KB I-TCM 和 D-TCM
紧耦合的 (TCM) 内存,CPU可以单周期的访问 TCM,可以实现很高的性能。如何在I.MX RT1010上使用FPU乘法指令。在Kinetis Cortex-M4F上,浮点单元被激活,然后2个浮点因子被传递给一个汇编函数,该函数使用FPU乘法指令VMUL将寄存器S0、S1中的值相乘,并将乘积返回给调用函数。
只要编译器设置正确,所有可以用FPU指令完成的操作都应该自动完成。检查在编译C文件时看到的编译器标志包括
-mfloat-abi=hard -mfpu=fpv5-d16
并在反汇编模式下检查一些代码,以确认它是否如所期望的那样工作。另外,在代码中使用强制转换时也要小心,以确保计算中使用的类型与预期的一样——看看Eric Styger对Cortex-M4F上的FPU操作的讨论,不要忘记,i.MX RT中双精度的FPU在做非控制类型时不会受到相同的影响。
虽然编译器可能会利用FPU的启动代码来启用它,否则第一次访问将失败,但是大多数启动代码都会默认启用它。在不需要FPU操作的产品中(并且适当地通知编译器不要使用硬件的FPU方法),可以禁用FPU并改善中断延迟,因为需要保存的寄存器更少-这意味着启动代码最好是有条件的,即开发人员是否有意使用硬件的FPU,或者开发人员倾向于避免它,以便在一个主要是整数的环境中从改进的中断响应时间中获益。
在不带FPU的CPU中有两种算法。一种是使用性能很低的软件浮点库。另一种是使用定点数据。以IAR为例,如果在不带FPU的CPU上编译以下C代码并启用硬件的浮点库,编译器生成的代码如图所示。可以看到用浮点函数模拟的整数运算。
float32_t f1 = 3.14; float32_t fr = 2.1234; float32_t fs;
fs = f1*fr*fr;
如果在CPU集成FPU的项目里面编译代码,代码类似如下形式:
可以参考编译器选项帮助文档来配置使用S/W浮点库和使能硬件的浮点库。作为定点的数据,可以访问 Fixed-point arithmetic - Wikipedia, https://en.wikipedia.org/wiki/Fixed-point_arithmetic。在 CMSIS DSP 源代码库中实现了不同的数据类型。为了使用 powf(), expf()浮点函数,不需要特殊的ewl库,可以使用系统默认的,使能FPU的方法如下:
; Enable the floating point coprocessor
#if defined (_VFPv4_)
MOVW r1,#60808 ; load CPACR
MOVT r1,#57344 ; (0xE000ED88)
LDR r0,[r1]
ORR.W r0,r0,#VFPEnable ; Enable FPU
STR r0, [r1] ; on CP10, CP11
MOV.W r0,#R2N_Enable
VMSR FPSCR, r0
#endif
另外,编译器中使能的方法如下:在预编译器中定义如下的宏:
__VFPV4__
在文件__arm_eabi_init.c中包含 __fp_init() ,初始化这个就可以使能FPU。当然做浮点运算有可能消耗的Stack会更大,因此有必要需要修改栈的大小。
如果是使用的MDK的环境使能硬件的FPU,在 Options for Target - Target - Floating Point Hardware中可以进行配置。
这个里面有3个下拉选项:不使用,使用单精度的,使用双精度的。在选择 "Floating Point Hardware" 选项后,MDK 配置相应的 C/C++ 选项和链接器选项,用于 Options for Target - C/C++ - Compiler control string 和 Options for Target - Linker - Linker control string。
选择 "Not Used"--cpu=Cortex-M7添加到编译器和链接器选项:对于这个--cpu选项,选项 --cpu=Cortex-M7 --fpu=SoftVFP 被无保留定义,这意味着只有软件浮点支持,被浮点库fplib执行浮点操作时才被选中。
选择"Use Single Precision",--cpu=Cortex-M7.fp.sp 财务报表向编译器和链接器添加了选项:对于这个--cpu选项,选项--fpu=FPv5 SP是无保留定义的,这意味着硬件浮点单元的选择符合FPv5体系结构的单精度变量。
选择"Use Double Precision",--cpu=Cortex-M7.fp.dp向编译器和链接器添加了选项:对于这个--cpu选项,选项--fpu=FPv5 DP是无保留定义的,这意味着硬件浮点单元的选择符合FPv5体系结构的双精度变量。
而且,针对CMSIS库,在系统启动文件里面调用 SystemInit() 来使能 FPU。
- #if (__FPU_USED == 1) // Keil
- /* enable FPU if available and used */
- SCB->CPACR |= ((3UL << 10*2) | /* set CP10 Full Access */
- (3UL << 11*2) ); /* set CP11 Full Access */
- #endif
复制代码
由于一些额外的浮点处理指令添加到FPv5(Contex-M7 Floating-Point Extension),可以支持单精度和双精度的浮点,可以提升浮点处理的效率,也可以指定一些特定的浮点,诸如 FPv4 用于单精度浮点操作,为了实现这个操作,需要指定 --fpu=FPv4-SP 选项,诸如 --cpu Cortex-M7.fp.sp --fpu=FPv4-SP,它操作由--cpu=namepoption定义的任何FPU选项。
|
|