Keil µvision - difficultés...

Keil µvision - difficultés... - Electronique, domotique, DIY

Marsh Posté le 30-04-2021 à 09:08:35    

Salut,

 

Je suis en train de péter les plombs avec Keil µVision :DJe reprends un cours basique d'openclassroom sur la programmation de microcontrôleur et j'ai des soucis avec µVision que je n'avais pas eu il y a 2 ou 3 ans.
J'ai bien le nucleo à base de STM32F103RB proposé par le cours.

 

Le premier exemple est celui-ci :

Code :
  1. #include <stm32f10x.h>
  2. int main (void)
  3. {
  4.     RCC->APB2ENR |=  RCC_APB2ENR_IOPAEN ;
  5.     GPIOA->CRL = GPIOA->CRL & ~(0xF << 4*5);
  6.     GPIOA->CRL = GPIOA->CRL | (0x01 << 4*5);
  7.     while(1)
  8.     {
  9.         GPIOA->ODR ^= (1 << 5);
  10.     }
  11.     return 0;
  12.        
  13. }


De base, j'ai déjà des warnings à la compilation que je n'avais pas avant :

Code :
  1. prime.c(6): warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
  2.     GPIOA->CRL = GPIOA->CRL & ~(0xF << 4*5);
  3.                             ~ ^~~~~~~~~~~~~
  4. prime.c(12): warning: 'return' will never be executed [-Wunreachable-code-return]
  5.     return 0;
  6.            ^
  7. 2 warnings generated.
  8. compiling prime.c...
  9. RTE/Device/STM32F103RB/system_stm32f10x.c(167): warning: no previous extern declaration for non-static variable 'AHBPrescTable' [-Wmissing-variable-declarations]
  10. __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  11.             ^
  12. RTE/Device/STM32F103RB/system_stm32f10x.c(167): note: declare 'static' if the variable is not intended to be used outside of this translation unit
  13. __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  14.     ^
  15. 1 warning generated.
 

Ensuite, si je vais chercher plus loin dans les fichiers, genre \Packs\Keil\STM32F1xx_DFP\2.3.0\Device\Include\system_stm32f10x.h, je vois ce genre de trucs :

Code :
  1. extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */

<< là, il m'indique qu'il ne connait pas uint32_t :cry:

 

Ce qui me rassure guère pour la suite ... j'ai pourtant installé, il me semble, les dernières version des drivers pour mon nucleo.

 

Mais ce qui me gène le plus, c'est que si je fais le programme suivant :

 
Code :
  1. int locale = 0;
  2. int main (void)
  3. {
  4.     while(1)
  5.     {
  6.         locale = locale+1;
  7.     }
  8.     return 0;
  9. }
 

Je ne peux pas mettre de breakpoint dans la simulation au niveau de la boucle while ou de l'instruction que contient la boucle...
et si je mets un watch sur la variable, il me sort qu'elle n'est pas atteignable ...

 

https://i.imgur.com/RRJr6RW.jpg

 

Il n'y a pas d'option dans le simulateur de keil, je rame depuis bine 3 heures sur ces conneries :/

Message cité 1 fois
Message édité par _pollux_ le 30-04-2021 à 09:23:29

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 09:08:35   

Reply

Marsh Posté le 30-04-2021 à 11:42:38    

_pollux_ a écrit :


Code :
  1. prime.c(6): warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
  2.     GPIOA->CRL = GPIOA->CRL & ~(0xF << 4*5);
  3.                             ~ ^~~~~~~~~~~~~




L'utilisation des opérateurs arithmétiques et binaires provoque des conversions implicites.
https://stackoverflow.com/questions [...] d-int-char
 

_pollux_ a écrit :


Code :
  1. prime.c(12): warning: 'return' will never be executed [-Wunreachable-code-return]
  2.     return 0;
  3.            ^




Vu que tu fais une boucle while(1){}, sans aucune possibilité de sortie, ce que tu mets après ne sera logiquement jamais exécuté ...
 

_pollux_ a écrit :


Code :
  1. RTE/Device/STM32F103RB/system_stm32f10x.c(167): warning: no previous extern declaration for non-static variable 'AHBPrescTable' [-Wmissing-variable-declarations]
  2. __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  3.             ^
  4. RTE/Device/STM32F103RB/system_stm32f10x.c(167): note: declare 'static' if the variable is not intended to be used outside of this translation unit
  5. __I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
  6.     ^




Soit cette variable est utilisée dans d'autres fichiers et il faut la déclarer dans le header.
Soit elle n'est utilisée que localement et il faut la déclarer static.
 

_pollux_ a écrit :


Ensuite, si je vais chercher plus loin dans les fichiers, genre \Packs\Keil\STM32F1xx_DFP\2.3.0\Device\Include\system_stm32f10x.h, je vois ce genre de trucs :

Code :
  1. extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */

<< là, il m'indique qu'il ne connait pas uint32_t :cry:


Ils ont oublié #include <stdint.h> dans system_stm32f10x.h. [:bouliyaanisqatsi]
 
Pour le reste, tu n'as que deux solutions:
Contacter le support Keil.
Passer du côté obscur et utiliser directement gcc. Faut mettre les mains dans le cambouis, c'est impressionnant au début, mais si tu t'accroches, tu iras plus vite et plus loin que ce que tu pensais possible ... ;)

Reply

Marsh Posté le 30-04-2021 à 15:14:55    

Disons que tous ces warning n'apparaissaient pas il y a 2, 3 ans quand j'avais suivi pour la première fois ce cours :/ le compilo a pu devenir plus intransigeant...
D'autant que le pire, c'est qu'à terme, je souhaite passer sur l'IDE de STM (STMideCube), mais je voulais revoir un peu le fond de la programmation µC (STMIDE a tendance à tout prémacher graphiquement... déclaration des interruptions, réglage des timers, etc ...).
Si je passe sous GCC, outre le fait de démarrer de 0...( ça va me prendre des plombes, je suis pas une star du C ), ça va être difficile de suivre le cours qui présente les différents outils de debug de Keil µVision, etc ...:D

 

Sachant que le pire, c'est le dernier point... le reste ce ne sont que des warning, mais l'impossibilité de mettre les breakpoints où je veux dans un programme ultra basique qui compile sans erreur ...

Message cité 1 fois
Message édité par _pollux_ le 30-04-2021 à 15:17:09

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 16:42:54    

_pollux_ a écrit :

Disons que tous ces warning n'apparaissaient pas il y a 2, 3 ans quand j'avais suivi pour la première fois ce cours :/ le compilo a pu devenir plus intransigeant...

Oui, généralement c'est dans cette direction (de plus en plus strict) que vont les compilos.

 
Citation :

Si je passe sous GCC, outre le fait de démarrer de 0...( ça va me prendre des plombes, je suis pas une star du C ), ça va être difficile de suivre le cours qui présente les différents outils de debug de Keil µVision, etc ...:D

Deux choses:
Si tu as des lacunes importantes en C je conseille de reprendre les bases sur PC car c'est beaucoup plus comfortable (rien que printf et Co...).
Sinon le C c'est le C et les bibliothèques standard ne changent pas, peu importe le compilateur, par contre effectivement tout ce qui est spécifique à la biblio STM32 de chez Keil ne sera plus du tout valable en utilisant GCC et ses biblio à lui. (J'espère que c'est compréhensible :o , j'ai toujours utilisé GCC et je ne connais pas les STM...)

 

Pour ton histoire de breakpoint: Vu que ta variable est utilisée nulle part le compilateur l'aura simplement viré dans le cadre de ses optimisations. Donc soit tu désactives ces dernières (sous GCC: -O0), soit tu utilises ta variable genre en l'écrivant sur un port en sortie soit tu rajoutes "volatile" comme HB.
edit: Pas vu que c'était une variable GLOBALE: Dans ce cas tu peux virer le static, car ainsi la variable pourrait être utilisée dans d'autres modules -> impossible de la virer. Par contre j'espère que tu connais la différence entre var globale et locale, c'est indispensable.

Message cité 1 fois
Message édité par rat de combat le 30-04-2021 à 16:44:43
Reply

Marsh Posté le 30-04-2021 à 17:20:40    

c'est pas les bases du C que je veux découvrir, ce sont les bases de la programmation µC :D
 
en particulier sur cette page : https://openclassrooms.com/fr/cours [...] mmable-arm
 
Je ne peux pas tester ce qui est fait parce que je ne peux pas poser de breakpoint...


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 17:24:23    

rat de combat a écrit : a écrit :


Pour ton histoire de breakpoint: Vu que ta variable est utilisée nulle part le compilateur l'aura simplement viré dans le cadre de ses optimisations. Donc soit tu désactives ces dernières (sous GCC: -O0), soit tu utilises ta variable genre en l'écrivant sur un port en sortie soit tu rajoutes "volatile" comme HB.
edit: Pas vu que c'était une variable GLOBALE: Dans ce cas tu peux virer le static, car ainsi la variable pourrait être utilisée dans d'autres modules -> impossible de la virer. Par contre j'espère que tu connais la différence entre var globale et locale, c'est indispensable.



J'avais mal lu cette partie. Je vais voir de ce côté, c'est une bonne idée. :jap:


Message édité par _pollux_ le 30-04-2021 à 17:25:00

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 17:26:05    

Et je confirme que ça marche !  [:obawi]

 

edit : en virant une optimisation.


Message édité par _pollux_ le 30-04-2021 à 17:26:24

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 17:31:01    

À première vue ton lien est pas mal focalisé sur l'assembleur ARM (qui découle du code C) / les trucs très bas niveau dans le système, à toi de voir si c'est utile pour toi.

 

edit: Et attention où tu mets ta déclaration de variable: A l'intérieur de main() (->local) ou pas (->global).


Message édité par rat de combat le 30-04-2021 à 17:31:38
Reply

Marsh Posté le 30-04-2021 à 17:58:17    

j'avais essayé les deux, pensant que c'était ça qui posait problème... mais au final, c'est bien l'optimisation du compilateur qui posait problème.

 

Pour l'histoire du bas niveau, disons que je veux au moins l'aborder un peu avant d'utiliser un IDE (STM32Cube Ide) qui a tendance à permettre de tout paramétrer avec un wizard à la création du projet.

 

https://i.imgur.com/Hi146c1.png

Message cité 1 fois
Message édité par _pollux_ le 30-04-2021 à 18:03:10

---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Marsh Posté le 30-04-2021 à 23:13:03    

rat de combat a écrit :

Pour ton histoire de breakpoint: Vu que ta variable est utilisée nulle part le compilateur l'aura simplement viré dans le cadre de ses optimisations.


Bien vu !
 

_pollux_ a écrit :

Pour l'histoire du bas niveau, disons que je veux au moins l'aborder un peu avant d'utiliser un IDE (STM32Cube Ide) qui a tendance à permettre de tout paramétrer avec un wizard à la création du projet.
 
https://i.imgur.com/Hi146c1.png


Rien ne t'empêche de faire un projet "vide" et de configurer les périphériques à la main.
N'empêche, ton screenshot donne presque envie. :o

Reply

Marsh Posté le 30-04-2021 à 23:13:03   

Reply

Marsh Posté le 01-05-2021 à 00:03:16    

404 Not Found a écrit :


Rien ne t'empêche de faire un projet "vide" et de configurer les périphériques à la main.


Bien sûr, mais j'ai un cours qui commence par la base sur Keil, mais par sur cet IDE.
J'essaye de faire le truc dans l'ordre :D


---------------
Le topic du sport électronique@hfr : watch the l33t !
Reply

Sujets relatifs:

Leave a Replay

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