OS temps-réel sur STM32 J.-M Friedt, 20 janvier 2017 RTOS free Nous proposons d

OS temps-réel sur STM32 J.-M Friedt, 20 janvier 2017 RTOS free Nous proposons d’aborder l’utilisation des environnements exécutifs pour développer sur microcontrôleur. Un environne- ment exécutif fournit au programmeur un certain nombre de fonctionnalités attendues d’un système d’exploitation – multitude de tâches capables d’échanger des données et donc de garantir l’intégrité des informations notamment par la protection par mutex ou l’utilisation de queues de transferts – mais en ne générant qu’un exécutable monolithique aux ressources connues lors de la compilation. Nous n’aurons donc pas l’occasion de charger dynamiquement d’exécutable ou de bibliothèque, les res- sources sont déclarées à la compilation. L’intérêt de travailler sur environnement exécutif au lieu de développer en C tient en l’organisation du travail et la portabilité du code : 1. plusieurs programmeurs travaillent chacun sur sa tâche, et la mise en commun des données acquises (exemple : pro- ducteur de données pour l’acquisition, consommateur pour le traitement) se fait au travers des mécanismes de partage fournis par l’environnement exécutif, 2. sous réserve de prendre soin de n’inclure aucun appel bas niveau (matériel) dans son programe, le code ne faisant que appel aux ressources algorithmiques fournies par FreeRTOS sera portable entre toutes les architectures supportées, dont une liste est consultable dans FreeRTOS/Source/portable/GCC. Les processeurs ARM y sont évidemment largement représentés, ainsi que AVR, Coldfire (Freescale), MSP430 ou PowerPC. Dans l’archive proposée à http://jmfriedt.free.fr/freertos_stm32.tar.gz, la séparation matériel-logiciel est main- tenue en ne plaçant des fonctions contenant les appels au bas niveau que dans le répertoire common (stm32 pour la biblio- thèque fournie par ST Microelectronics, cm3 pour le support libopencm3 1). Nous fournissons une archive de FreeRTOS ver- sion 8, et les Makefile d’extension v9 sont supposés permettre la compilation avec FreeRTOS version 9 disponible à http: //www.freertos.org/a00104.html. 1 Premiers pas avec le STM32 Le STM32 est un processeur ARM de la classe Cortex-M3 [1]. Ce cœur se décline de la gamme faible coût aux performances modestes, jusqu’au haut de gamme comportant des interfaces ethernet et USB. Bien que FreeRTOS [2] fournisse un certain nombre de niveaux d’abstraction [3] pour fournir des méthodes s’apparentant au multitâche, les fonctions de bas niveau telles que la communication asynchrone (RS23) ou synchrone (SPI/I2C) restent à la charge du développeur, quitte à utiliser les fonctionnalités fournies par une bibliothèque annexe (libstm32 ou libopencm3). Nous nous engageons donc dans un premier temps sur un petit exercice de communication sur bus asynchrone afin de nous familiariser avec le microcontrôleur et en particulier une de ses subtilités qui tient dans le routage des horloges sans lesquelles un périphérique ne peut pas fonctionner. L’architecture de la carte est résumée dans la Fig. 1 : on y trouvera la référence du port de communicatin asynchrone (USART), LEDs et convertisseur analogique-numérique (ADC) accessibles. PC9 ADC1 USART1 PC8 st−flash) (openocd, PC STM32−VL discovery STLINK FIGURE 1 – Connections du STM32VL Discovery vers le monde extérieur. 2 Premiers pas : compiler et flasher L’exemple que nous nous proposons dans un premier temps d’expérimenter est le classique clignotement de diode et envoi de trames de texte sur le port série. En particulier, l’objectif est d’illustrer l’initialisation des ports (entrée/sortie, fonction GPIO 1. https://github.com/libopencm3/libopencm3 1 ou étendue) et surtout la sélection des horloges cadençant chaque périphérique (code 1). Dans cet exemple, nous utilisons les deux bibliothèques simplifiant l’accès aux ressources du STM32 (en évitant dans un premier temps de consulter les 1093 pages du manuel) : libopencm3 2 et libstm32. Nous verrons plus tard que FreeRTOS favorise la bibliothèque de ST Microelectronics libstm32. Afin de réutiliser un maximum de code entre le programme C autonome et FreeRTOS, nous exploitons la compilation séparée pour le code d’initialisation (réutilisable) et la charge utile (spécifique à chaque application). Les codes d’initialisation sont fournis en annexe A. BL’initialisation des liaisons asynchrones en autre chose que N (ie O ou E) nécessite de définir des mots de 9 bits et non de 8! Une fois ces initialisations effectuées, envoyer un message sur USART et faire clignoter une diode s’obtient en libopencm3 par 1 #include <libopencm3/stm32/ f1 /rcc .h> #include <libopencm3/stm32/ f1 /gpio .h> 3 #include <libopencm3/stm32/ usart .h> 5 //#define avec_newlib 7 # ifdef avec_newlib #include <errno .h> 9 #include <stdio .h> #include <unistd .h> 11 int _write ( int file , char * ptr , int len ) ; #endif 13 void clock_setup ( void ) ; 15 void usart_setup ( void ) ; void gpio_setup ( void ) ; 17 int main( void ) 19 { int i , c = 0; clock_setup () ; 21 gpio_setup () ; usart_setup ( ) ; 23 while (1) { gpio_toggle (GPIOC, GPIO9) ; 25 gpio_toggle (GPIOC, GPIO8) ; c = ( c == 9) ? 0 : c + 1; // cyclic increment c 27 #ifndef avec_newlib usart_send_blocking (USART1, c + ’0 ’ ) ; // USART1: send byte 29 usart_send_blocking (USART1, ’ \r ’ ) ; usart_send_blocking (USART1, ’ \n ’ ) ; 31 #else printf ( "%d\r \n" , ( int ) c ) ; 33 #endif for ( i = 0; i < 800000; i ++) __asm__( "NOP" ) ; 35 } return 0; 37 } Listing 1 – Exemple en C exploitant libopencm3 ou par libstm32 au moyen de 1 #include "common.h" 3 // Function Declarations int main( void ) 5 { int i , c = 0 ,k=0; // clock_setup () ; 7 Led_Init () ; Usart1_Init () ; // usart_setup () ; 9 while (1) { i f (k==1) Led_Hi () ; else Led_Lo () ; 11 k=1−k ; c = ( c == 9) ? 0 : c + 1; // cyclic increment c 2. http://libopencm3.org/wiki/Main_Page mais le plus simple est de sélectionner cette bibliothèque lors de la compilation de sa toolchain par https://github.com/vedderb/summon-arm-toolchain/ 2 13 uart_putc ( c + ’0 ’ ) ; // USART1: send byte uart_putc ( ’ \r ’ ) ; 15 uart_putc ( ’ \n ’ ) ; for ( i = 0; i < 80000; i ++) __asm__( "NOP" ) ; 17 } return 0; 19 } Listing 2 – Exemple en C exploitant libstm32 Ayant validé la compilation de ces programmes de base et le lien avec les bibliothèques appropriées au moyen du Makefile 1 a l l : usart_stm32 . bin # a l l : usart_cm3 . bin usart_stm32 . bin pwm_cm3. bin 3 usart_cm3 . bin : main_cm3. c . . /common/usart_opencm3 . c 5 arm−none−eabi−gcc −Wall −Wextra −Wimplicit−function−declaration \ −Wredundant−decls −Wmissing−prototypes −Wstrict−prototypes \ 7 −Wundef −Wshadow −I ~/sat /bin / . . /arm−none−eabi/include \ −fno− common −mthumb −mcpu=cortex− m3 −msoft−float − M D −DSTM32F1 \ 9 −o usart_cm3 . o −c . . /common/usart_opencm3 . c arm−none−eabi−gcc −Wall −Wextra −Wimplicit−function−declaration \ 11 −Wredundant−decls −Wmissing−prototypes −Wstrict−prototypes \ −Wundef −Wshadow −I ~/sat /bin / . . /arm−none−eabi/include \ 13 −fno− common −mthumb −mcpu=cortex− m3 −msoft−float − M D −DSTM32F1 \ −o main_cm3. o −c main_cm3. c 15 arm−none−eabi−gcc −o usart_cm3 . e l f usart_cm3 . o main_cm3. o −lopencm3_stm32f1 −−static \ −Wl,−−start −group −lc −lgcc −lnosys −Wl,−−end−group \ 17 −L~/sat /arm−none−eabi/ lib /thumb/cortex− m3 −L~/sat /bin / . . /arm−none−abi/ lib \ −T./ stm32vl−discovery . ld −nostartfiles −Wl,−−gc−sections −mthumb \ 19 −mcpu=cortex− m3 −msoft−float −mfix−cortex−m3 −ldrd \ −L~/sat /arm−none−eabi/ lib /thumb/cortex− m3 21 arm−none−eabi−objcopy −O binary usart_cm3 . e l f usart_cm3 . bin 23 pwm_cm3. bin : pwm_cm3. c arm−none−eabi−gcc −Wall −Wextra −Wimplicit−function−declaration \ 25 −Wredundant−decls −Wmissing−prototypes −Wstrict−prototypes \ −Wundef −Wshadow −I ~/sat /bin / . . /arm−none−eabi/include \ 27 −fno− common −mthumb −mcpu=cortex− m3 −msoft−float − M D −DSTM32F1 \ −o usart_cm3 . o −c . . /common/usart_opencm3 . c 29 arm−none−eabi−gcc −Wall −Wextra −Wimplicit−function−declaration \ −Wredundant−decls −Wmissing−prototypes −Wstrict−prototypes \ 31 −Wundef −Wshadow −I ~/sat /bin / . . /arm−none−eabi/include \ −fno− common −mthumb −mcpu=cortex− m3 −msoft−float − M D −DSTM32F1 \ 33 −o pwm_cm3. o −c pwm_cm3. c arm−none−eabi−gcc −o pwm_cm3. e l f pwm_cm3. o usart_cm3 . o −lopencm3_stm32f1 −−static \ 35 −Wl,−−start −group −lc −lgcc −lnosys −Wl,−−end−group \ −L~/sat /arm−none−eabi/ lib /thumb/cortex− m3 −L~/sat /bin / . . /arm−none−abi/ lib \ 37 −T./ stm32vl−discovery . ld −nostartfiles −Wl,−−gc−sections −mthumb \ −mcpu=cortex− m3 −msoft−float −mfix−cortex−m3 −ldrd \ 39 −L~/sat /arm−none−eabi/ lib /thumb/cortex− m3 arm−none−eabi−objcopy −O binary pwm_cm3. e l f pwm_cm3. bin 41 43 LDSCRIPT= . . / ld/stm32_flash . ld #LDSCRIPT= ./ stm32vl−discovery . ld 45 usart_stm32 . bin : main_stm32 . c . . /common/usart_stm32 . c system_stm32f10x . c 47 arm−none−eabi−gcc −DSTM32F10X_LD_VL −I ./ −c −fno− common −O0 −g3 −I . . /common −I /home/ jmfriedt / sat /arm−none−eabi/include/ stm32f1/ −I /home/ jmfriedt / sat /arm−none−eabi/include/ −Wall −Wextra −mcpu=cortex− m3 −mthumb −I /home/ jmfriedt / sat /arm− none−eabi/include/include −fno− common −mthumb −msoft−float −c −o usart_stm32 . o . . /common/usart_stm32 . c arm−none−eabi−gcc −DSTM32F10X_LD_VL −I ./ −c −fno− common −O0 −g3 −I . . /common −I /home/ jmfriedt / sat /arm−none−eabi/include/ stm32f1/ −I /home/ jmfriedt / sat /arm−none−eabi/include/ −Wall −Wextra −mcpu=cortex− m3 −mthumb −I /home/ jmfriedt / sat /arm− none−eabi/include/include −fno− common −mthumb −msoft−float −c −o main_stm32 . o main_stm32 . c 49 uploads/Management/ tp-freertos.pdf

  • 8
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Mai 09, 2021
  • Catégorie Management
  • Langue French
  • Taille du fichier 0.2165MB