2011-03-01 4 views
0

Ceci est ma première question ici :).vxWorks 6.8 mappage physique à la mémoire virtuelle

J'essaie de tout maintenant la carte mémoire physique à la mémoire virtuelle dans vxWorks 6.8 sans succès, Je suis en train d'utiliser la fonction « VMMap », mais en quelque sorte, il ne cesse de revenir avec:

errno = 0x30065 S_taskLib_NAME_NOT_FOUND .

mon code est:

int page_size=0; 
PHYS_ADDR GPIO_BASE_VIRTUAL_ADDR = 0x40E00000; 
VIRT_ADDR VIRTUAL_ADDR=0; 

page_size =vmPageSizeGet(); 
if((VIRTUAL_ADDR = (VIRT_ADDR)memalign(page_size,page_size*2))==NULL)// allocate 2 pages 
{ 
    printf("error in memalign() errno = 0x%x\n",errnoGet()); 
} 

if(vmMap(NULL,VIRTUAL_ADDR,GPIO_BASE_VIRTUAL_ADDR,(page_size*2))== ERROR) 
{ 
    printf("Error mapping memory errno = 0x%x%\n",errnoGet()); 
} 

Toute aide sera très apprécier, grâce ,

Moshe.

+0

Avez-vous déjà compris? Certaines fonctions de vxWorks ne définissent pas d'erreur lorsqu'elles échouent, vous pouvez donc le mettre à 0 avant d'appeler la fonction pour vérifier si l'errno provient vraiment de vmMap. –

+0

Salut, oui je l'ai résolu, de la même façon pour les deux adresses (0x160 ... et 0x40E ....) dans le fichier syslib.c dans le BSP \t {/ * MAP GPIO */ \t (VIRT_ADDR) 0x40E00000,/* adresse virtuelle */ \t (PHYS_ADDR) 0x40E00000,/* adresse physique */ \t 0x1000, \t \t \t \t \t \t/* longueur, puis état initial: */ \t VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, \t VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT \t}, et virtuel avec la « taille d'allocation » nécessaire et, utilisé le pointeur à l'adresse demandée comme « plat », tout comme est avec les compensations nécessaires. –

Répondre

0

Je vois que vous avez déjà résolu ce problème depuis longtemps, mais je pensais que je laisse quelques miettes de pain pour celui qui d'autre pourrait tomber cette façon dans le futur lointain dim & ..

À moins que vous faites RTPs il y a une bonne chance que votre MMU ne traduit même pas les adresses. Par exemple, si quelque chose apparaît à 0x7fc00400 dans l'espace d'adressage physique, vous pouvez simplement convertir cette valeur en pointeur et l'utiliser.

*((short *) 0x7fc00400) = foo; // write 16 bits! 

Et Oui, ces jours-ci, il est presque sacrilège de penser (ab) en utilisant des pointeurs de cette façon, mais je tiens à souligner que si vous faites VxWorks code espace noyau, vous êtes pratiquement sur le métal nu de toute façon, alors pourquoi pas?

Questions connexes