我想为ESP8266或ESP32微控制器创建一个Arduino库。我写了一个测试库,它在Arduino Nano板上运行没有问题。这里是库cpp文件:
#include "Test.h"
Test::Test(){
}
uint32_t Test::libTest(strcttest* t){
uint32_t w;
w = t->a;
return w;
}
这是头文件:
#include <Arduino.h>
typedef struct {
uint32_t a;
uint32_t b;
}strcttest;
class Test
{
public:
Test();
uint32_t libTest(strcttest* t);
private:
};
最后但并非最不重要的是Arduino ino文件:
#include <Test.h>
//Instante Test
Test t;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Start");
}
void loop() {
// put your main code here, to run repeatedly:
//Create structure
strcttest *tt;
tt->a=1;
tt->b=2;
//Output result
Serial.println (t.libTest(tt));
delay(1000);
}
使用Arduino Nano板以及ESP8266 / ESP32板进行编译。当我在Nano Board上运行时,我得到了预期的结果:
Start
1
1
1
1
1
1
1
1
1
...
当我在ESP8266板上运行时,我得到以下崩溃结果:
l*⸮⸮⸮⸮CI>⸮⸮⸮HB⸮⸮Start
Exception (28):
epc1=0x402024f8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: cont
sp: 3ffef7d0 end: 3ffef9a0 offset: 01a0
>>>stack>>>
3ffef970: feefeffe 00000000 3ffee950 40201eb4
3ffef980: feefeffe feefeffe 3ffee96c 40202340
3ffef990: feefeffe feefeffe 3ffee980 40100108
<<<stack<<<
7!a!*6⸮⸮⸮Start
Exception (28):
epc1=0x402024f8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
ctx: cont
sp: 3ffef7d0 end: 3ffef9a0 offset: 01a0
>>>stack>>>
3ffef970: feefeffe 00000000 3ffee950 40201eb4
3ffef980: feefeffe feefeffe 3ffee96c 40202340
3ffef990: feefeffe feefeffe 3ffee980 40100108
<<<stack<<<
ĜBs⸮`⸮"⸮⸮Start
...
最后但并非最不重要的是我收到的ESP开发板:
i%M/⸮`⸮i%M7
⸮⸮%Q=qU=\Md⸮aGd<$⸮Start
Guru Meditation Error of type LoadProhibited occurred on core 1. Exception was unhandled.
Register dump:
PC : 0x400dde93 PS : 0x00060030 A0 : 0x800d0570 A1 : 0x3ffc7390
A2 : 0x3ffc1c30 A3 : 0x00000000 A4 : 0x0800001c A5 : 0xffffffff
A6 : 0xffffffff A7 : 0x00060d23 A8 : 0x800832e9 A9 : 0x3ffc7380
A10 : 0x00000003 A11 : 0x00060023 A12 : 0x00060020 A13 : 0x00000003
A14 : 0x00000001 A15 : 0x00000000 SAR : 0x0000001f EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Backtrace: 0x400dde93:0x3ffc7390 0x400d0570:0x3ffc73b0 0x400d79b0:0x3ffc73d0
CPU halted.
所以我的问题是:我做错了什么。我错过了什么我还没有用Arduino IDE,cpp,指针等理解
抱歉,我忘记了:我使用的是Arduino IDE 1.8.2
答案 0 :(得分:0)
strcttest *tt;
是你的问题。你没有为类型strcttest
分配内存和创建类型的对象 - 你只是为指向该类型对象的指针分配内存。基本上,当你的代码到达行tt->a=1;
时,代码应该在任何地方都崩溃。在Nano上运行时它没有这个事实基本上是运气不好..
考虑一下你有一个char *变量,然后尝试将一个字符串复制到它的情况 - 它也会崩溃,因为你没有任何存储空间用于字符串本身 - 你只有几个字节分配给存储字符串的地址。
以下是void loop()
函数的更合理实现:
void loop() {
// put your main code here, to run repeatedly:
//Create structure
strcttest tt;
tt.a=1;
tt.b=2;
//Output result
Serial.println (t.libTest(&tt));
delay(1000);
}
另一个(由于使用new和delete更慢)实现可能如下所示:
void loop() {
// put your main code here, to run repeatedly:
//Create structure
strcttest *tt = new strcttest;
tt->a=1;
tt->b=2;
//Output result
Serial.println (t.libTest(tt));
delete tt;
delay(1000);
}
答案 1 :(得分:0)
对于ESP32和ESP8266,有一个出色的工具可以在崩溃时提供帮助, 像你这样报告。
这集成到Arduino IDE