我在 Workbench3.0 (vxworks 6.6) 下使用 Eigen(3.2.0) 库 . 此发行版中的编译器是 GCC version 4.1.2 .

语言: c++ ;操作系统: winXP

问题代码如下:

Eigen::Matrix3d mOrigin;
/* initial mOrigin */
...
Eigen::Quaterniond qOrigin(mOrigin);

我对程序进行了调试,发现它运行时:

Eigen::Quaterniond qOrigin(mOrigin);

它出现了断言和打印:

断言失败:(reinterpret_cast(array)&0xf)== 0 &&“这个断言在这里解释:”“http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html”“阅读本文网页!!!“在函数Eigen :: internal :: plain_array :: plain_array()[T = double,int Size = 4,int MatrixOrArrayOptions = 0]在C:/WindRiver-GPPVE-3.6- IA评价仪/ VxWorks的6.6 /目标/小时/本征/ SRC /核心/ DenseStorage.h:78

它说,固定大小的可矢量化Eigen对象必须绝对是在16字节对齐的位置创建的,否则解决它们的SIMD指令会崩溃 . 这就是断言产生的原因 .

我认为问题是: Compiler making a wrong assumption on stack alignment http://eigen.tuxfamily.org/dox-devel/group__TopicWrongStackAlignment.html

它说, It appears that this was a GCC bug that has been fixed in GCC 4.5. If you hit this issue, please upgrade to GCC 4.5 and report to us, so we can update this page.

但是,GCC是Workbench的集成编译器,我不知道如何升级它 . 我认为我已经测试了本地解决方案和全局解决方案,但它们不起作用 .

本地解决方案:

添加"attribute((force_align_arg_pointer))"

class Interpolation : public InterpMath/*,public Colleague*/
{
 public:
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
     ...
     __attribute__((force_align_arg_pointer)) ErrorID LineInterp(
            const Position_MCS_rad &targetPoint,
            const Position_MCS_rad &originPoint,
            const Position_ACS_rad &originACS,
            double Ts, double maxVel, double maxAcc,
            double maxDecel, double maxJerk,
            N_AxisSeqPtr &nAglSeqPtr, GrpTcpSeq *pGrpTcp = NULL)
     {
          Eigen::Matrix3d mOrigin;
          /* initial mOrigin */
         ... 
         Eigen::Quaterniond qOrigin(mOrigin);
     }
}

警告:'force_align_arg_pointer'属性指令被忽略

全球解决方案:

添加编译选项-mstackrealign

ccpentium -g -mtune = pentium4 -march = pentium4 -ansi -Wall -MD -MP -Xlinker -mstackrealign -IC:/WindRiver-GPPVE-3.6-IA-Eval/vxworks-6.6/target/h -IC:/ WindRiver -GPPVE-3.6-IA-Eval / vxworks-6.6 / target / h / wrn / coreip -IC:/WindRiver-GPPVE-3.6-IA-Eval/workspace/RobotInterface_2_2/h -DCPU = PENTIUM4 -DTOOL_FAMILY = gnu -DTOOL = gnu -D_WRS_KERNEL -o

那么如何将集成编译器升级到gcc 4.5或更高版本,或者是否有其他解决方案来解决此问题?

感谢您的阅读和帮助 .