Description
Make your question, not a Statement, inclusive. Include all pertinent information:
What you are trying to do?
While writing firmware, I stumbled in puzzling crashes. This firmware used to work fine with arduino-esp32 2.0.0.
I reverted back to 1.0.6 and it worked. No compiler errors were thrown with both.
The crashes sometimes produced a Guru Meditation Error, sometimes it was stuck and the watchdog would trigger, sometimes it simply rebooted.
By reverting to the previous commit, and adding bit of new code at a time, I pinpointed the culprit.
An initialization function declared with a bool, had no returned values.
Latest print on Serial was "pin set" and then boom.
Looking closely, the firmware throws a warning:
[...] In function 'bool mcp23008Init()':
[...]:2570:1: warning: no return statement in function returning non-void [-Wreturn-type]
The line corresponds to the end of the mcp23008Init function.
setup () {
[...]
if(i2cScan(0,0x20)) { //look for MCP23008 (bus 0, addr 20)
mcp23008status = true;
out.println(F("found"));
mcp23008Init();
mcp.digitalWrite(ioCameraPin, LOW);
mcp.digitalWrite(ioHotspotPin, LOW);
mcp.digitalWrite(ioBuzzerPin, LOW);
mcp.digitalWrite(ioLoraPin, LOW);
mcp.digitalWrite(ioSpotlightPin, LOW);
mcp.digitalWrite(ioInverterPin, LOW);
mcp.digitalWrite(ioLeftLedPin, LOW);
mcp.digitalWrite(ioRightLedPin, LOW);
out.println("Pin low");
} else {
out.println("MCP23008 not found!");
blinkDelay = 1000;
errorCode = setErrorBit(errorCode,3,1); //3rd bit is mcp23008 error
}
[...]
}
bool mcp23008Init() {
if(!mcp.begin(0x20,&Wire)) {
errorCode = setErrorBit(errorCode,3,1); //3nd bit is MCP23008 error
out.println(F("MCP23008 init failed!"));
} else {
out.println("Initialized");
errorCode = setErrorBit(errorCode,3,0); //clear error
mcp.pinMode(ioCameraPin, OUTPUT);
mcp.pinMode(ioHotspotPin, OUTPUT);
mcp.pinMode(ioBuzzerPin, OUTPUT);
mcp.pinMode(ioLoraPin, OUTPUT);
mcp.pinMode(ioSpotlightPin, OUTPUT);
mcp.pinMode(ioInverterPin, OUTPUT);
mcp.pinMode(ioLeftLedPin, OUTPUT);
mcp.pinMode(ioRightLedPin, OUTPUT);
out.println("Pin set");
}
}
Hardware:
Board: ESP32 Dev Module
Core Installation version: 2.0.0 (crash), 1.0.6 (working)
IDE name: Platform.io
Flash Frequency: 40Mhz
PSRAM enabled: no
Upload Speed: 115200
Computer OS: Windows 10
According to some StackOverflow posts, declaring a non-void function without returning a result is undefined behavior. Probably some compiler settings changed between 1.0.6 and 2.0.0
https://stackoverflow.com/questions/57163022/c-crash-on-a-non-void-function-doesnt-have-return-statement
When changed the function to void, the code works with 2.0.0. as usual.
It is not a arduino-esp32 bug.
I would expect a compiler error, not a warning. However, if this is not possible, the noobs like me should be aware!
Metadata
Metadata
Assignees
Type
Projects
Status