这可以更快地完成吗?

标签 c performance

我有一个函数可以获取一些通过 DMA 通过 SPI 接收的数据。为了提高通过 SPI 传输时的速度,三个 10 位数据被打包成一个 32 位字(具有两个填充位)。收到后,我需要将其解压缩回三个 16 位字(十个实际数据位和六个填充位)。

这个函数被经常调用,所以任何速度优化都会大大缩短整体执行时间。它在 STMicro Cortex M3 上运行,使用 IAR EWARM 7.10 作为编译器,优化设置为高,针对速度进行了优化。

    /*******************************************************************************
    * Function Name  : Unpack
    * Description    : the previous adc sample has been
               DMA'd into an array
               unpack each 32 bit transfer into 3, 10bit samples
              ( low 16 spi word ) ( high 16 spi word )
              { p15 p14 ch1_9:0 ch2_9:0 ch3_9:0 } 32 bit packing

    * Input          : output buf 16 bit word (10 bit adc, right justified)
               input buf 32 bit data
               count in 32 bit input words

    * Output         : None.
    * Return         : None.
    *******************************************************************************/
    void Unpack( u16* pDest, u16* pSrc, u16 packed32_count)
    {
       u16 i;
       u32 n;
       u16 dest_index = 0;
       u16 src_index = 0;

       for ( i = 0; i < packed32_count ; i++ )
       {
          n = pSrc[src_index]; //get high 16
          n <<= 16;
          n |= pSrc[src_index+1]; //get low 16
          src_index+=2;

          pDest[dest_index+2] = n & 0x3ff;
          n >>= 10;
          pDest[dest_index+1] = n & 0x3ff;
          n >>= 10;
          pDest[dest_index] = n & 0x3ff;
          dest_index+=3;
       }
    } 

最佳答案

下面的代码不多,但它可能比上面的代码更快。您也可以尝试使用影响速度的优化进行编译。

void Unpack( u16* pDest, u32* pSrc, u16 packed32_count)
{
    int i;
    u32 val;

    for(i = 0; i < packed32_count; i++)
    {
        val = pSrc[i];
        pDest[2] = val & 0x3ff;
        pDest[1] = (val >> 10) & 0x3ff;
        pDest[0] = val >> 20;
        pDest += 3;
    }
}

关于这可以更快地完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24910227/

相关文章:

css - 浏览器何时会下载样式表中定义的背景图像?

java - 访问静态字段: caching handles locally

java - 什么时候应该和不应该为了速度/性能而脱离 OOP?

c - 运行时错误 : signed integer overflow: 99998 * 100000 cannot be represented in type 'int' [solution. c]

java - 来自 C++ 的 JNI 调用、FindClass 和导入

C 预处理器语法

c - 如何用一些逻辑初始化全局?

c - 如何找到这个的输出?

android - KitKat 在第一次调用时比 Froyo 多花 6 秒对 TextToSpeech.speak() 使用react

performance - 分母已知时更快的整数除法?