J'ai travaillé avec beaucoup de matériel, et certains d'entre eux ont des registres "lecture seule" ou "écriture seule" (ou des fonctions différentes selon que vous lisez ou écrivez dans le registre, ce qui est amusant lorsque quelqu'un décide de faire "reg |= 4 ;" au lieu de se souvenir de la valeur qu'il devrait avoir, de mettre le bit 2 et d'écrire la nouvelle valeur, comme vous le devriez. Rien de tel que d'essayer de déboguer un matériel dont les bits apparaissent et disparaissent de façon aléatoire dans des registres que vous ne pouvez pas lire !) Jusqu'à présent, je n'ai pas vu de tentative de blocage des lectures d'un registre en écriture seule, ou des écritures dans des registres en lecture seule.
Au fait, ai-je dit que le fait d'avoir des registres en "écriture seule" est une VRAIE mauvaise idée, parce qu'il n'est pas possible de les relire pour vérifier si le logiciel les a correctement définis, ce qui rend le débogage vraiment difficile - et les personnes qui écrivent les pilotes n'aiment pas déboguer des problèmes difficiles qui pourraient être rendus très simples par deux lignes de code VHDL ou Verilog.
Si vous avez un certain contrôle sur la disposition des registres, je vous suggère de placer les registres "en lecture seule" à une adresse alignée sur 4KB, et les registres "en écriture seule" à une autre adresse alignée sur 4KB [plus de 4KB suffisent]. Vous pouvez ensuite programmer le contrôleur de mémoire du matériel pour empêcher l'accès.
Ou bien, laissez le matériel produire une interruption si des registres qui ne sont pas censés être lus sont lus, ou si des registres qui ne sont pas censés être écrits sont écrits. Je présume que le matériel produit des interruptions à d'autres fins ?
Les autres suggestions faites à l'aide de diverses solutions C++ sont bonnes, mais elles n'empêchent pas vraiment quelqu'un qui a l'intention d'utiliser les registres directement, donc si c'est vraiment une question de sécurité (plutôt que "rendons les choses plus difficiles"), alors vous devriez avoir du matériel pour vous protéger contre l'utilisation abusive du matériel.
0 votes
Vous avez aussi des registres de lecture-écriture, non ?
9 votes
Je doute sérieusement que vous puissiez le faire en C. En C++, par contre, vous devriez pouvoir le faire relativement facilement.
1 votes
@dasblinkenlight En C et en C++, la seule solution est la discipline. Écriture
*p = ...
o... = *p
est toujours plus court et plus tentant que d'écrire et d'utiliser des macros, fonctions ou classes spéciales (éventuellement des classes de modèles).3 votes
@Alexey Pas vraiment. Jetez un coup d'œil à la réponse de Jerry.
6 votes
@dasblinkenlight Eh bien, en C, vous pourriez les cacher derrière un pointeur opaque avec des fonctions de lecture/écriture bien définies.
2 votes
@KonradRudolph Comme je l'ai dit, il faut écrire cela et s'en tenir à l'utiliser. C'est ça la discipline.
0 votes
GiacomoTesio : Seuls quelques-uns savent lire et écrire. J'essaie d'être proactif et de faire en sorte que le compilateur signale les registres en écriture seulement que quelqu'un lit.
0 votes
Thomas Matthews, ok. J'ai fait une réponse très rapide et sale.
2 votes
@Alexey Je ne vois pas où vous voulez en venir. C'est autant de discipline que d'utiliser
int
au lieu destd::string
: aucune, vraiment. Une fois que vous avez déclaré vos variables du type approprié, le compilateur s'assure que vous ne les utilisez pas mal.2 votes
Je pense avoir compris et être d'accord avec Alexey et Konrad. Alexey a raison de dire qu'on ne peut pas empêcher la possibilité qu'il soit lu - comme dans le cas de
const
la correction, tout ce que vous faites est plutôt une garantie souple, qui est à un typecast ou une mauvaise déréférence de pointeur d'être cassé. D'un autre côté, Konrad et d'autres ont raison de dire que l'on peut construire des abstractions qui rendent cela moins probable - les pointeurs intelligents en C++, les fonctions d'accès et les types incomplets en C, etc.0 votes
@AlexeyFrunze : Qui sont ces gens qui écrivent du code pour cette plateforme qui ne comprennent pas que certains registres sont en lecture/écriture seulement et ne peuvent pas saisir rapidement les modèles présents dans la base de code actuelle ? De telles personnes ne devraient probablement pas assurer la maintenance de ce système. Lorsque vous écrivez du code pour de petites plateformes de niche, vous prenez le temps de comprendre ce que vous faites.
1 votes
En C, le code source est en écriture seule, pas les données.
2 votes
@EdS. Ces personnes sont des débutants, des professionnels et tous ceux qui se trouvent entre les deux. Bien que je sois plutôt du côté des professionnels, il m'arrive de faire des erreurs stupides qui me coûtent jusqu'à une heure de débogage. Cela arrive.
0 votes
@AlexeyFrunze : Bien sûr, mais il est difficile d'imaginer qu'ils ne reprendraient pas rapidement les modèles utilisés un peu partout.
0 votes
Veuillez excuser mon ignorance totale, mais quel serait l'intérêt d'un registre à écriture seule ?
1 votes
@MikeyCee : Convertisseur numérique-analogique (DAC), LED, LCD, registre de transmission UART, tout ce qui doit être contrôlé ou réglé mais qui ne l'est pas. besoin de pour être relu.