[C sur µprocesseur] Calcul de bit de parité

Calcul de bit de parité [C sur µprocesseur] - C - Programmation

Marsh Posté le 20-11-2010 à 19:02:57    

Salut les gens
 
Voila une petite question toute simple, je dois réaliser un algo permettant de calculer un bit de parité d'un mot de 8bit.
En fait c'est un projet scolaire, je code un driver pour piloter un Touchpad PS/2.
Bon, le code à l'air de marcher, mais j'ai codé ca à la va vite, et vu que je suis allé limite niveau temps exécution
(mon µcontrolleur est cadencé à 12Mhz - CY8C21234 de Cypress), je voulais savoir si mon code était rapide ou
mal pensé vu que je dois faire pas mal de truc entre deux coups d'horloge.
 
Voila mon code de test (je viens de tester sur mon ordi perso, ca à l'air de marcher):
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef unsigned char BYTE;   // pour tester sur mon PC w/ gcc sans toucher à mon code
  4. #define makeFoo(a)    printf("Word: %#X - Parity bit: %d\n",\
  5.             a, getParityBit(a))
  6. BYTE getParityBit(BYTE foo) {
  7.     BYTE end = 0x01;  // Lookin for a odd parity, set to 0x00 for even parity
  8.     if(foo == 0xFF)   // Gettin (!end) w/ 0xFF without this
  9.         return end;
  10.     while(foo != 0x00) { // Stop lookin for a '1' if we got 0x00
  11.         end ^= foo&0x01; // Gettin the LSB and XORing it w/ 'end'
  12.         foo >>= 1;   // Movin to the next bit
  13.     }
  14.     return end;
  15. }
  16. int main () {
  17.     BYTE word = 0x00;
  18.     do {       
  19.         makeFoo(word);
  20.         word++;
  21.     } while (word != 0x00);
  22.     return 0;
  23. }


 
Merci d'avance


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 20-11-2010 à 19:02:57   

Reply

Marsh Posté le 20-11-2010 à 21:09:20    

Pour aller plus vite, on peut souvent utiliser la parité qui est calculée par le microprocesseur lui-même. C'est le cas avec les micro-processeurs Intel et AMD des PC ordinaires. Pour ce microprocesseur, la doc mentionne la parité, voir http://www.cypress.com/?docID=24689 page 3, mais je ne sais pas s'il s'agit de la même parité.

Reply

Marsh Posté le 21-11-2010 à 02:38:18    

Ouaip j'avais deja été voir du coté de la doc, mais j'ai pas trouvé grand chose. Tu penses que l'API du µprocesseur pourrait avoir une fonction du genre? J'irai faire un tour dans les fichiers .h du projet (IDE : Psoc Designer) lundi quand j'aurai accès à mes fichiers.
 
D'ici là, si quelqu'un a un algo plus rapide que le mien, je suis preneur :)


---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Marsh Posté le 21-11-2010 à 08:49:36    

Code :
  1. int parity(unsigned char b)
  2. {
  3.    b ^= b >> 4;
  4.    b ^= b >> 2;
  5.    b ^= b >> 1;
  6.    return b & 1;
  7. }


Message édité par Un Programmeur le 21-11-2010 à 08:57:07

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-11-2010 à 14:36:13    

Je suppose que tu fait u contrôleur PS2 en bitbang.
Dans ce cas tu va envoyer ta donnée bit par bit. à Chaque bit envoyé tu fait ton XOR, tu te retrouve à la fin avec ta parité.
 
Cela dit, vu la vitesse du PS2, ta méthode fera pas ramer ton µC à 12 MHz...


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

Marsh Posté le 22-11-2010 à 19:53:53    

Avoir un BYTE qui s'apelle word, ça me fait mal à la tête :o
Sinon, si t'as de la place en rom, tu peux précalculer la table sur PC et ensuite le 'calcul' se résume à un accès mémoire.  
Un peu overkill pour une parité, mais souvent utilisé pour les crc ou les fonctions trigo.

Reply

Marsh Posté le 23-11-2010 à 13:28:37    

h3bus a écrit :

Je suppose que tu fait u contrôleur PS2 en bitbang.
Dans ce cas tu va envoyer ta donnée bit par bit. à Chaque bit envoyé tu fait ton XOR, tu te retrouve à la fin avec ta parité.


 
Ouaip je bosse en bitbang (connaissais pas le terme avant :p merci wiki),
OK je pense que ta méthode est pas mal, j'y avais pas pensé vu que je preparais mes paquets bien avant de les envoyer. J'essaie dès que je peux...
 

h3bus a écrit :

Cela dit, vu la vitesse du PS2, ta méthode fera pas ramer ton µC à 12 MHz...


 
Mon problème enfait, c'était juste d'être sur d'avoir le temps de faire tout mes calculs entre 2 fronts d'horloge (au moment ou je suis censé envoyer mes données) mais je pense que de côté là, je suis large, nan?

Citation :

The clock frequency must be in the range 10 - 16.7 kHz.  This means clock must be high for 30 - 50 microseconds and low for 30 - 50 microseconds..  If you're designing a keyboard, mouse, or host emulator, you should modify/sample the Data line in the middle of each cell.  I.e.  15 - 25 microseconds after the appropriate clock transition


 

SquiZZ a écrit :

Avoir un BYTE qui s'apelle word, ça me fait mal à la tête :o
Sinon, si t'as de la place en rom, tu peux précalculer la table sur PC et ensuite le 'calcul' se résume à un accès mémoire.  
Un peu overkill pour une parité, mais souvent utilisé pour les crc ou les fonctions trigo.


 
Ouais, peu après avoir posté, je suis tombé sur cette page http://graphics.stanford.edu/~seander/bithacks.html qui en donnait un exemple  (Compute parity by lookup table), mais ca me paraissait un peu lourd pour calculer la parité d'un un mot de 8bits.


Message édité par utb diablo le 24-11-2010 à 10:55:43

---------------
Au royaume des aveugles, les borgnes sont rois xo0
Reply

Sujets relatifs:

Leave a Replay

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