Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM Cortex-M4 C代码中高效的嵌入式不动点2x2矩阵乘法_C_Embedded_Cortex M - Fatal编程技术网

ARM Cortex-M4 C代码中高效的嵌入式不动点2x2矩阵乘法

ARM Cortex-M4 C代码中高效的嵌入式不动点2x2矩阵乘法,c,embedded,cortex-m,C,Embedded,Cortex M,我正在尝试用C代码实现一个非常高效的2x2矩阵乘法,用于ARM Cortex-M4中的操作。该函数接受3个指向2x2数组的指针,2个用于乘法输入,以及using函数传递的输出缓冲区。这是我到目前为止所拥有的 static inline void multiply_2x2_2x2(int16_t a[2][2], int16_t b[2][2], int32_t c[2][2]) { int32_t a00a01, a10a11, b00b01, b01b11; a00a01 = a[0

我正在尝试用C代码实现一个非常高效的2x2矩阵乘法,用于ARM Cortex-M4中的操作。该函数接受3个指向2x2数组的指针,2个用于乘法输入,以及using函数传递的输出缓冲区。这是我到目前为止所拥有的

static inline void multiply_2x2_2x2(int16_t a[2][2], int16_t b[2][2], int32_t c[2][2])
{
  int32_t a00a01, a10a11, b00b01, b01b11;

  a00a01 = a[0][0] | a[0][1]<<16;
  b00b10 = b[0][0] | b[1][0]<<16;
  b01b11 = b[0][1] | b[1][1]<<16;
  c[0][0] = __SMUAD(a00a01, b00b10);
  c[0][1] = __SMUAD(a00a01, b01b11);

  a10a11 = a[1][0] | a[1][1]<<16;
  c[1][0] = __SMUAD(a10a11, b00b10);
  c[1][1] = __SMUAD(a10a11, b01b11);
}
static inline void multiply_2x2_2x2(int16_t a[2][2]、int16_t b[2][2]、int32_t c[2][2])
{
int32_t a00a01、a10a11、b00b01、b01b11;

a00a01=a[0][0]|a[0][1]您可以打破严格的混叠规则,使用
int16_t*
to
int32_t*
typecast将矩阵行直接加载到32位寄存器中第一个主要问题是
一些有符号的\u int我非常怀疑
没有
静态的
无效内联的
是你想要的。不要使用
内联的
。我认为功能是你可以在汇编中编写它。这些CMSIS例程会有帮助吗?另外,既然你有M4,FPU有很多寄存器sters…将两个源加载到寄存器中,然后使用FPU,然后保存。我不知道转换是否会影响您的计时。我不会为2D索引而烦恼…只要获取您想要的int。@aMike:不是每个Cortex-M4都有FPU。
typedef union
{
  int16_t  i16 [2][2];
  uint32_t u32 [2];
} mat2x2_t;
static uint32_t mat_mul16 (mat2x2_t a, mat2x2_t b)
{
   uint32_t c0 = __SMUAD(a.u32[0], b.u32[0]);
   ...
}