s100的mcu1上面支持双精度FPU吗

结论

S100 的 MCU1 硬件上支持双精度 FPU(Cortex-R52+ Full Advanced SIMD 配置),但你读取 MVFR0 显示不支持,可能是以下原因之一:


排查步骤

1. 检查读取 MVFR0 的方法

Cortex-R52 的 MVFR0 是 系统控制协处理器 (CP10/CP11) 寄存器,需要正确启用 FPU 访问:

// 确保 FPU 已启用
uint32_t cpacr = __get_CPACR();
cpacr |= (0xF << 20);  // 启用 CP10 和 CP11
__set_CPACR(cpacr);
__DSB();
__ISB();

// 读取 MVFR0
uint32_t mvfr0;
__ASM volatile ("VMRS %0, MVFR0" : "=r" (mvfr0));
printf("MVFR0 = 0x%x\n", mvfr0);

// 检查双精度支持位 [27:24]
// 0b0010 = 支持双精度
uint32_t dp_support = (mvfr0 >> 24) & 0xF;
printf("Double Precision Support: %d\n", dp_support);

2. 检查编译配置

确认编译时启用了正确的 FPU 选项:

# 检查你的编译命令是否包含以下参数
-mcpu=cortex-r52
-mfloat-abi=hard
-mfpu=neon-fp-armv8  # 或 fp-armv8d

如果使用地瓜的 SDK,检查 build_freertos.py 的参数:

# 确认编译配置
python3 build_freertos.py lite matrix B s100 mcu1 gcc release

3. 验证双精度运算

直接测试双精度运算是否正常工作:

#include <stdio.h>

void test_double_fpu() {
    double a = 1.23456789012345;
    double b = 9.87654321098765;
    double c = a * b;
    
    printf("Double test: %.14f * %.14f = %.14f\n", a, b, c);
    
    // 如果结果正确,说明双精度 FPU 正常工作
    // 如果结果是 0 或异常值,说明 FPU 未正确启用
}

4. 检查 ELF 文件属性

查看编译生成的 ELF 文件,确认 FPU 配置:

# 查看 ELF 文件的架构信息
arm-none-eabi-objdump -f your_elf_file.elf

# 查看 section 信息
arm-none-eabi-readelf -A your_elf_file.elf

可能的问题

问题 现象 解决方案
FPU 未启用 MVFR0 读取异常 检查 CPACR 配置
编译器配置错误 双精度运算降级为软浮点 添加 -mfpu=neon-fp-armv8
读取方法错误 MVFR0 值不正确 使用正确的 VMRS 指令

建议

  1. 分享你的测试代码:在帖子中贴出你读取 MVFR0 的代码,方便进一步诊断
  2. 查看官方示例:参考社区版 MCU 代码中的 FPU 初始化部分
  3. 联系官方支持:如果以上步骤都无效,可能是特定固件版本的问题

相关参考帖子: