CH32V203 TempSensor_Volt_To_Temper函数耗时

/*********************************************************************

 * @fn      TempSensor_Volt_To_Temper

 *

 * @brief   Internal Temperature Sensor Voltage to temperature.

 *

 * @param   Value - Voltage Value(mv).

 *

 * @return  Temper - Temperature Value.

 */

s32 TempSensor_Volt_To_Temper(s32 Value)

{

    s32 Temper, Refer_Volt, Refer_Temper;

    s32 k = 43;


    Refer_Volt = (s32)((*(u32 *)0x1FFFF720) & 0x0000FFFF);

    Refer_Temper = (s32)(((*(u32 *)0x1FFFF720) >> 16) & 0x0000FFFF);


    Temper = Refer_Temper - ((Value - Refer_Volt) * 10 + (k >> 1)) / k;


    return Temper;

}

这个读取单片机内部温度,执行上感觉太耗时了,这个能再优化一下吗?

您好,该函数应该没有再优化的空间了。此外需要注意内部温度传感器一般适用于检测温度的一个变化,若要精确测量环境温度或工作温度,建议使用外置温度传感器。


为了优化你给出的 TempSensor_Volt_To_Temper 函数,首先需要考虑RISC-V单片机的特点,包括指令集、寄存器使用和数据访问速度。以下是一些可能的优化策略:

  1. 减少不必要的计算:我们可以将常量计算移到函数外部或进行简化,避免在每次调用时都重复计算。

  2. 使用位操作简化代码:对于某些计算,可以使用位移代替乘法和除法。

  3. 减少内存访问:确保对内存的访问尽可能少,尤其是在嵌入式系统中。

以下是经过优化的代码示例:

s32 TempSensor_Volt_To_Temper(s32 Value) {    // 定义常量
    const s32 k = 43;    
    // 读取参考电压和温度
    const u32 *refData = (u32 *)0x1FFFF720;
    s32 Refer_Volt = (s32)(*refData & 0x0000FFFF);
    s32 Refer_Temper = (s32)((*refData >> 16) & 0x0000FFFF);    // 计算温度
    s32 deltaVolt = Value - Refer_Volt; // 先计算电压差
    s32 Temper = Refer_Temper - ((deltaVolt * 10 + (k >> 1)) / k); // 使用预先计算的deltaVolt

    return Temper;
}

优化说明:

  1. 常量定义:将常量 k 定义为 const 类型,表明其值不会改变,这样编译器可能会做出更好的优化。

  2. 减少内存访问:通过引入 const u32 *refData,减少了对 0x1FFFF720 的多次访问。

  3. 计算顺序:在计算温度时,先计算电压差 deltaVolt,这样在后续计算中只需引用一次,便于提高可读性和性能。

  4. 位操作:保持原有代码中的位操作以确保代码的高效性。

这种优化方法在RISC-V架构上应该有良好的性能表现,同时保持了代码的清晰性和可维护性。你可以根据特定的编译器和架构进一步微调。

这个是openai的回复,编译后的比之前的大4个字节,执行效率是不是会高写?我还没实测。


看汇编


在哪里可以看到编译生成的汇编文件?翻了一遍没看到,只看到.o文件。


您好,如下图,可通过lst文件查看

image.png


只有登录才能回复,可以选择微信账号登录