Как исправить неправильное выравнивание стека с помощью библиотеки Eigen в Workbench3.0 (vxworks 6.6 IDE)

Я использую библиотеку Eigen(3.2.0) в Workbench3.0 (vxworks 6.6). Компилятор в этом дистрибутиве - GCC версии 4.1.2.

Язык: с ++; Операционная система: 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 " " **** ПРОЧИТАЙТЕ ЭТУ ВЕБ-САЙТ PAGE!!! **** "в функции Eigen::internal::plain_array::plain_array() [с T = double, int Size = 4, int MatrixOrArrayOptions = 0] в C:/WindRiver-GPPVE-3.6-IA-Eval/ VxWorks-6.6/ цель / ч / Эйген / SRC / ядро /DenseStorage.h:78

он сказал, что векторизуемые собственные объекты фиксированного размера должны быть обязательно созданы в 16-байтовых выровненных местах, в противном случае SIMD-инструкции, обращающиеся к ним, потерпят крах. И именно поэтому возникает утверждение.

Я думаю, что проблема заключается в следующем: компилятор делает неверное предположение о выравнивании стека http://eigen.tuxfamily.org/dox-devel/group__TopicWrongStackAlignment.html

он сказал: " Похоже, что это была ошибка GCC, которая была исправлена ​​в GCC 4.5. Если вы столкнулись с этой проблемой, обновитесь до GCC 4.5 и сообщите нам, чтобы мы могли обновить эту страницу.

Тем не менее, GCC является компилятором интеграции Workbench, и я не знаю, как его обновить. И я думаю, что я проверил Local Solution и Global Solution, но они не работают.

Местное решение:

добавить "__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 -DTOOL = -D_WRS_KERNEL -o

Итак, как я могу обновить компилятор интеграции до gcc 4.5 или новее, или есть ли другое решение, чтобы решить эту проблему?

Спасибо за чтение и помощь.

0 ответов

Другие вопросы по тегам