2017-07-21 2 views
2

J'ai juste essayé d'allouer une instance qui contient Eigen :: Matrix à la mémoire partagée de Xenomai.Comment faire pour l'allocation de l'emplacement Eigen :: Matrix à la mémoire partagée (ou Heap)?

unsigned char * mem; //shared memory pointer 
Robot * robot = new ((void *)(mem+ROBOT_ADDR)) Robot(); 

La classe Robot contient plusieurs Eigen :: Matrix. Cependant, je ne peux pas allouer d'objet robot dans ma mémoire partagée.

Mais l'allocation de base fonctionnait bien ci-dessous.

Robot * robot = new Robot(); //work well! 

Le journal d'assertion est:

Eigen :: :: interne plain_array :: plain_array() [avec T = deux; int Taille = 36; int MatrixOrArrayOptions = 0]: Assertion `(reinterpret_cast (eigen_unaligned_array_assert_workaround_gcc47 (tableau)) & 0xf) == 0 & & "cette affirmation est expliquée ici:" "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html"" **** LIRE CETTE PAGE WEB !!! ****"' échoué.

J'ai déjà vérifié la page Web dans le journal. Mais il n'y a pas de solution pour mon cas.

Comment faire pour l'allocation d'emplacements Eigen :: Matrix to Shared Memory (ou segment spécifique défini par l'utilisateur)?

Répondre

2

Selon la page Web liée:

taille fixe objets vectorisable Eigen doivent impérativement être créés à des emplacements alignés 16 octets, sinon des instructions SIMD les traitant se bloque.

Le problème est donc que mem+ROBOT_ADDR n'est pas aligné sur 16 octets. Vous devez vous assurer que c'est.

+2

Une autre solution consiste à utiliser des types non alignés comme: 'Matrix ' au lieu de 'Matrix4f'. – ggael

+1

Je l'ai résolu pour utiliser '__attribute__ ((aligné 16))'. Merci XD – Dayamre