Как исправить неправильное выравнивание стека с помощью библиотеки 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 или новее, или есть ли другое решение, чтобы решить эту проблему?
Спасибо за чтение и помощь.