Et voilà, j'ai craqué.
Après avoir lu une série d'articles sur l'utilisation d'Ada dans les microcontrolleurs (comme celui-ci, celui-là ou enfin encore ça), je me suis jeté à l'eau et j'ai fini par acheter une carte Nucleo de chez ST Microelectronics.
Cette petite carte a tout plein de trucs intéressants comme plein de timers, une bonne tripotée d'entrées-sorties digitales et analogiques mais surtout, elle est compatible avec l'Arduino au travers d'un connecteur ad hoc.

Me voici donc parti pour du développement en Ada sur la bête.
J'ai donc téléchargé GNAT pour ARM sur le site d'Adacore et c'était parti.
Sauf que mes premiers essais furent infructueux, jusqu'à ce que je comprenne que le runtime fourni sous le nom ravenscar-sfp-stm32f4 ne correspond pas à la famille STM32F4 complète mais seulement pour la carte STM32F4DISCOVERY. Dammed !!:)
J'ai donc fouillé sur le Grand Ternet à la recherche d'un runtime avec l'appréhension de devoir faire un portage moi-même. Finalement, je n'ai rien eu à faire car j'ai trouvé le Graal sur GitHub[1] !!
J'ai donc été sauvé par Nick Pascucci qui a décidé il y a quelques mois d'effectuer le portage sur une carte Nucleo STM32F411RE, MA carte :)

L'histoire pourrait s'arrêter là si je n'avais commencé à lire le code du runtime... Sauf que c'est plus fort que moi, je lis du code.
Si on revient un peu sur les raisons qui m'ont fait passer à Ada, on trouve :

  • le typage fort,
  • le parallélisme intégré,
  • un super compilateur qui surveille tout ce que l'on fait à bon escient [2] et
  • une grande lisibilité [3]

Et là, dans le runtime, que vois-je ?

RCC.PLLCFGR := 16#2400_3010#;
 
   --  Bit definitions for RCC APB1ENR register
   RCC_APB1ENR_USART2   : constant Word := 16#0002_0000#;
   RCC_APB1ENR_PWR      : constant Word := 16#1000_0000#;

Des opérateurs logiques, des constantes qui nécessitent d'avoir la doc sous les yeux et du coup, des trucs aussi illisibles que si on faisait du C... Beurk !!
J'ai donc fait mon psychorigide et j'ai forké. Bon, j'ai pas dit que c'était mieux mais moi, écrire des trucs comme ce qui suit, ça me correspond plus.

-- Enable clock for USART2
      RCC.RCC_APB1ENR.USART2_Clock_Enable := True;
 
--  Enable clock for GPIOC
      RCC.RCC_AHB1ENR.GPIOC_Clock_Enable := True;
      RCC.RCC_APB2ENR.Sys_Config_Clock_Enable := True;
 
      --  Configure PC13
      GPIOC.MODER (13) := Mode_IN;
      GPIOC.PUPDR (13) := No_Pull;
 
      --  Select PC13 for EXTI13
      -- See Page 139 of the RM0383 datasheet
      SYSCFG.SYSCFG_EXTICR(4).Sources(1) := PORT_C;

Alors oui, ça donne l'impression d'écrire plus de code et effectivement, cela fait plus de code assembleur dans certains cas mais au moins, ça se lit !

Bon, en tout cas, si ça vous intéresse, c'est . Vous verrez que j'ai refait plein de choses, que j'ai redéfini des types et des énumérations pour tous les registres importants et que je continue :)

Notes

[1] Et oui, rien n'est parfait dans ce bas monde

[2] Au départ, je trouvais que c'était trop mais finalement, j'écris tellement de conneries que c'est bien :D

[3] Même si certains diront que c'est vraiment trop verbeux