我在 Workbench3.0(vxworks 6.6)下使用 Eigen(3.2.0)库。此发行版中的编译器是 GCC版本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()[with T = double,int Size = 4,int MatrixOrArrayOptions = 0] at C:/WindRiver-GPPVE-3.6-IA-Eval/vxworks-6.6/target/ H /本征/ SRC /核心/ DenseStorage.h:78
它说,固定大小的可矢量化Eigen对象必须绝对在16字节对齐的位置创建,否则解决它们的SIMD指令将崩溃。这就是断言产生的原因。
我认为问题是: 编译器对堆栈对齐做出错误的假设 http://eigen.tuxfamily.org/dox-devel/group__TopicWrongStackAlignment.html
它说,看来这是一个已在GCC 4.5中修复的GCC错误。如果您遇到此问题,请升级到GCC 4.5并向我们报告,以便我们更新此页面。
但是,GCC是Workbench的集成编译器,我不知道如何升级它。 我认为我已经测试了本地解决方案和全球解决方案,但它们不起作用。
添加" __属性__((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或更高版本,或者是否有其他解决方案来解决此问题?
感谢阅读和帮助。