Petit pense bête pour compiler un programme avec le SDK RTOS de Espressif
Installation
esp-open-sdk
Installation du SDK avec le compilateur xtensa selon https://github.com/pfalcon/esp-open-sdk
Lors du make, une des étapes est assez longue : le chargement de tarballs visiblement sur ftp.gnu.org. Environ 15mn de chargement à l’installation sur un premier ordi. Sur un deuxième, j’ai abandonné après 1h : le lendemain, j’en ai eu pour 10mn… Donc, ne pas hésiter à retenter à un autre moment…
1 2 3 4 5 6 |
$ sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial git unzip bash help2man wget bzip2 libtool-bin $ mkdir ~/esp8266_sdk $ cd ~/esp8266_sdk $ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git $ cd esp-open-sdk $ make |
J’ai eu une erreur lors du make
1 2 3 4 5 6 7 8 |
(...) make[2]: Entering directory '/home/francois/esp8266_sdk/esp-open-sdk/crosstool-NG' [INFO ] Performing some trivial sanity checks [ERROR] Don't set LD_LIBRARY_PATH. It screws up the build. [ERROR] [ERROR] >> [ERROR] >> Build failed in step '(top-level)' (...) |
qui a été corrigée par
1 2 |
$ unset LD_LIBRARY_PATH $ make |
Ajouter le path du compilateur dans ~/.bashrc
1 2 3 |
# à la fin de ~/.bashrc ESP_SDK=/home/francois/esp8266_sdk/esp-open-sdk/xtensa-lx106-elf/bin export PATH=$PATH:$ESP_SDK |
ESP8266_RTOS_SDK
Puis installation du ESP8266_RTOS_SDK https://github.com/espressif/ESP8266_RTOS_SDK par simple clonage du dépôt :
1 2 |
$ cd /home/francois/esp8266_sdk/ $ git clone https://github.com/espressif/ESP8266_RTOS_SDK.git |
Compilation d’un exemple
Du dossier d’installation du ESP8266_RTOS_SDK, copier le dossier examples/project_template dans un dossier de travail
1 2 |
cd ~/programmation/FreeRTOS cp -R /home/francois/esp8266_sdk/ESP8266_RTOS_SDK/examples/project_template . |
Changer les PATH dans le fichier gen_misc.sh
1 2 3 4 5 6 7 8 9 |
:<<! export SDK_PATH=$SDK_PATH export BIN_PATH=$BIN_PATH ! # Chemin du SDK export SDK_PATH=~/esp8266_sdk/ESP8266_RTOS_SDK # Chemin ou seront stockés les binaires compilés export BIN_PATH=/tmp/ESP8266 |
Tester la compilation (en laissant par défaut les paramètres proposés)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ ./gen_misc.sh (...) !!! SDK_PATH: /home/francois/esp8266_sdk/ESP8266_RTOS_SDK BIN_PATH: ./BIN No boot needed. Generate eagle.flash.bin and eagle.irom0text.bin successully in BIN_PATH eagle.flash.bin-------->0x00000 eagle.irom0text.bin---->0x20000 !!! $ ls BIN eagle.dump eagle.flash.bin eagle.irom0text.bin eagle.S |
Et enfin tester le chargement sur la carte. J’utilise une Wemos D1 mini avec 4Mo de mémoire. Si on se réfère à la documentation d’Espressif, il faut d’abord charger les fichiers d’initialisation aux adresses mentionnées sur leur site, puis les fichiers issus de la compilation
1 2 3 4 5 6 |
# Tout d'abord les fichiers d'init $ esptool.py -p /dev/ttyUSB* -b 230400 write_flash 0x3FE000 ~/esp8266_sdk/ESP8266_RTOS_SDK/bin/blank.bin $ esptool.py -p /dev/ttyUSB* -b 230400 write_flash 0x3FC000 ~/esp8266_sdk/ESP8266_RTOS_SDK/bin/esp_init_data_default.bin # Puis nos fichiers esptool.py -p /dev/ttyUSB* -b 230400 write_flash 0x000000 /tmp/ESP8266/eagle.flash.bin esptool.py -p /dev/ttyUSB* -b 230400 write_flash 0x020000 /tmp/ESP8266/eagle.irom0text.bin |
Blink
Test avec le programme « blink » récupéré sur le net.
Copie du template :
1 2 3 4 5 |
cd ~/programmation/FreeRTOS cp -R project_template blink cd blink # Effacement de ce qu'on a pas besoin du template rm -rf sample_lib |
Fichier user/user_main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
/* * blink/user/user_main.c */ #include "esp_common.h" #include "gpio.h" #define LED_GPIO 2 #define LED_GPIO_MUX PERIPHS_IO_MUX_GPIO2_U #define LED_GPIO_FUNC FUNC_GPIO2 // Requis pour la compilation int32 user_rf_cal_sector_set(void) { flash_size_map size_map = system_get_flash_size_map(); uint32 rf_cal_sec = 0; switch (size_map) { case FLASH_SIZE_4M_MAP_256_256: rf_cal_sec = 128 - 5; break; case FLASH_SIZE_8M_MAP_512_512: rf_cal_sec = 256 - 5; break; case FLASH_SIZE_16M_MAP_512_512: case FLASH_SIZE_16M_MAP_1024_1024: rf_cal_sec = 512 - 5; break; case FLASH_SIZE_32M_MAP_512_512: case FLASH_SIZE_32M_MAP_1024_1024: rf_cal_sec = 1024 - 5; break; case FLASH_SIZE_64M_MAP_1024_1024: rf_cal_sec = 2048 - 5; break; case FLASH_SIZE_128M_MAP_1024_1024: rf_cal_sec = 4096 - 5; break; default: rf_cal_sec = 0; break; } return rf_cal_sec; } // Boucle sans fin en faisant clignoter la led void LEDBlinkTask (void *pvParameters) { while(1) { printf("blink\n"); // Allume vTaskDelay (50/portTICK_RATE_MS); GPIO_OUTPUT_SET (LED_GPIO, 1); // Éteint vTaskDelay (1500/portTICK_RATE_MS); GPIO_OUTPUT_SET (LED_GPIO, 0); } } // Fonction d'initiation. Ne doit pas boucler, mais sortir sans paramètres // une fois l'init finie void user_init(void) { printf("SDK version:%s\n", system_get_sdk_version()); // Configuration de la pin LED PIN_FUNC_SELECT(LED_GPIO_MUX, LED_GPIO_FUNC); // Création et lancement de la tache clignotement xTaskCreate(LEDBlinkTask, (signed char *)"Blink", 256, NULL, 2, NULL); } |
Là, j’ai eu toutes les peines du monde à compiler ! J’avais toujours une erreur undefined reference to `gpio_output_conf' qui en fait est due à ce que la librairie gérant les « drivers » (dont gpio) n’est pas liée dans le Makefile d’origine. Il faut dont le modifier comme suit :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# blink/Makefile # Au début enlever la référence au dossier qu'on a supprimé SUBDIRS= \ user # sample_lib endif # } PDIR # puis plus loin ajouter le lien vers la librairie "driver" LINKFLAGS_eagle.app.v6 = \ -L$(SDK_PATH)/lib \ -Wl,--gc-sections \ -nostdlib \ -T$(LD_FILE) \ -Wl,--no-check-sections \ -u call_user_start \ -Wl,-static \ -Wl,--start-group \ -lcirom \ -lcrypto \ # ----------- -ldriver \ # ----------- -lespconn \ (...) |
Puis compilation et chargement
1 2 |
$ ./gen_misc.sh $ esptool.py -p /dev/ttyUSB* -b 230400 write_flash 0x000000 /tmp/ESP8266/eagle.flash.bin 0x020000 /tmp/ESP8266/eagle.irom0text.bin |
Pense bête : monitoring de l’UART USB
1 |
screen /dev/ttyUSB0 115200 |
Et sortie de l’écoute par ^a k y
Addentum esp-open-rtos
La version alternative, esp-open-rtos, a l’air tout aussi intéressante et peut-être plus simple.
Nous avons déjà installé esp-open-sdk à la première étape, il n’y a qu’à cloner le dépôt esp-open-rtos :
1 2 |
$ cd ~/esp8266_sdk/ $ git clone --recursive https://github.com/Superhouse/esp-open-rtos.git |
Testons un exemple
1 2 3 4 5 6 7 8 |
$ cd ~/esp8266_sdk/esp-open-rtos/examples/blink $ make -j4 # -j4 pour lancer 4 jobs en parallèle $ make flash ESPPORT=/dev/ttyUSB0 # ou pour compiler et flasher en une seule opération : $ make flash -j4 ESPPORT=/dev/ttyUSB0 # ou pour compiler, flasher et lancer une console série $ make test |