Embedded STM32上的Eigen仅在达到一定大小时才起作用 我试图在STM32 F4发现嵌入式板上使用EGEN C++库,在将来执行一些矩阵运算,特别是对传感器数据进行卡尔曼滤波。p> 我尝试链接到标准C++库,甚至尝试用g++arm编译器编译程序。 typedef特征::矩阵矩阵x10d; Matrix10d mat1=Matrix10d::常数(10,10,1); Matrix10d mat2=Matrix10d::常数(10,10,2); 矩阵运算结果; 结果=mat1*mat2;

Embedded STM32上的Eigen仅在达到一定大小时才起作用 我试图在STM32 F4发现嵌入式板上使用EGEN C++库,在将来执行一些矩阵运算,特别是对传感器数据进行卡尔曼滤波。p> 我尝试链接到标准C++库,甚至尝试用g++arm编译器编译程序。 typedef特征::矩阵矩阵x10d; Matrix10d mat1=Matrix10d::常数(10,10,1); Matrix10d mat2=Matrix10d::常数(10,10,2); 矩阵运算结果; 结果=mat1*mat2;,embedded,eigen,stm32,bad-alloc,chibios,Embedded,Eigen,Stm32,Bad Alloc,Chibios,如果矩阵大小设置为7,我可以编译相同的代码。如果我跨越了这个界限,那么代码将无法编译,并且eigen会给我一个警告 warning: argument 1 value '4294967295' exceeds maximum object size 2147483647 这些是我收到的部分错误消息 n function 'throw_std_bad_alloc, inlined from 'check_size_for_overflow at bla/bla/Eigen/src/Cor

如果矩阵大小设置为7,我可以编译相同的代码。如果我跨越了这个界限,那么代码将无法编译,并且eigen会给我一个警告

warning: argument 1 value '4294967295' exceeds maximum object size 2147483647
这些是我收到的部分错误消息

n function 'throw_std_bad_alloc,
    inlined from 'check_size_for_overflow at bla/bla/Eigen/src/Core/util/Memory.h:289:24
下面是我正在使用的链接器脚本中的内存分配

/*
 * STM32F407xG memory setup.
 * Note: Use of ram1 and ram2 is mutually exclusive with use of ram0.
 */
MEMORY
{
    flash0  : org = 0x08000000, len = 1M
    flash1  : org = 0x00000000, len = 0
    flash2  : org = 0x00000000, len = 0
    flash3  : org = 0x00000000, len = 0
    flash4  : org = 0x00000000, len = 0
    flash5  : org = 0x00000000, len = 0
    flash6  : org = 0x00000000, len = 0
    flash7  : org = 0x00000000, len = 0
    ram0    : org = 0x20000000, len = 128k      /* SRAM1 + SRAM2 */
    ram1    : org = 0x20000000, len = 112k      /* SRAM1 */
    ram2    : org = 0x2001C000, len = 16k       /* SRAM2 */
    ram3    : org = 0x00000000, len = 0
    ram4    : org = 0x10000000, len = 64k       /* CCM SRAM */
    ram5    : org = 0x40024000, len = 4k        /* BCKP SRAM */
    ram6    : org = 0x00000000, len = 0
    ram7    : org = 0x00000000, len = 0
}
我正在运行STM32F4发现板,但配置没有改变

# Stack size to be allocated to the Cortex-M process stack. This stack is
# the stack used by the main() thread.
ifeq ($(USE_PROCESS_STACKSIZE),)
  USE_PROCESS_STACKSIZE = 0x400
endif
更新

我再也不能重现这个错误了。可悲的是,我没有做任何事情来解决这个问题

arm-none-eabi-gcc -c -mcpu=cortex-m4 -O3 -Os -ggdb -fomit-frame-pointer -falign-functions=16 -ffunction-sections -fdata-sections -fno-common -flto -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -Wall -Wextra -Wundef -Wstrict-prototypes -Wa,-alms=build/lst/ -DCORTEX_USE_FPU=TRUE -DCHPRINTF_USE_FLOAT=TRUE -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -MD -MP -MF .dep/build.d -I.
以上是我正在使用的编译器选项,如果有人感兴趣的话

现在我甚至可以把20x20矩阵相乘而不出任何问题

Matrix20d mat1=Matrix20d::常数(20,20,2);
//将矩阵与向量相乘。
Vector20d向量=Vector20d::常数(20,1,2);
矢量20d结果;
systime_t startTime=chVTGetSystemTimeX();
结果=mat1*vec;
//计算时差
systime_t endTime=chVTGetSystemTimeX();
systime\u t时差=chTimeDiffX(开始时间、结束时间);
chprintf(chp,“乘法所用的时间(毫秒):%d\n”,(int)时差);
chprintf(chp,“系统时间:%d\n”,开始时间);
chprintf(chp,“系统时间结束:%d\n”,结束时间);
chprintf(chp,“向量中的值:\n[”);
对于(Eigen::Index i=0;i
进行上述计算大约需要1毫秒

我想我的编译器可能有问题。所以我尝试了两个版本的编译器

版本-1

版本2


您可以指定您使用的是哪种确切的MCU吗?似乎您将内存过度分配为10*10*4=400,乘以2会将800字节转换为0x320,这可能比您的堆还要多。因此,请同时包括您的链接器文件和chibios内存区域分配。@TarickWelling谢谢。我正在使用STM32F4发现板来完成这个项目。@the_parzival没有回答Tarick的问题。他问的是MCU,不是电路板。即使如此,在任何情况下都会有多个STM32F4发现板。@在诊断中发布的所有信息都很重要。警告应该包括它引用的代码的文件名和行号,但出于我无法理解的原因,您选择忽略该信息。此外,您还通过发布“部分”错误消息省略并截断了其他诊断。你为什么要那样做!?可能是一个复制品。您正在使用哪些编译器选项?您使用的是什么版本的Eigen?什么版本的GCC?请注意,该问题是如何发布整个诊断信息的,您在其中省略了它,从而隐藏了重要的诊断信息。在这种情况下,我通过谷歌搜索你发布的警告片段的文本找到了它——对于这种不寻常的东西,总是值得一试。
arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 7-2017-q4-major) 7.2.1 20170904 (release) [ARM/embedded-7-branch revision 255204]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437]
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.