我在这里向您询问有关在执行代码期间发生的错误的一些帮助 . 我正在使用Lua编写Adafruit Feather HUZZAH ESP8266电路板和最新的NodeMCU主固件 . 我想从SD卡中的.bin文件中读取值并将其显示在靠近其十进制地址位置的监视器上,项目的其余部分将其写入带有SPI的ROM但在我必须解决此问题之前,所以有一些注释代码是不必要的 .
这是代码:
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
我想到了串行监视器Buff饱和度,所以我尝试了它没有打印搜索和字节,但它出现了同样的错误 . 在我想到了65字节的问题后,我设置了一个比65更高的值,但它只读取其余的64个字节,并且在使用相同的代码出错之后 . 所以我认为它类似于内存饱和错误但是调用垃圾收集函数来查看空闲内存在每个循环中总是告诉相同的空闲内存值,如果我垃圾收集每个循环错误都不会消失 . 我读了一些关于堆内存饱和的内容,所以我试图在每个周期使用dofile在一个单独的文件中调用该函数,并保留函数局部的一些变量,但这没有帮助 . 我该如何解决这个问题?我无法上传二进制文件,但它是64 MB,我读取1字节的周期,我不认为问题是文件 .
UPDATE
这是新的代码文件:
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
我认为问题是vol和bios的分配但是我尝试了垃圾收集,把它们放在零和垃圾收集,把它们放在本地,把它们放在本地和垃圾收集 . Lua VM没有释放他们的空间,在B和C以及C和D打印之间的每个cicle堆中大约需要600个空间,请我需要帮助
1 回答
我发现了这个问题 . 这是因为像vol和bios这样的usedata结构是由c函数调用产生的 . 如果没有指向它们的指针,它们可以被垃圾收集器收集,但前提是你使用它们实现的方法来释放它们的内部引用,这些引用是由它们的库在其创建者函数中分配的私有数据 . 所以bios:close()让bios被重新连接,但vol,不再有vol:umount()函数实现不能被释放 . 因此,每个周期它都会分配一个新的音量,而不会释放前一个音量