[résolu] question bête sur un pointeur..

question bête sur un pointeur.. [résolu] - C - Programmation

Marsh Posté le 09-11-2011 à 11:19:35    

Hello,
 
voilà ma situation. J'ai 128 MB de DDR3 situés de l'adresse 0x0 à l'adresse 0x07ffffff et 128 kB de SRAM situés de l'adresse 0x8000000 à l'adresse 0x0801ffff.
 
Le code de mon programme démarre sur la SRAM et je veux parcourir ma DDR. Je fais alors un truc du genre :

Code :
  1. volatile int * mem = (int *) malloc(1);
  2. printf("start mem = %p\n\n",mem); // j'ai en général qqch qui vaut à peu près 0x0f00
  3. // je suppose, mais j'en sais rien du tout, que les adresses au dessous sont réservées..
  4. while ((unsigned int)mem < 0x08000000) {
  5. *mem = 0x55555555;
  6. if(*mem != 0x55555555) {
  7.  printf("problem 5 at address %p\n", mem);
  8. }
  9. *mem = 0xaaaaaaaa;
  10. if(*mem != 0xaaaaaaaa) {
  11.  printf("problem a at address %p\n", mem);
  12. }
  13. mem++;
  14. }
  15. free((int *)mem);
  16. printf("memory test passed\n" );

Ce code fonctionne bien et j'ai mon memory test passed qui s'affiche, mais toutefois, j'ai systématiquement une erreur à la fin du test pour une adresse qui vaut étrangement 0xaaaaaaaa.  

problem 5 at address 0xaaaaaaaa
problem a at address 0xaaaaaaaa
memory test passed

Cependant, c'est normal qu'il n'arrive pas à lire à cette adresse vu qu'elle n'existe pas.
 
Est-ce que quelqu'un pourrait m'expliquer pourquoi mem prend la valeur 0xaaaaaaaa avant de quitter ma boucle while ?
 
merci d'avance.
 
Abaddon2002


Message édité par abaddon2002 le 09-11-2011 à 13:32:06
Reply

Marsh Posté le 09-11-2011 à 11:19:35   

Reply

Marsh Posté le 09-11-2011 à 13:23:25    

Ton code me semble correct...
 
Par contre, rien à voir avec ton problème, mais pourquoi tu utilise un malloc? Si ton code est en SRAM tu peux sans te poser de question balayer ta DDR de 0 à son adresse max.
 
Deuxième remarque: évite les cast quand ils ne servent à rien.


---------------
sheep++
Reply

Marsh Posté le 09-11-2011 à 13:23:59    

Bon en fait j'ai trouvé... c'était bête..
 
Je ne sais pas pourquoi mais si j'affiche cela :

Code :
  1. printf("problem 5 at address %p\n", &mem);

à la place de cela :

Code :
  1. printf("problem 5 at address %p\n", mem);

J'ai bien l'adresse qui s'affiche et qui est inférieure à 0x08000000. Mon octet qui posait problème était du au fait que j'avais dans mon code une autre variable de 8 bits déclarée à cet endroit.. En la commentant pour faire mon test, tout se passe correctement.
 
edit:
 
pour les casts, c'est parce que sinon j'ai des warnings et la compilation s'arrête (j'utilise l'option -Werror de gcc) sinon j'ai regardé, les adresses 0x0 à 0x1f sont réservées pour le boot, et après oui, que j'utilise un malloc ou pas ça ne change rien... je peux affecter directement une adresse au pointeur sans problèmes..


Message édité par abaddon2002 le 09-11-2011 à 13:27:13
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed