parain74
Messages postés26Date d'inscriptionmercredi 26 septembre 2007StatutMembreDernière intervention10 septembre 2008
-
29 janv. 2008 à 11:31
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013
-
30 janv. 2008 à 15:37
Bonjour, j'ai trouvé un programme embarqué afin de tester une ram externe, précisémment une cypress de 128KO pouvez vous m'expliquer le programme silvouplait
/*********Ecriture à toutes les adresses***********************/
/*********Pour vérification de la RAM**************************/
void test_ram_lecture_ecriture(void)
{
__far unsigned char *ram_ptr; //pointeur sur la RAM 128 Ko
unsigned long adr;
unsigned char i;
unsigned int val_1;
unsigned char erreur=0;
/***Ecriture dans la RAM*********************************/
/***à toutes les adresses********************************/
for(adr=0;adr<0x20000;adr++) // toute la RAM 0
{
ram_ptr= (__far unsigned char *) (DEBUT_EXT_RAM + adr);
*ram_ptr=0;
}
i=0;
for(adr=0;adr<0x20000;adr++)
{
ram_ptr=DEBUT_EXT_RAM + (__far unsigned char *)adr; /*Modif LME ajout du (__far unsigned char *) Ecriture à toutes les adresses*/
*ram_ptr=i;
i++;
}
/***Relecture des valeurs ecrites***********************/
/********************************************************/
// test pou détecter un CC ou CO sur une piste d'adresse
for(adr=0;adr<0x20000;adr++)
{
ram_ptr=DEBUT_EXT_RAM + (__far unsigned char *)adr; /*Modif LME ajout du (__far unsigned char *) Ecriture à toutes les adresses*/
*ram_ptr=0; // Toute la RAM à 0
}
adr =1;
i=1; // seules les adresses avec un seul 1 dans l'adresse sont ré-écrit
while(adr<0x20000)
{
ram_ptr=DEBUT_EXT_RAM + (__far unsigned char *)adr; /*Modif LME ajout du (__far unsigned char *) Ecriture à toutes les adresses*/
*ram_ptr=i;
i++;
adr = (adr<<1);
}
/********************************************************************/
/************FONCTION DE TEST DE LA RAM******************************/
/********************************************************************/
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 29 janv. 2008 à 12:09
Salut,
C'est pas très compliqué en plus il y a des commentaires.
Ce programme écrit des données dans la RAM et essaye de les relire ensuite pour s'assurer qu'il n'y a pas eu d'erreur.
Toutes les boucles vont de 0 à 0x20000 ( soit 131072 en décimal car 137072 octets = 128Ko).
Dans la 1ère boucle il va initialiser tous les espaces mémoire a zéro.
Dans la 2ère boucle il va ecrire 1,2,3,4,5,.... dans tous les espaces mémoire de la RAM.
Dans la 3ième boucle il va lire chacun des emplacements mémoire pour voir si ce qui a été ecrit vaut bien 1,2,3,4,5,....
Et ainsi de suite, il va écrire différente donnée en se basant sur certains critères.
La constanteDEBUT_EXT_RAM correspond au premier emplacement mémoire lisible.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 29 janv. 2008 à 14:27
(__far unsigned char *)
permet de caster l'itérateur de boucle "i" en pointeur de type char.
Dans ton exemple on souhaite parcourir chaque zone mémoire de 1 en 1 donc on choisies d'utiliser des char car la taille d'un char vaut 1 octet.
Pour ce qui est de far c'est une vieille convention pascale utilisée sur les systèmes 16bits.