Sunteți pe pagina 1din 10

Internet of Things

Laborator 2
Moduri de consum redus. Perifericul ULP.
(anul universitar 2021-2022)

Universitatea Tehnică ”Gheorghe Asachi” din Iaşi


Facultatea de Automatică şi Calculatoare
Departamentul de Calculatoare
Cuprins
1 Scopul laboratorului 1
2 Moduri de consum redus 1
2.1 Introducere şi facilităţi 1
2.2 Modulul RTC 2
3 ULP 3
3.1 Integrarea ı̂n aplicaţii 4
3.2 Structura unui program 4
4 Sarcini de lucru 6
Materiale de studiu 8

Listă tabele
Table 1 ESP32 - Moduri de consum 1

Listă figuri
Fig. 1 Power Control Architecture 2

1
1. Scopul laboratorului

Obiectivele acestui laborator sunt prezentarea şi exemplificarea modurilor de funcţionare


a SoC-ului ESP32 (i.e. moduri de consum redus), prezentarea setului de instrucţiuni şi a
modelului de programare a coprocesorului ULP, urmând ca la final să se dezvolte o aplicaţie
care utilizează intercalat cele două tipuri de unităţile de procesare.

2. Moduri de consum redus

2.1 Introducere şi facilităţi


ESP32 dispune de capabilităţi hardware pentru a ajunge la cel mai bun raport ı̂ntre put-
erea consumată, latenţa de tranziţile ı̂ntre modurile de funcţionare şi sursele de tranziţie
(trezire) disponibile. SoC-ul poate să funcţioneze ı̂ntr-unul din cele 5 moduri de consum ı̂n
funcţie de cerinţele aplicaţiilor, iar pentru cazurile ı̂n care se doreşte executarea unor sarcini
unde nu este necesară o putere de calcul mare (sau nu există constrângeri de timp strânse),
acestea pot fi executate de coprocesorul ULP (Ultra Low-Power co-processor).
Tabelul 1 prezintă principalele caracteristici ale modurilor de funcţionare. Acestea sunt
strâns legate de modul ı̂n care SoC-ul are structurate domeniile de alimentare şi de ceas,
controlul (activare/inhibare) realizându-se centralizat prin intermediul unui bloc hardware
specializat prezent la nivelul modului RTC (figura 1). SoC-ul dispune de 3 domenii de al-
imentare: digital (include procesoarele, majoritatea memoriei şi majoritatea perifericelor),
analogic şi RTC (include ULP, unele periferice şi două blocuri de memorie).

Tabel 1. ESP32 - Moduri de consum

Mod Nuclee RF Surse Domeniu Domeniu ULP Consum Latenţă


ceas digital RTC trezire
Active active activ active activ activ activ variază cu -
perifericele
folosite
Modem sleep active ceas inhibat, active activ activ activ 30mA @ 80 1

alimentare MHz
decuplată
Light sleep ceas inhi- alimentare de- surse HS activ activ activ 800 µA < 1 msec
bat cuplată inactive
Deep sleep conext alimentare de- surse HS alimentare activ activ 6,5 µA 2

pierdut cuplată inactive decuplată


Hibernate conext alimentare de- surse HS alimentare memorii, per- inactiv 4,5 µA 2

pierdut cuplată inactive decuplată iferice inactive

1 Alternanţa ı̂ntre Modem sleep şi Active se realizează automat pe baza parametrilor de comunicaţie – sistemul

trece periodic ı̂n modul Active pentru a menţine conexiunea la reţea


2 Trecerea ı̂n modul Active presupune resetarea sistemului, astfel latenţa este influenţată de secvenţa de boot

1
Fig. 1. Power Control Architecture

Tranziţii pot fi realizate doar ı̂ntre modul Active şi celelalte moduri de consum (redus),
revenirea ı̂n modul Active realizându-se prin activarea unor surse de evenimente (wake-up
sources).
Info
Mai multe detalii sunt disponible ı̂n manualul tehnic ESP32 ı̂ncepând cu pagina 638
şi ı̂n documentaţia on-line.

2.2 Modulul RTC


Acest subsistem al ESP32 este folosit pentru:

• activarea/dezactivarea modurilor de consum redus

2
• activarea/dezactivarea surselor de ceas (inclusiv blocurile PLL)

• activarea/dezactivarea semnalelor de ceas ale perifericelor, memoriilor, nucleelor

• cuplarea/decuplarea liniilor de alimentare ale perifericelor, memoriilor, nucleelor

Acest subsistem al ESP32 include următoarele structuri hardware:

• Blocul de control pentru modurile de consum

• 3 timere - timer-ul RTC, timer-ul ULP şi timer-ul pentru taste capacitive

• coprocesorul ULP

• Bloc de memorie SRAM de 8kB (RTC slow memory) folosit de ULP pentru date
şi cod. Memoria este mapată şi ı̂n spaţiul de adrese al nucleelor principale şi prin
intermediul ei pot fi schimbate date ı̂ntre unităţile de procesare.

• Bloc de memorie SRAM de 8kB (RTC slow memory) folosit pentru stocarea datelor
ı̂n modurile de consum redus (mai puţin ı̂n modul Hibernate).

• 8 registre de retenţie (32 biţi) active ı̂n toate modurile de funcţionare

• 18 intrări (analogice) active ı̂n toate modurile de funcţionare ce pot fi folosite ca surse
de wake-up

3. ULP

Coprocesorul ULP este implementat sub formă de automat cu stări finite şi a fost proiec-
tat pentru a efectua măsurători analogice (canale ADC externe, senzorul de temperatură
integrat), pentru a configura/interoga senzori cu interfaţă I2C şi pentru a efectua procesări
simple ı̂n perioadele de inactivitate ale nucleelor principale. Coprocesorul poate accesa
memoria RTC slow memory (cod & date) şi registrele perifericelor RTC CNTL, RTC IO şi
SARADC/SENS.
Coprocesorul dispune de 4 registre de uz general pe 16 biţi (R0-R3) şi de un registru pe
8 biţi (stage cnt) folosit pentru implementarea buclelor. stage cnt nu poate fi scris sau
citit direct, el este accesibil doar indirect prin intermediul unui set dedicat de instrucţiuni.
Intrucţiunile sunt de lungime fixă, pe 32 de biţi şi adresarea se realizează tot pe 32 de
biţi. Instrucţiunile de salt, operaţiile ALU, instrucţiunile de acces a memoriei şi a registrelor
sunt executate ı̂ntr-un ciclu, iar instrucţiunile de lucru cu periferice sunt executate ı̂ntr-un
număr variabil de cicli.
Coprocesorul are o frecvenţă de lucru de 8 MHz (sursa RTC FAST CLK).

3
3.1 Integrarea ı̂n aplicaţii
esp-idf include uneltele necesare pentru scrierea codului ı̂n limbaj asamblare. Pe scurt,
binarul ce conţine secţiunile de cod şi date (.text şi .bss) pentru ULP este ı̂ncorporat ı̂n
binarul aplicaţiei principale şi la rulare poate fi accesat prin intermediul unor etichete. Prin
intermediul unui set de funcţii din esp-idf codul este copiat ı̂n memoria RTC şi este pornită
execuţia lui.
Programele rulate de coprocesor pot fi construite pentru a rula ı̂n buclă infinită sau pot
fi rulate pe o perioadă de timp finită, execuţia fiind oprită prin intermediul instrucţiunii
halt. În cel din urmă caz, reluarea execuţiei poate fi controlată prin programul principal
sau poate fi programată recurent prin folosirea unui timer dedicat disponibil ı̂n modului
RTC (la execui̧a instrucţiunii halt, timerul (f=150 kHz) este activat şi va număra până
la valoarea conţinută de un registru SENS ULP CP SLEEP CYCx REG, după care va reporni
coprocesorul).
Info
Informaţii complete despre modul de interacţiune sunt disponibile aici.
Documentaţia setului de instrucţiuni este disponibilă aici.

3.2 Structura unui program


Pentru a ı̂nţelege structura fişierului prezentat ı̂n listing-ul 1, ı̂n caseta următoare sunt
prezentate câteva definiţii din documentaţia asamblorului GCC.
Info
The Special Dot Symbol
The special symbol . refers to the current address that as is assembling into. Thus,
the expression melvin: .long . defines melvin to contain its own address.

ld Sections
text section
data section These sections hold your program. as and ld treat them as separate
but equal sections. Anything you can say of one section is true another. When the
program is running, however, it is customary for the text section to be unalterable.
bss section This section contains zeroed bytes when your program begins running.
It is used to hold uninitialized variables or common storage.

Assembler Directives
.long expressions Expect zero or more expressions, of any section, separated by
commas. For each expression, emit a number that, at run time, is the value of that
expression. The byte order and bit size of the number depends on what kind of
target the assembly is for.

4
.global symbol, .globl symbol
texttt.global makes the symbol visible to ld. If you define symbol in your partial
program, its value is made available to other partial programs that are linked with it.

/* Header-e ce contin define-uri pentru registrele perifericelor


si macro-uri ajutatoare */
#include "soc/rtc_cntl_reg.h"
#include "soc/rtc_io_reg.h"
#include "soc/soc_ulp.h"

/* Variabile initializate cu zero */


.bss

.global a
a:
.long

.global b
b:
.long

/* Sectiunea de cod */
.text
.global inceput_program:
inceput_program:

move R1, a // R1 = offset-ul adresei de memorie de la eticheta a


// de memorie
ld R0, R1, 0 // R0 = valoarea stocata la BAZA_ADRESARE + R1 + 0

move R2, b // R2 = offset-ul adresei de memorie de la eticheta b


// de memorie
add R0, R0, 10 // R0 = val(a) + 10
st R0, R2, 0 // stocheaza la BAZA_ADRESARE + R2 + 0 valoarea din R0

halt

/* sfarsit program */

Listing 1. Structura unui fişier .S

Programul din listing-ul 1 citeşte locaţia de memorie indicată de eticheta a, adună 10


unităţi şi scrie valoarea rezultată la locaţia de memorie indicată de eticheta b. Pentru lucrul
cu memorie sunt disponibile două instrucţiuni pentru accesare indirectă - ld şi st - ce
primesc ca parametrul un registru ce conţine deplasamentul locaţiei de memorie.
În timpul procesului de build, sursele .S sunt parsate, se extrag toate etichetele marcate

5
cu .global şi se generează un fisier .h care conţine referinţe externe de forma extern
uint32 t ulp nume eticheta globala , iar ı̂n urma link-editării ele vor indica locaţiile
etichetate din RTC slow memory. Astfel, aplicaţia care rulează pe cele două nuclee Xtensa
are posibilitatea să schimbe date cu aplicaţia ULP, respectiv sa indice locaţia de memorie
de la care va ı̂ncepe execuţia codului.

4. Sarcini de lucru

1. Studiaţi documentele indicate ı̂n secţiunile anterioare.

2. Creaţi un proiect nou şi adăugaţi sursele puse la dispoziţie pe platforma moodle:

• Fişierele main.c şi CMakeLists.txt vor fi plasate ı̂n folder-ul src


• Pentru blinky.S se va crea folder-ul ulp ı̂n rădăcina proiectului
• Se rulează sistemul de configurare al esp-idf fie prin rularea ı̂n terminal a comen-
zii pio.exe run --target menuconfig --environment nume env (unde
nume env este preluat din fişierul platformio.ini, linia [env:nume env]),
fie prin selectarea opţiunii Run menuconfig din meniul PlatformIO. În interfaţă,
se navighează la Component config → ESP32-specific şi se bifează Enable
Ultra Low Power (ULP) Coprocessor. Se salvează modificările (tasta S),
după care proiectul poate fi compilat.

Info
Utilitarul menuconfig este construit sub forma unui meniu, interacţiunea fiind
realizată prin intermediul tastelor ↑, ↓, Enter şi Esc. În unele situaţii, datorită
integrării defectuoase, tastele ↑, ↓ nu răspund, funcţiile lor fiind substituite prin
intermediul tastelor J şi K.

Aplicaţia principală ı̂ncarcă codul ULP ı̂n memorie şi porneşte execuţia lui. Aplicaţia
ULP controlează pinul GPIO2 (RTC GPIO12), pin la care este conectat un LED.

Studiaţi programul şi răspundeţi la următoarele ı̂ntrebări:

(a) De ce LED-ul nu clipeşte? Ce trebuie modificat ı̂n aplicaţie pentru a clipi cu o


perioadă de 500 msecunde?
(b) De ce la afişarea din programul principal se realizează o operaţie ŞI logic?

3. Extindeţi programul anterior:

• Perioadele tON şi tOFF ale LED-ului vor fi configurate din programul principal
prin intermediul variabilelor ulp on period ms, ulp off period ms. Uni-
tatea folosită este milisecunda.

6
• Durata de rulare a programului ULP va fi configurată prin indicarea numărului
de iteraţii ale buclei principale a programului. Se va folosi variabila ulp blink count
la nivelul programului principal. Coprocesorul ULP trebuie să execute instrucţiunea
halt la finalul programului.
• Studiaţi documentaţia şi programaţi reluarea automată a execuţiei codului ULP
dupa̧ o perioadă configurată tot la nivelul programului principal.

7
Materiale de studiu

• Foaie de catalog şi manual ESP32

• Documentaţie API esp-idf

• Documentaţie API FreeRTOS

S-ar putea să vă placă și