This shows you the differences between two versions of the page.
iothings:laboratoare:lab8 [2022/02/11 16:54] laura.ruse removed |
iothings:laboratoare:lab8 [2022/05/11 20:05] (current) cosmin.chenaru [Secure Boot] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Multitasking pentru Sparrow ====== | + | ===== Laborator 08. Securizarea aplicațiilor pe ESP32 ===== |
- | In acest laborator vom studia implementarea unui mediu multi-tasking pentru platforma Sparrow. Pentru simplitate, functionalitatea multi-tasking este implementata peste IDE-ul Arduino sub forma unei biblioteci ce permite planificarea diferitelor task-uri, salvarea si refacerea contextului si rularea efectiva a diferitelor procese intr-o maniera concurenta. | + | În laboratorul de astăzi vom folosi tool-ul ESP-IDF (Espressif IoT Development Framework) pentru a securiza codul ce rulează pe plăcuța ESP32. |
- | Biblioteca folosita este o versiune modificata a [[https://github.com/chrismoos/avr-os|avr-os]] ce pune la dispozitie un mediu de execuie de baza pentru rularea de procese in regim de multitasking. | + | ==== ESP-IDF ==== |
- | Biblioteca foloseste un planificator preemptiv pentru a face schimbarea de context si fiecare task are propria stiva ce este salvata si refacuta la reluarea executiei. Un timer AVR este initializat si folosit pentru a furniza tick-urile de ceas pe baza carora se face temporizarea executiei si schimbarea de context. | + | ESP-IDF este un framework pentru dezvoltarea de aplicații pentru plăcuțele de la Espressif. Vine cu un toolchain (compilator, debugger) pentru ESP32, diferite scripturi Python pentru a compila și scrie aplicațiile pe flash-ul plăcuței, cât și cu diferite exemple de aplicații foarte folositoare. |
- | ===== Instalare si configurare ===== | + | {{:iothings:laboratoare:lab8-pic1.png|}} |
- | Biblioteca o puteti descarca de {{:iothings:avr_os.zip|aici}}. Copiati continutul arhivei in directorul Libraries al Arduino si restartati IDE-ul. | + | Pentru a instala ESP-IDF, putem folosi acest tutorial: |
- | Un exemplu de folosire a bibliotecii il aveti in exemplul de mai jos: | + | https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html |
- | <code C> | + | Puteți folosi "ESP-IDF v4.4.1 - Offline Installer" pentru a instala tool-ul ESP-IDF. |
- | #include <AVR_OS.h> | + | |
- | spinlock_t testLock; | + | {{:iothings:laboratoare:lab8-pic2.png?300|}} |
- | // Create instance of OS multitasker | + | După instalare, o fereastră PowerShell se va deschide: |
- | AVR_OS os = AVR_OS(); | + | |
- | // Define task 1 | + | {{:iothings:laboratoare:lab8-pic3.png?600|}} |
- | void task1(void *arg) { | + | ==== Secure Boot ==== |
- | uint8_t val=0; | + | |
- | + | ||
- | while(1) { | + | |
- | os.spinlock_acquire(&testLock); | + | |
- | Serial.println("task1: " + String((long)os.os_get_uptime())); | + | |
- | os.spinlock_release(&testLock); | + | |
- | os.os_sleep(10000); | + | |
- | } | + | |
- | } | + | |
- | // Define task 2 | + | Plăcuța ESP32 are diferite niveluri de protecție, începând de la "secure boot" și până la securizarea aplicației. |
- | void task2(void *arg) { | + | |
- | int x = 0; | + | |
- | uint8_t val = 0; | + | |
- | while(1) { | + | |
- | os.spinlock_acquire(&testLock); | + | Vom urmări aceste doua tutoriale pentru a înțelege procesul de securizare: |
- | Serial.println("task2: " + String(x++)); | + | |
- | os.spinlock_release(&testLock); | + | |
- | os.os_sleep(1000); | + | |
- | } | + | |
- | } | + | |
- | // Define task 3 | + | https://blog.espressif.com/understanding-esp32s-security-features-14483e465724 |
- | void task3(void *arg) { | + | https://demo-dijiudu.readthedocs.io/en/latest/security/secure-boot.html |
- | while(1) { | + | |
- | os.spinlock_acquire(&testLock); | + | |
- | Serial.println("task3: HELLO- this is a long message to make sure spinlock is working"); | + | |
- | os.spinlock_release(&testLock); | + | |
- | os.os_sleep(15000); | + | |
- | } | + | |
- | } | + | |
- | void setup() { | + | === XIP - eXecute-In-Place === |
+ | === eFUSE === | ||
- | Serial.begin(115200); | + | O siguranță electrică poate fi programată o singură dată. |
- | Serial.println("\n\nStarting up...\n\n"); | + | |
- | os.spinlock_init(&testLock); | + | {{:iothings:laboratoare:lab8-pic6-png.png|}} |
- | os.os_schedule_task(task1, NULL, 0); | + | === OTP keys - One Time Programmable keys === |
- | os.os_schedule_task(task2, NULL, 0); | + | ==== Exerciții ==== |
- | os.os_schedule_task(task3, NULL, 0); | + | |
- | } | + | |
- | void loop() { | + | === Ex. 1 === |
- | os.os_loop(); | + | |
- | } | + | |
- | </code> | + | |
- | Task-urile sunt declarate ca functii apoi inscrise in planificator la initializare, in functia setup(). Numarul total de task-uri ce pot fi declarate este limitat la 5 in avr_os.cpp, din ratiuni de dimensiune redusa a stivei. | + | Rulați exemplul "Hello World" din ESP-IDF. Pentru aceasta, puteți copia directorul "hello_world" din locația "C:\Espressif\frameworks\esp-idf-v4.4.1\examples\get-started" într-un alt folder (ex. "Downloads\esp"). Mergeți apoi către această locație în PowerShell și rulați comanda "idf.py menuconfig". |
- | <note>**Task 0:** Rulați exemplul de mai sus.</note> | + | {{:iothings:laboratoare:lab8-pic4-1.png|}} |
- | <note>**Task 1:** Definiti trei task-uri, cu o perioada de 1s, 2s, respectiv 3s. Fiecare task modifica starea unui LED (task1 pentru LED-ul rosu, task2 pentru LED-ul verde, task3 modifica LED-ul albastru). Un al patrulea task va comunica starea fiecarui LED pe interfata seriala, atunci cand aceasta se schimba. In Arduino, led-urile sunt mapate pe pinii 8, 10 si 11 ai Sparrow.</note> | + | |
- | <note>**Task 2:** Rulati un program de achizitie de date si transmisie la gateway prin interfata radio folosind multitasking-ul. Un task se ocupa cu achizitia de date de la senzorul de umiditate/temperatura, alt task pentru senzorul de lumina iar un al treilea task colecteaza datele culese si le transmite pe interfata radio folosind biblioteca SparrowTransfer implementata la laboratorul 3.</note> | + | Cu ajutorul următoarei interfațe grafice putem schimba diferite setări ale plăcuței și ale aplicației. |
+ | |||
+ | {{:iothings:laboratoare:lab8-pic4.png?600|}} | ||
+ | |||
+ | Pentru a încărca noua aplicație, folosiți următoare comandă: | ||
+ | |||
+ | <note> | ||
+ | idf.py -p COM5 flash | ||
+ | </note> | ||
+ | |||
+ | Iar pentru a vedea consola plăcuței putem folosi: | ||
+ | |||
+ | <note> | ||
+ | idf.py -p COM5 monitor | ||
+ | </note> | ||
+ | |||
+ | {{:iothings:laboratoare:lab8-pic5.png?600|}} | ||
+ | |||
+ | === Ex. 2 (Opțional) === | ||
+ | |||
+ | ===== Resurse ===== | ||
+ | |||
+ | * https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html | ||
+ | * https://demo-dijiudu.readthedocs.io/en/latest/security/secure-boot.html | ||
+ | * https://blog.espressif.com/understanding-esp32s-security-features-14483e465724 |