J'ai l'adresse de la mémoire de certains registres (l'adresse LCDCW1 est en C000).
C codes C: p> Je veux juste écrire des données à ce registre. Les codes ont des problèmes, comment le corriger? P> thx! P> p>
5 Réponses :
Je ne sais pas ce que LCDCW1 signifie, mais d'écrire à une adresse constante: ajuster en fonction (votre registre peut ne pas être intogéré). P> < / p>
En supposant que le registre a la même taille qu'un long code>:
@Mouviciel: Ma solution est tout à fait la même chose, mais il y a une erreur: l'expression du pointeur requise, savez-vous pourquoi?
Les pointeurs à des registres externes doivent être volatile code> qualifié.
@Martin: La réponse de Naveen donne l'explication: vous devez lancer votre valeur entière à un type de pointeur.
Vous pouvez, comme d'autres les suggérons, déclarez un pointeur approprié, c'est-à-dire note que j'ai ajouté le qualificatif code> volatile code>. C'est toujours une bonne idée lors de la lecture ou de l'écriture de registres matériels, car il garantit que chaque accès que vous effectuez dans votre code C apparaît réellement dans le code généré. P> Cependant, je préfère généralement écrire des macros comme ceci p> puis remplissez-les avec les ASM de GCC appropriés. J'aime mieux que l'utilisation directe des pointeurs parce que: p> Dans votre cas, les définitions les plus simples doivent être: p>
ASM code> S, je sais exactement comment j'accélère le registre. Parfois, il existe des instructions spéciales ou des espaces d'adresse nécessaires pour accéder à un registre, qui ne peut généralement pas être généré par le compilateur C. Li>
+1 pour l'utilisation appropriée (et trop souvent négligée) de «volatile».
Voir le commentaire de la planche ci-dessous pour un document intéressant sur la façon dont la plupart des compilateurs échouent à implémenter volatile code> correctement dans divers cas difficiles.
Utilisez uint32_t code> etc. au lieu de
long code>.
@CRAIG: tout à fait à droite. J'ai édité la réponse de manière appropriée.
Oui, un blanc d'blanc Atmel est d'accord avec votre mot pour Word, atmel.com/images/doc8075.pdf < / a>, page 9.
LCDCW1 code> est juste une valeur entière. Vous ne pouvez pas faire
* code> à ce sujet. Vous devez le jeter en Integer (ou vous tapez besoin besoin) Pointeur, puis utilisez-le. Par exemple:
* (int *) lcdcw1 = 0x31; code> p>
Utilisez uint16_t code> etc. au lieu de
int code>.
Je crois qu'un mot de prudence sur l'utilisation du mot clé volatile est en ordre. p>
Parfois (souvent) ce que le compilateur pense que la volatilité signifie que le programmateur a voulu (et inversement). Il est bon de toujours vérifier le code de la machine résultant lorsque le mot clé volatil est utilisé, afin d'éviter les surprises. P>
Pour plus de références, voir par ex. http://www.cs.utah.edu/~regehr/papers /emsoft08-preprint.pdf p>
C'est un très bon papier. Sa technique proposée pour faire du travail volatile de manière fiable dans C compilateurs de C est intéressante, mais je pense qu'ils sont pires d'une perspective de lisibilité que de simplifier une paire de macros de fonctions de lecture / écriture pour chaque registre, comme je le suggère dans ma réponse à ce poste. .
@Andrey: 8051, Compilateur: ICC8051
Le code tel que ne compilera pas car
0xc000 code> n'est pas un pointeur, et l'opérateur
* code> nécessite un opérateur de pointeur.