Strana 1 z 2

ESP32 MemoryError

Napísané: 07 Mar 2023, 19:55
od používateľa gogo
Zdravim všetkých,

učím sa s ESP32 a micropython. Teraz skúšam trocha väčší
program (script má okolo 1200 riadkov) a pri spúšťaní mi vypíše
MemoryError: memory allocation failed, allocating 787 bytes.
Vedel by mi niekto skúsenejši s ESP32 vysvetliť, čo spôsobuje
túto chybu a ako ju odstrániť?
Používam Thonny IDE.

Ďakujem!

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 20:19
od používateľa jirka.jirka.
Já si s ESP hraju, sice ne s pythonem ale s klasickým C. Nemáš víc toho logu. ESP má poměrně obsáhlý log (teda pokud jej nemáš zakázaný, vstup MTDO), popř. ve firmware. Ale opět nevím jak u pythona.

Pokud ale máš, dej sem komplet log výstup. Z toho by to mohlo jít určit. Taky by se hodilo i ten prográmek, jinak je to takové :fortuneteller:

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 20:25
od používateľa gogo
Sem len začiatočník, čo myslíš pod tým logem.
Logické výstupy?

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 20:29
od používateľa jirka.jirka.
Určitě máš to ESP připojené přes UART na PC pro ládování programu. A taky pro debugging.

No a tam se po zapnutí určitě něco sype. U mě to vypadá takto.

Dál co přesně máš za desku? Nebo za modul? Já ujíždím na ESP32-WROOM-32 ... Ale jak píšu, možná to má jiné logy, možná to má logy disablované, bůh ví. Prostě dej co nejvíc informací.

Kód: Vybrať všetko

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:6664
load:0x40078000,len:14848
load:0x40080400,len:3792
entry 0x40080694
I (27) boot: ESP-IDF v4.4.2-dirty 2nd stage bootloader
I (27) boot: compile time 19:16:30
I (27) boot: chip revision: 0
I (30) boot.esp32: SPI Speed      : 40MHz
I (35) boot.esp32: SPI Mode       : DIO
I (40) boot.esp32: SPI Flash Size : 4MB
I (44) boot: Enabling RNG early entropy source...
I (50) boot: Partition Table:
I (53) boot: ## Label            Usage          Type ST Offset   Length
I (60) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (68) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (75) boot:  2 factory          factory app      00 00 00010000 00100000
I (83) boot: End of partition table
I (87) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=1616ch ( 90476)                 map
I (128) esp_image: segment 1: paddr=00026194 vaddr=3ffb0000 size=03ca8h ( 15528)                 load
I (135) esp_image: segment 2: paddr=00029e44 vaddr=40080000 size=061d4h ( 25044)                 load
I (145) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=75654h (480852)                 map
I (319) esp_image: segment 4: paddr=000a567c vaddr=400861d4 size=10404h ( 66564)                 load
I (347) esp_image: segment 5: paddr=000b5a88 vaddr=50000000 size=00010h (    16)                 load
I (358) boot: Loaded app from partition at offset 0x10000
I (358) boot: Disabling RNG early entropy source...
I (370) cpu_start: Pro cpu up.
I (370) cpu_start: Starting app cpu, entry point is 0x40081318
I (0) cpu_start: App cpu up.
I (386) cpu_start: Pro cpu start user code
I (386) cpu_start: cpu freq: 240000000
I (386) cpu_start: Application information:
I (391) cpu_start: Project name:     ESP32_aqua_control
I (397) cpu_start: App version:      1
I (401) cpu_start: Compile time:     Nov  3 2022 18:09:50
I (407) cpu_start: ELF file SHA256:  24ab9d7403b20cf1...
I (413) cpu_start: ESP-IDF:          v4.4.2-dirty
I (419) heap_init: Initializing. RAM available for dynamic allocation:
I (426) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (432) heap_init: At 3FFB7C40 len 000283C0 (160 KiB): DRAM
I (438) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (445) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (451) heap_init: At 400965D8 len 00009A28 (38 KiB): IRAM
I (458) spi_flash: detected chip: gd
I (462) spi_flash: flash io: dio
I (466) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (18) gpio: GPIO[2]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown                : 0| Intr:0
I (19) gpio: GPIO[12]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldow                n: 0| Intr:0
I (26) gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldow                n: 0| Intr:0
I (35) gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldow                n: 0| Intr:0
I (44) MAIN: Task_GPIO_2 running on core: 1, xDelay = 1
I (150) MAIN: Task_DS18B20 running on core: 1, xDelay = 1
I (151) MAIN: Find devices:
I (176) MAIN:   0 : 5f3c01d607cb8228
I (201) MAIN:   1 : f13c01d607f01728
I (201) MAIN: Found 2 devices
I (250) MAIN: Task_LCD running on core: 1, xDelay = 1
I (251) SH1106: SH1106 OLED configured successfully
I (300) MAIN: Task_SHT30 running on core: 1, xDelay = 1
I (2509) wifi:wifi driver task: 3ffc3bb4, prio:23, stack:6656, core=0
I (2510) system_api: Base MAC address is not set
I (2510) system_api: read default base MAC address from EFUSE
I (2519) wifi:wifi firmware version: eeaa27d
I (2520) wifi:wifi certification version: v7.0
I (2524) wifi:config NVS flash: enabled
I (2528) wifi:config nano formating: disabled
I (2532) wifi:Init data frame dynamic rx buffer num: 32
I (2537) wifi:Init management frame dynamic rx buffer num: 32
I (2542) wifi:Init management short buffer num: 32
I (2547) wifi:Init dynamic tx buffer num: 32
I (2551) wifi:Init static rx buffer size: 1600
I (2555) wifi:Init static rx buffer num: 10
I (2559) wifi:Init dynamic rx buffer num: 32
I (2564) wifi_init: rx ba win: 6
I (2567) wifi_init: tcpip mbox: 32
I (2571) wifi_init: udp mbox: 6
I (2575) wifi_init: tcp mbox: 6
I (2579) wifi_init: tcp tx win: 5744
I (2583) wifi_init: tcp rx win: 5744
I (2587) wifi_init: tcp mss: 1440
I (2591) wifi_init: WiFi IRAM OP enabled
I (2596) wifi_init: WiFi RX IRAM OP enabled
I (2601) CNT: Connecting to JirkaTralala...
I (2606) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07
I (2708) wifi:mode : sta (30:ae:a4:05:af:3c)
I (2709) wifi:enable tsf
I (2712) CNT: Waiting for IP(s)
I (3442) wifi:new:<7,0>, old:<1,0>, ap:<255,255>, sta:<7,0>, prof:1
I (4545) wifi:state: init -> auth (b0)
I (4583) wifi:state: auth -> assoc (0)
I (4611) wifi:state: assoc -> run (10)
I (4745) wifi:connected with JirkaTralala, aid = 3, channel 7, BW20, bssid = ec:4                1:58:ec:93:6e
I (4746) wifi:security: WPA2-PSK, phy: bgn, rssi: -47
I (4748) wifi:pm start, type: 1
EDIT: Nebo možnost dvě, začíst študovat: Thonny IDE python debugging

EDIT2: Mrknout na video https://www.youtube.com/watch?v=bdvYIumllx8 a program krokovat až tam, kde selže. Pak budeš vědět který řádek to dělá a můžeš to opravit.

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 20:58
od používateľa gogo
Mne z toho vypadne len toto.
U teba je toho hromada.

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5008
ho 0 tail 12 room 4
load:0x40078000,len:10600
ho 0 tail 12 room 4
load:0x40080400,len:5684
entry 0x400806bc

Modul mám ten istý ESP32-WROOM-32.
Začalo mi to robiť, až keď som pridal do programu zápis a načítanie hodnôt
z vonkajšej eeprom 24C02. Takže problém bude asi s tou eeprom-kou.

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 21:07
od používateľa jirka.jirka.
Bez programu ani ránu. A ano, pokud jsi přidal něco do kódu a začalo to padat, tak už víš odkud vítr vane.

Mrkni na ty odkazy co jsem ti dal v editech v minulém příspěvku. A zkus si to odkrokovat. Někde to narazí, budeš vědět kde.

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 21:11
od používateľa gogo
Budem študovať.
Ďakujem za pomoc a dám vedieť, či sa podaril problém vyriešiť.

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 21:15
od používateľa jirka.jirka.
Určitě když najdeš řešení, mohl bys ukázat co jsi měl špatně, jak jsi to našel a jak opravil. Ostatní, kdo si to budou číst se to rádi dozví. :thumbup:

Re: ESP32 MemoryError

Napísané: 07 Mar 2023, 22:32
od používateľa pocitujlasku
Skusim si tipnut: nacitavas data z eeprom do nejakej premennej, ktora je definovana ako pole (dost velke).
Ta hlaska znamena, ze ti dosla RAM. a najcastejsi problem je: bud nejaky sialeny program, ktory ma xx cyklov a vnoreni, alebo mas deklarovane premennne, ktore si alokuju vela miesta.

Re: ESP32 MemoryError

Napísané: 11 Mar 2023, 15:58
od používateľa gogo
Som tu späť.
Ten debugger moc nepotešil. Nefunguje, tak ako napr. u jednočipov,
že sa dá program krokovat, zastavovať a pod. Tu to ide, ale len
s klasickým pythonom. S micropythonom nie. Tam je ešte jedno
okno (Shell = REPL), kde sa dá sledovať stav hl. programu a to tak,
že v hl. programe sa robia poznámky pomocou príkazu print()
a tieto sa zobrazia v tom pomocnom okne a vieme, že program
je tohoto okamihu v poriadku na danom mieste.
#pocitujlaska, máš pravdu, došla RAM-ka. Program má okolo 1200
riadkov, aj som robil nejaké úpravy, ale stále tá istá chyba. Na nete
som hladal niečo o uvolnení pamäte, ale nepomohlo ani to.
Najväčšia chyba je to, že interpreter jazyka python zaberá v pamäti
tiež dosť miesta.
Neviem, čo ešte skúsiť. Keby tak mohol poradiť niekto, kto sa
s niečím podobným stretol.
Na jednom fóre už radili, aby prechádzali na typ esp-čka
ESP32-WROVER B, ten má pridaných 8M PSRAM
Zatial tolko.

Re: ESP32 MemoryError

Napísané: 11 Mar 2023, 16:01
od používateľa jirka.jirka.
Dej sem program nebo mi kup :fortuneteller:

Sice jsem s micropythonem nikdy nepracoval, ale bez zdrojáků ani prd. :roll:

Re: ESP32 MemoryError

Napísané: 11 Mar 2023, 22:50
od používateľa pocitujlasku
gogo: nejde o pocet riadkov, v takom asembleri mas tisice riadkov kodu, ale vysledny zabera par kb.
Casty problem su polia a premenne, ktore su deklarovane na zbytocne vysoke typy. napr. ak riesim cyklus, ktory prebehne dajme tomu 100x nedam premennu int64, ale staci byte. podobne texty. ak su staticke, tak ich dat do programovej pamate a odtial volat, aby sa zbytocne nekopirovali do ramky, ale volat ich priamo odtial cez pointer.
Lenze bez kodu su toto len take dohady.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 12:16
od používateľa gogo
Tu je ten program.
Len ma hned neukamenujte :pain: , lebo toto je moja väčšia prvotina v micropythone.
Doteraz som robil len s mcu8051 a v assemblery. Teraz som chcel na staré
kolená vyskúšať niečo nové. Možno omyl.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 12:22
od používateľa jirka.jirka.
A kde to cca spadne? Určitě se ti podařilo něco najít. Popř. aspoň kdybys určil, kde to cca chcípne. Přes debug výstupy )třeba UART) z ESP to můžeš docela dobře zjistit. :thumbup:

A jen ze zvědavosti. By mě zajímalo, co tě vedlo z ASM do pythona? :?: Já na to kdysi dávno koukal a je to moloch na tady ty naše chcípáčky. Ale na raspberry na něj nedám dopustit. :thumbup:

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 15:33
od používateľa gogo
Padá to na funkcii načitanie hodnot z eeprom.
Možno je niečo v tých funkciách, ale sú súčasťou pythonu
v ESP. Keď dám tú funkciu preč, tak to ide.
Nevýhoda je, že to nevypíše, na ktorom riadku je chyba ako
pri ostatných chybách. Tu zdelí iba: Memory error:
memory allocations errors xxx bytes.
Prečo ten python? Všade písali, že je lahký, ešte k tomu boli
aj tie esp-čka a chcel som niektoré veci, aby som ich skúsil
pridať na sieť, aby som videl trebárs v mobile hodnoty z čidiel,
na webe.
Tak ako písal pocitujlasku, tento program mám napísaný v asm,
ešte nie je úplne dokončený má okolo 4000 riadkov. Velkosť je
okolo 35kB. O pythone sa rozprávalo, že to dokáže s tretinovou
dľžkou. To možno áno, ale tá náročnosť na pamäť.
Som z toho teraz trocha sklamaný, lebo celkom sa to darilo až
teraz nastali takéto problémy. Neviem čo s tým. Možno to bola
fakt chyba ísť do pythonu. Alebo ešte skúsiť ten model s pridanou
8M PSRAM.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 15:43
od používateľa jirka.jirka.
A spadne to hned při prvním řádku toho vyčítání z EEPROM?

Řádek 846. Tzn. narazí na první výčet a šlus?

Kód: Vybrať všetko

z_eeprom=i2c.readfrom_mem(80,5,1)
Nebylo by snazší si vyčíst 90 bytes najednou a hrabat se v tom? Než pokaždé načíst, zpracovat, načíst další byte, zkontrolovat. Ale jinak nikde nevidím problém. Nejsem pythonista. Myslel jsem, že tam máš použito třeba nějaké malloc, které neuvolňuješ, atp. Ale nikde nic.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 17:02
od používateľa misocko
Možno blbá otázka. Skúšal si aj samostatný, krátky kod na pracu s eeprom? Či ti to vôbec funguje.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 17:21
od používateľa gogo
Myslíš načítať to do nejakého zoznamu a odtial to potom vyťahovať?
A s ukladaním presne naopak, zapísať do zoznamu a ten potom zapísať do eeprom.
Skúšal som samostatný program s eeprom a ten mi funguje. Sice to je len zápis
5 bytov, ale ide.

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 17:24
od používateľa jirka.jirka.
Udělej si nějaký miniprográmek:
kompletně ji někde v nějakém FOR naplnit a pak zpětně vyčíst a porovnat. To že jede nějakých 5 bytes od adresy 0 neznamená, že je ten driver OK

Re: ESP32 MemoryError

Napísané: 12 Mar 2023, 20:43
od používateľa gogo
Ok. Vyskúšam.
Ďakujem!