Atom per lo sviluppo con FreeRTOS e ESP8266

Atom è un editor di testo per lo sviluppo software. E' creato e mantenuto da github; ha un sistema di plugin molto simile a SublimeText.

Nativamente non è dotato di autocompletamento per il C; personalmente mi trovo molto scomodo a programmare senza alcun tipo di autocompletamento.

Con il passare del tempo, provando diversi plugin, sono riuscito a trovare una combinazione abbastanza comoda.

Uso i seguenti Plugin per Atom.

Cscope

Cscope è un potente strumento di analisi dei sorgenti C, permette di cercare simboli definizioni, navigare il codice, riesce a gestire senza problemi progetti mastodontici,  per esempio il Kernel senza il minimo problema.

Genera un database binario, nel quale salva tutti i simboli, che trova nei sorgenti. Il link ha una GIF animata che preseta il plugin. E' necessario installare, cscope anche come pacchetto di sistema.

Pacchetto Atom:https://atom.io/packages/atom-cscope

Installazione di CSCOPE:

Andiamo nel pakage manager di Atom: (CTRL+MAIUS+P) Aprirà il pannello dei comandi, digitiamo 'Install', usando la tendina scegliamo:Setting View:Install Pakages And Themes.

Cerchiamo CSCOPE, installiamo il pachetto.

# Ubuntu:
aptitude install cscope
# oppure se non รจ installato aptitude
apt-get install cscope

#Fedora
dnf install cscope

Personalmente uso queste shortcut, per cscope.

# keymap atom
'atom-workspace':
    'ctrl-shift-c o': 'atom-cscope:toggle'
    'ctrl-shift-c ctrl-f f': 'atom-cscope:find-symbol'
    'ctrl-shift-c ctrl-f b': 'atom-cscope:find-functions-called-by'
    'ctrl-shift-c ctrl-f g': 'atom-cscope:find-global-definition'
    'ctrl-shift-c ctrl-f c': 'atom-cscope:find-functions-calling'
    # 'ctrl-shift-z-alt-m': 'atom-cscope:find-text-string'
    'ctrl-shift-c f-s': 'atom-cscope:find-egrep-pattern'
    'ctrl-shift-c f': 'atom-cscope:find-file'
    'ctrl-shift-c f-i': 'atom-cscope:find-files-including'

Quindi per trovare un simbolo:

Premo:CRTL+SHIFT+C lascio tutti i tasti, CRTL+F e poi F

Per lavorare sul codice, è prima necessario creare il database dei simboli. atom-cscope:toggle dalla barra dei comandi, e poi il simbolo della saetta. Per tutti gli altri dettagli di installazione, la pagina del plugin è piu chiara.

AutoComplete-clang

Questo plugin utilizza clang per analizzare i sorgenti, e creare una lista dei possibili completamenti per il simbolo che si sta scrivendo. Se ben configurato fornisce un autocompletamento perfetto. Link e GIF animata sono molto più chiari di 1000 spiegazioni.

L'istallazione del plugin su Atom è identica sempre la stessa.

Pacchetto Atom:https://atom.io/packages/autocomplete-clang

Installazione del pacchetto di sistema

# Installo il compilatore clang

# Ubuntu
sudo apt-get install clang

# Fedora
dnf install clang

File di configurazione di autocomplete-clang

Clang necessita un file di configurazione che imposta il percorso dei file .h dove cercare le funzioni e i simboli. Io uso questo file di configurazione, per i progetti del ESP8266, contiene circa tutte le librerie necessarie al ESP8266. Questo file va ovviamente aggiustato per la configurazione in uso, sul sistema.

-I/opt/esp-open-sdk/sdk/include
-I/opt/esp-open-rtos/open_esplibs/include
-I/opt/esp-open-rtos/FreeRTOS/Source/include
-I/opt/esp-open-rtos/extras/cpp_support/include
-I/opt/esp-open-rtos/extras/dhcpserver/include
-I/opt/esp-open-rtos/extras/mbedtls/include
-I/opt/esp-open-rtos/extras/mbedtls/mbedtls/include
-I/opt/esp-open-rtos/lwip/lwip/src/include
-I/opt/esp-open-rtos/lwip/lwip/espressif/include
-I/opt/esp-open-rtos/lwip/include
-I/opt/esp-open-rtos/examples/http_get_mbedtls/include
-I/opt/esp-open-rtos/libc/xtensa-lx106-elf/include
-I/opt/esp-open-rtos/core/include
-I/opt/esp-open-rtos/open_esplibs/include
-I/opt/esp-open-rtos/FreeRTOS/Source/include
-I/opt/esp-open-rtos/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-cc-gcc-core-pass-2/gcc/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-cloog-host-x86_64-build_pc-linux-gnu/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-isl-host-x86_64-build_pc-linux-gnu/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-cc-gcc-final/xtensa-lx106-elf/libstdc++-v3/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-cc-gcc-final/gcc/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/build/build-ncurses-build-x86_64-build_pc-linux-gnu/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools/lib/gcc/xtensa-lx106-elf/4.8.5/plugin/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools/lib/gcc/xtensa-lx106-elf/4.8.5/install-tools/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools/lib/gcc/xtensa-lx106-elf/4.8.5/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools/xtensa-lx106-elf/include
-I/opt/esp-open-sdk/crosstool-NG/.build/xtensa-lx106-elf/buildtools/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libffi/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libsanitizer/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libcpp/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/boehm-gc/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libjava/classpath/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libjava/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/libstdc++-v3/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/gcc/testsuite/gcc.dg/pch/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/gcc/testsuite/gcc.dg/cpp/usr/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gcc-4.8.5/gcc/doc/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/ncurses-6.0/Ada95/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/ncurses-6.0/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/libc/sys/xtensa/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/libgloss/bfin/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/machine/cris/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/machine/spu/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/sys/linux/machine/i386/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/sys/linux/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/sys/xtensa/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/sys/rtems/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/libc/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/newlib-2.0.0/newlib/testsuite/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/cloog-0.18.4/isl/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/cloog-0.18.4/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/cloog-0.18.4/osl/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/gdb-7.10/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/expat-2.1.0/amiga/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/isl-0.14/include
-I/opt/esp-open-sdk/crosstool-NG/.build/src/binutils-2.25.1/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/plugin/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/install-tools/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/include/include
-I/opt/esp-open-sdk/xtensa-lx106-elf/include
-I/opt/esp-open-sdk/esp-open-lwip/include
-I/opt/esp-open-sdk/esp-open-sdk/esp-open-lwip/include
-I/opt/esp-open-sdk/esp-open-sdk/lx106-hal/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/at_espconn/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/wps/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/IoT_Demo/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/lwip_open_src_template_proj/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/at/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/smart_config/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/examples/peripheral_test/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/driver_lib/include
-I/opt/esp-open-sdk/ESP8266_NONOS_SDK_V1.5.4_16_05_20/include
-I/opt/esp-open-sdk/lx106-hal/include

Build

Il plugin compila direttamente da Atom, più importante segnala le righe errate sul codice, mediante Linter.

Pacchetto Atom:https://atom.io/packages/build

Non necessita di particolari configurazioni

Build-make

Build make permette di lanciare make attraverso il plugin Build, shordcut F9.

Pachetto Atom:https://atom.io/packages/build-make

Non necessita di particolari configurazioni, solo un'attenzione particolare, ad aprire Atom mediante shell. Poichè se viene aperto mediante shell, eredita da questa le variabili d'ambiente. Se risultasse scomodo a qualche lettore, segnalo che esistono plugin per cablare le variabili d'ambiente. Anche questo plugin permette una configurazione, ma non mi sono mai trovato comodo.

# Progetto in /home/user/project/TestPrj
cd /home/user/project/TestPrj
atom .

Linter

Pugin di base, per evidenziare errori, sottolineare in rosso, e tutte le cose colorate tipiche degli IDE.

Pacchetto Atom:https://github.com/steelbrain/linter

Conclusioni

Questa configurazione se ben fatta crea un ottimo ambiente per sviluppare software per ESP8266.