-1
votes

Comment résoudre MISRA C: 2012 Règle 11.6?

J'utilise l'exemple de microchip échantillon NVMEM.cous Fonction pour écrire des données dans une adresse mémoire particulière du microcontrôleur Pic32. Quand j'essaie de l'utiliser montrant après une erreur MISRA: je viens de poster un exemple de code où j'ai eu une erreur. Mon code entier est compilé et fonctionnant bien.

1] Cast explicite de 'non signé INT' à 'VOID ' [MISRRA 2012 RÈGLE 11.6, REQUIS] AVEC NVMEMWRITEWORD ((VOID ) APP_FLASH_MARK_ADDRESS, (UINT) _USERMARK);

Comment puis-je résoudre cette erreur? xxx


3 commentaires

L'explication des règles 11.x inclut des commentaires que "cela peut être nécessaire lors de l'accès à des registres matériels". Si tel est un cas, une déviation (S5.4) est appropriée - et une partie délibérée de MISRA.


@Andrew; Je ne vois aucune raison pour laquelle une déviation est justifiée dans ce cas. Casting à A Void * est jamais nécessaire. Les écarts doivent être utilisés lorsqu'il n'est pas raisonnable ou possible de se conformer à une règle; Ce n'est pas le cas ici, où la conformité est meilleur code .


Je suggère respectueusement que le pointeur est effectivement * uint32_t et n'est que Nixed à annuler comme une tentative de contourner la règle ...


3 Réponses :


2
votes

Utilisez xxx

et xxx

à la place. Fonctionnellement, il est exactement équivalent à l'exemple, il évite simplement la distribution d'un pointeur vide à une adresse inteer non signée.


5 commentaires

merci apprécie cela. J'ai modifié la question et ajouté une erreur supplémentaire. @ Nominal


@ raj123 Évitez de changer la question une fois que les réponses arrivent. Cela fait une cible en mouvement peu claire. Question roulée en arrière.


@raj: Un problème et une question à la fois, comme l'a dit Chux. Si vous aviez mis en œuvre le changement en premier, vous l'auriez remarquée, cela prend également soin du deuxième problème.


@Nominalanimal uint8_t nvmemwriteword (adresse Int * non signée, données uint32_t) Je dois utiliser un pointeur Int non signé à la droite au lieu d'un pointeur vide.


@ raj123: Il n'a pas besoin d'être un pointeur. L'adresse INT non signée fonctionnera.



0
votes

La totalité de MISR-C: 2012 Chapitre 12 En ce qui concerne les conversions du pointeur est assez difficile. Et à juste titre, puisque c'est un territoire très dangereux.

11.6 est une règle sonore qui interdit les conversions des entiers vers Void * . La justification consiste à bloquer les bugs d'alignement. Il n'y a pas beaucoup de raisons pour lesquelles vous voudriez de toutes les conversions de toute façon.

notamment, il existe également deux règles de conseil rigides mais consultatives 11.4 qui interdit les conversions des entiers aux pointeurs et 11,5 qui interdit à peu près l'utilisation de annulement * entièrement. Il n'est pas possible de faire une programmation liée au matériel et de suivre 11,4, de sorte que la règle doit être ignorée. Mais vous avez peu de raisons d'utiliser void * .

Dans cette distribution spécifique, vous pouvez vous éloigner en utilisant uint32_t et en évitant entièrement les pointeurs.

Dans le cas général de registre Access, vous devez effectuer une conversion avec volatile -Pointants qualifiés: (volatile uint32_t *) Adresse , en supposant que le MCU utilise 32 bits registres.


0 commentaires

1
votes

Suggérer:

#define ADDRESS (volatile uint32_t*)0x9D007FF0U
NVMemWriteWord( ADDRESS, _usermark) ;


0 commentaires