我在 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或更高版本,或者是否有其他解决方案来解决此问题?
感谢您的阅读和帮助 .