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 EM>) APP_FLASH_MARK_ADDRESS, (UINT) _USERMARK); P> blockQuote>
Comment puis-je résoudre cette erreur? p>
xxx pré> p>
3 Réponses :
Utilisez et p> à la place. Fonctionnellement, il est exactement équivalent à l'exemple, il évite simplement la distribution d'un pointeur vide à une adresse inteer non signée. P> p>
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 code> fonctionnera.
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. p>
11.6 est une règle sonore qui interdit les conversions des entiers vers 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 Dans cette distribution spécifique, vous pouvez vous éloigner en utilisant Dans le cas général de registre Access, vous devez effectuer une conversion avec Void * code>. 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. P>
annulement * code> 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 * code>. P>
uint32_t code> et en évitant entièrement les pointeurs. P>
volatile code>-Pointants qualifiés:
(volatile uint32_t *) Adresse code>, en supposant que le MCU utilise 32 bits registres. p>
Suggérer:
#define ADDRESS (volatile uint32_t*)0x9D007FF0U NVMemWriteWord( ADDRESS, _usermark) ;
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 à i> A
Void * code> est jamais i> 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 i>.
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 ...