E: M Ошибка в коде lua NodeMCU - PullRequest
0 голосов
/ 10 мая 2018

Я здесь, чтобы попросить вас помочь с ошибкой, которая произошла во время выполнения моего кода. Я пишу код на плате Adafruit Feather HUZZAH ESP8266 с последней версией прошивки NodeMCU, используя Lua. Я хочу прочитать значения из .bin-файла на SD-карте и показать его на мониторе рядом с его десятичной позицией адреса, остальная часть проекта - записать его на ПЗУ с SPI, но прежде чем я должен это решить, поэтому есть некоторый закомментированный код, который не нужен.

Это код:

    function WriteAByte()
    spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
    vol = file.mount("/SD0", 2)
    file.open("/SD0/bios.bin","r")
    file.seek("set", seek)
    bytes = file.read(1)
    print(seek.." "..bytes)
    seek = file.seek("cur")
    file.close()
    if(bytes == nil)then
      mytimer:stop()
      print("FINISHED TO WRITE")
    else 
        -- set SPI BIOS
        --spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
        --spi.set_mosi(1,0,8,bytes)
        --spi.transaction(1, 8,0x03, 24, index, 8, 0, 0)
        --index = index + 0x000001
    end
end

mytimer = tmr.create()

index = 0x000000
seek = 0
bytes = 0



mytimer:register(100, tmr.ALARM_AUTO,WriteAByte)
mytimer:start()

Код работает, но через 64 ​​байта (всегда 64) программа перестает работать и сообщает мне

        0 �
1 �
2 �
3 �
4 �
5 �
6 �
7 �
8 �
9 �
10 �
11 �
12 �
13 �
14 �
15 �
16 Z
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 D
49 
50 �
51 d
52 
53 
54 
55 
56 
57 
58 
59 
60 �
61 �
62 �
63 �
64 
E:M 568
PANIC: unprotected error in call to Lua API (application.lua:5: open a file first)

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x40100000, len 26996, room 16 
tail 4
chksum 0x80
load 0x3ffe8000, len 2380, room 4 
tail 8
chksum 0xf5
load 0x3ffe894c, len 136, room 0 
tail 8
chksum 0xd7
csum 0xd7

Я подумал о насыщении буфера на последовательном мониторе, поэтому я попробовал его без печати запроса и байтов, но с той же ошибкой. После того, как я подумал о проблеме с 65 байтами, я установил значение поиска выше, чем 65, но он прочитал только 64 байта из остальных, и после того, как он с ошибкой с тем же кодом. Поэтому я думаю, что это что-то вроде ошибки насыщения памяти, но при вызове функции сбора мусора для просмотра свободной памяти всегда сообщается одинаковое значение свободной памяти в каждом цикле, и если я собираю мусор в каждом цикле, ошибка не исчезает. Я прочитал кое-что о насыщении памяти кучи, поэтому я пытался вызывать функцию в отдельном файле с dofile каждый цикл и сохранять некоторые переменные функции локальными, но это не помогло. Как я могу решить эту проблему? Я не могу загрузить двоичный файл, но он составляет 64 МБ, и я прочитал 1 байт за цикл, и я не думаю, что проблема в файле.

ОБНОВЛЕНИЕ

это новые файлы кода:

init.lua

dofile("afterInit.lua")

afterInit.lua

function f()
    print("Heap all'avvio del timer : "..node.heap()) 
    if(semaphore3 == 0)then
        mytimer2:start()
    end
end

function ff()
    print("Heap all'avvio del timer2 : "..node.heap())
    semaphore3 = 1
    print("Heap dopo assegnazione semaphore3 in timer2 : "..node.heap())
    dofile("application.lua")
end

semaphore1 = 0
semaphore2 = 0
semaphore3 = 0

index = 0x000000
seek = 0
bytes = 0

mytimer = tmr.create()
mytimer2 = tmr.create()
mytimer:register(100, tmr.ALARM_AUTO,f)
mytimer2:register(1, tmr.ALARM_SEMI,ff)
mytimer:start()

application.lua

print("Heap all'avvio di application.lua : "..node.heap())
if(semaphore1 == 0)then
    print("Heap all'avvio 1 di a.lua : "..node.heap())
    semaphore1 = 1
    dofile("a.lua")
end
if(semaphore1 == 0)then
    print("Heap alla chiusura 1 di a.lua : "..node.heap())

    collectgarbage ()
    tmr.delay(50)
    print("Heap dopo garbace collector : "..node.heap())
    print((seek-1).." "..bytes)
    print("Heap dopo controllo semaphore1 in application : "..node.heap())
    if(semaphore2 == 0)then
        print("Heap all'avvio 1 di b.lua : "..node.heap())
        semaphore2 = 1
        dofile("b.lua")
    end
    if(semaphore2 == 0)then
        print("Heap alla chiusura 1 di b.lua : "..node.heap())
        print("Heap alla chiusura di application.lua : "..node.heap())
        semaphore3 = 0
    else
        print("Heap al riavvio di application: "..node.heap())
        dofile("application.lua")
    end
else
    print("Heap al riavvio di application: "..node.heap())
    dofile("application.lua")
end

a.lua

print("A a.lua : "..node.heap())
spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
print("B a.lua : "..node.heap())
local vol = file.mount("/SD0", 2)
print("C a.lua : "..node.heap())
local bios = file.open("/SD0/bios.bin","r")
print("D a.lua : "..node.heap())
print(bios)
print("E a.lua : "..node.heap())
print(seek)
print("F a.lua : "..node.heap())
bios:seek("set", seek)
print("G a.lua : "..node.heap())
bytes = bios.read(1)
print("H a.lua : "..node.heap())
seek = bios:seek("cur")
print("I a.lua : "..node.heap())
bios:close()
print("J a.lua : "..node.heap())
semaphore1 = 0
print("K a.lua : "..node.heap())
print("Heap alla chiusura 2 di a.lua : "..node.heap())

b.lua

print("Heap all'avvio 2 di b.lua : "..node.heap())
--if(bytes == nil)then
if(seek > 8)then
    mytimer:stop()
    print("FINISHED TO WRITE")
else 
    -- set SPI BIOS
    --spi.setup(1, spi.MASTER, spi.CPOL_LOW, spi.CPHA_LOW, 8, 8)
    --spi.set_mosi(1,0,8,bytes)
    --spi.transaction(1, 8,0x03, 24, index, 8, 0, 0)
    --index = index + 0x000001
end
semaphore2 = 0
print("Heap alla chiusura 2 di b.lua : "..node.heap())

И это выходные строки:

add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

_flash_used_end:402bb570
fs.start:c0000,max:33b000
_flash_used_end:402bb570
fs.start:c0000,max:33a000
_flash_used_end:402bb570
fs.start:d0000,max:32b000
_flash_used_end:402bb570
fs.start:d0000,max:32a000
mount res: 0, 0
Task task_lua started.
nul mode, fpm auto sleep set:enalbe

NodeMCU custom build by frightanic.com
    branch: master
    commit: 67027c0d05f7e8d1b97104e05a3715f6ebc8d07f
    SSL: true
    modules: adc,crypto,encoder,file,gpio,http,i2c,mdns,net,node,pwm,rtcfifo,rtcmem,rtctime,sjson,spi,tmr,uart,websocket,wifi,wifi_monitor,wps,tls
 build created on 2018-05-13 04:40
 powered by Lua 5.1.4 on SDK 2.2.1(cfd48f3)
> Heap size::38928.
Heap all'avvio del timer : 38928
Heap all'avvio del timer2 : 40216
Heap dopo assegnazione semaphore3 in timer2 : 40216
Heap all'avvio di application.lua : 37224
Heap all'avvio 1 di a.lua : 38248
A a.lua : 33744
B a.lua : 35904
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 35288
D a.lua : 34712
userdata: 0x3fff21b8
E a.lua : 34560
0
F a.lua : 34680
G a.lua : 34640
H a.lua : 34680
I a.lua : 34608
J a.lua : 35176
K a.lua : 35168
Heap alla chiusura 2 di a.lua : 35176
Heap alla chiusura 1 di a.lua : 35144
Heap dopo garbace collector : 37704
0 �
Heap dopo controllo semaphore1 in application : 37616
Heap all'avvio 1 di b.lua : 37568
Heap all'avvio 2 di b.lua : 36368
Heap alla chiusura 2 di b.lua : 36864
Heap alla chiusura 1 di b.lua : 36864
Heap alla chiusura di application.lua : 37584
Heap all'avvio del timer : 37576
Heap all'avvio del timer2 : 39552
Heap dopo assegnazione semaphore3 in timer2 : 39552
Heap all'avvio di application.lua : 36544
Heap all'avvio 1 di a.lua : 37584
A a.lua : 33088
B a.lua : 35248
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 34624
D a.lua : 34048
userdata: 0x3fff2598
E a.lua : 33896
1
F a.lua : 34016
G a.lua : 33976
H a.lua : 33976
I a.lua : 33976
J a.lua : 34544
K a.lua : 34544
Heap alla chiusura 2 di a.lua : 34544
Heap alla chiusura 1 di a.lua : 34512
Heap dopo garbace collector : 37064
1 �
Heap dopo controllo semaphore1 in application : 37000
Heap all'avvio 1 di b.lua : 36952
Heap all'avvio 2 di b.lua : 35760
Heap alla chiusura 2 di b.lua : 36256
Heap alla chiusura 1 di b.lua : 36256
Heap alla chiusura di application.lua : 36960
Heap all'avvio del timer : 36960
Heap all'avvio del timer2 : 38928
Heap dopo assegnazione semaphore3 in timer2 : 38928
Heap all'avvio di application.lua : 35896
Heap all'avvio 1 di a.lua : 36936
A a.lua : 32432
B a.lua : 34616
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 33992
D a.lua : 33408
userdata: 0x3fff23e8
E a.lua : 33240
2
F a.lua : 33376
G a.lua : 33328
H a.lua : 33336
I a.lua : 33328
J a.lua : 33904
K a.lua : 33896
Heap alla chiusura 2 di a.lua : 33904
Heap alla chiusura 1 di a.lua : 33872
Heap dopo garbace collector : 36416
2 �
Heap dopo controllo semaphore1 in application : 36336
Heap all'avvio 1 di b.lua : 36296
Heap all'avvio 2 di b.lua : 35080
Heap alla chiusura 2 di b.lua : 35576
Heap alla chiusura 1 di b.lua : 35576
Heap alla chiusura di application.lua : 36304
Heap all'avvio del timer : 36304
Heap all'avvio del timer2 : 38304
Heap dopo assegnazione semaphore3 in timer2 : 38304
Heap all'avvio di application.lua : 35296
Heap all'avvio 1 di a.lua : 36328
A a.lua : 31832
B a.lua : 34000
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 33376
D a.lua : 32800
userdata: 0x3fff2608
E a.lua : 32640
3
F a.lua : 32768
G a.lua : 32720
H a.lua : 32720
I a.lua : 32728
J a.lua : 33288
K a.lua : 33296
Heap alla chiusura 2 di a.lua : 33288
Heap alla chiusura 1 di a.lua : 33264
Heap dopo garbace collector : 35808
3 �
Heap dopo controllo semaphore1 in application : 35736
Heap all'avvio 1 di b.lua : 35696
Heap all'avvio 2 di b.lua : 34472
Heap alla chiusura 2 di b.lua : 34968
Heap alla chiusura 1 di b.lua : 34968
Heap alla chiusura di application.lua : 35704
Heap all'avvio del timer : 35704
Heap all'avvio del timer2 : 37680
Heap dopo assegnazione semaphore3 in timer2 : 37680
Heap all'avvio di application.lua : 34696
Heap all'avvio 1 di a.lua : 35736
A a.lua : 31232
B a.lua : 33392
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 32768
D a.lua : 32192
userdata: 0x3fff2128
E a.lua : 32040
4
F a.lua : 32160
G a.lua : 32120
H a.lua : 32120
I a.lua : 32112
J a.lua : 32688
K a.lua : 32680
Heap alla chiusura 2 di a.lua : 32688
Heap alla chiusura 1 di a.lua : 32664
Heap dopo garbace collector : 35216
4 �
Heap dopo controllo semaphore1 in application : 35144
Heap all'avvio 1 di b.lua : 35096
Heap all'avvio 2 di b.lua : 33896
Heap alla chiusura 2 di b.lua : 34392
Heap alla chiusura 1 di b.lua : 34392
Heap alla chiusura di application.lua : 35112
Heap all'avvio del timer : 35104
Heap all'avvio del timer2 : 37056
Heap dopo assegnazione semaphore3 in timer2 : 37056
Heap all'avvio di application.lua : 34088
Heap all'avvio 1 di a.lua : 35112
A a.lua : 30640
B a.lua : 32800
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 32176
D a.lua : 31600
userdata: 0x3fff2148
E a.lua : 31448
5
F a.lua : 31568
G a.lua : 31528
H a.lua : 31528
I a.lua : 31528
J a.lua : 32096
K a.lua : 32096
Heap alla chiusura 2 di a.lua : 32096
Heap alla chiusura 1 di a.lua : 32072
Heap dopo garbace collector : 34592
5 �
Heap dopo controllo semaphore1 in application : 34528
Heap all'avvio 1 di b.lua : 34480
Heap all'avvio 2 di b.lua : 33288
Heap alla chiusura 2 di b.lua : 33784
Heap alla chiusura 1 di b.lua : 33784
Heap alla chiusura di application.lua : 34488
Heap all'avvio del timer : 34488
Heap all'avvio del timer2 : 36432
Heap dopo assegnazione semaphore3 in timer2 : 36432
Heap all'avvio di application.lua : 33456
Heap all'avvio 1 di a.lua : 34488
A a.lua : 29984
B a.lua : 32144
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 31520
D a.lua : 30944
userdata: 0x3fff2128
E a.lua : 30792
6
F a.lua : 30912
G a.lua : 30872
H a.lua : 30872
I a.lua : 30864
J a.lua : 31440
K a.lua : 31432
Heap alla chiusura 2 di a.lua : 31440
Heap alla chiusura 1 di a.lua : 31416
Heap dopo garbace collector : 33968
6 �
Heap dopo controllo semaphore1 in application : 33896
Heap all'avvio 1 di b.lua : 33856
Heap all'avvio 2 di b.lua : 32648
Heap alla chiusura 2 di b.lua : 33136
Heap alla chiusura 1 di b.lua : 33136
Heap alla chiusura di application.lua : 33856
Heap all'avvio del timer : 33856
Heap all'avvio del timer2 : 35808
Heap dopo assegnazione semaphore3 in timer2 : 35808
Heap all'avvio di application.lua : 32816
Heap all'avvio 1 di a.lua : 33840
A a.lua : 29336
B a.lua : 31496
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 30872
D a.lua : 30296
userdata: 0x3fff2198
E a.lua : 30144
7
F a.lua : 30264
G a.lua : 30224
H a.lua : 30224
I a.lua : 30216
J a.lua : 30792
K a.lua : 30784
Heap alla chiusura 2 di a.lua : 30792
Heap alla chiusura 1 di a.lua : 30768
Heap dopo garbace collector : 33328
7 �
Heap dopo controllo semaphore1 in application : 33256
Heap all'avvio 1 di b.lua : 33208
Heap all'avvio 2 di b.lua : 32008
Heap alla chiusura 2 di b.lua : 32496
Heap alla chiusura 1 di b.lua : 32496
Heap alla chiusura di application.lua : 33208
Heap all'avvio del timer : 33208
Heap all'avvio del timer2 : 35184
Heap dopo assegnazione semaphore3 in timer2 : 35184
Heap all'avvio di application.lua : 32224
Heap all'avvio 1 di a.lua : 33240
A a.lua : 28704
B a.lua : 30864
Function platform_gpio_mode() is called. pin_mux:1610614844, func:0
C a.lua : 30240
D a.lua : 29664
userdata: 0x3fff2198
E a.lua : 29512
8
F a.lua : 29632
G a.lua : 29592
H a.lua : 29592
I a.lua : 29592
J a.lua : 30160
K a.lua : 30160
Heap alla chiusura 2 di a.lua : 30160
Heap alla chiusura 1 di a.lua : 30136
Heap dopo garbace collector : 32728
8 �
Heap dopo controllo semaphore1 in application : 32648
Heap all'avvio 1 di b.lua : 32600
Heap all'avvio 2 di b.lua : 31416
FINISHED TO WRITE
Heap alla chiusura 2 di b.lua : 31976
Heap alla chiusura 1 di b.lua : 31896
Heap alla chiusura di application.lua : 32616

Я думаю, что проблема заключается в распределении томов и биосов, но я пытался собирать мусор, помещать их в ноль и собирать мусор, размещать их локально, выкладывать их локально и собирать мусор. Lua VM не освобождает свое пространство, которое занимает около 600 в куче каждый цикл между B и C и печатью C и D, пожалуйста, мне нужна помощь в этом

1 Ответ

0 голосов
/ 21 мая 2018

Я обнаружил проблему. Это связано с тем, что структура используемых данных, таких как vol и bios, создается с помощью вызовов функций. Они могут быть собраны сборщиком мусора, если на них нет указателя, но только если вы используете реализованный ими метод, чтобы освободить их внутренние ссылки на их личные данные, выделенные их библиотекой в ​​их функции создателя. Так что bios: close () позволяет передавать bios, но vol, который больше не имеет реализованной функции vol: umount (), не может быть освобожден. Таким образом, каждый цикл выделяет новый том без дислокации предыдущего

...