Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ESP crashes when you add attachInterrupt #47

Open
jeroenveer opened this issue May 1, 2023 · 5 comments
Open

ESP crashes when you add attachInterrupt #47

jeroenveer opened this issue May 1, 2023 · 5 comments

Comments

@jeroenveer
Copy link

When you add a GPIO interrupt it keeps crashing.
Without the CAN library it runs fine and without attachInterrupt it also runs fine.

#include <esp32_can.h>

int SpeedCounter = 0;

void ARDUINO_ISR_ATTR ISR_SPEEDCOUNT() {
	SpeedCounter++;
}

void setup() {

	pinMode(22, INPUT_PULLUP);
	attachInterrupt(22, ISR_SPEEDCOUNT, FALLING);
}

void loop() {
  
}

rst:0xc (SW_CPU_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:1
load:0x3fff0030,len:1184
load:0x40078000,len:13220
ho 0 tail 12 room 4
load:0x40080400,len:3028
entry 0x400805e4
E (134) gpio: esp_ipc_call_blocking failed (0x103)
[ 2][E][esp32-hal-gpio.c:175] __attachInterruptFunctionalArg(): GPIO ISR Service Failed To Start
E (137) esp_cor��fVW�}���͡� No core dump partition found!
E (141) esp_core_dump_flash: No core dump partition found!
[ 17][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
E (38) gpio: gpio_install_isr_service(449): GPIO isr service already installed
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400f165b PS : 0x00060e33 A0 : 0x800d5907 A1 : 0x3ffb21d0
A2 : 0x00000000 A3 : 0x3ffc3040 A4 : 0x3ffc3044 A5 : 0x00060e23
A6 : 0x00060e20 A7 : 0x00000001 A8 : 0x800d5550 A9 : 0x3ffb2190
A10 : 0x3ffbdbf0 A11 : 0x00400000 A12

@collin80
Copy link
Owner

collin80 commented May 1, 2023

Hmm, apparently I hadn't ever tried this. I suspect it may have something to do with this line in your output:
E (38) gpio: gpio_install_isr_service(449): GPIO isr service already installed

When I get a chance I'll try to get to the bottom of this.

@jeroenveer
Copy link
Author

I have disabled this line
MCP2515 __attribute__((weak)) CAN1(15, 33) ;

only using the internal CAN on this board, on another board i use both internal and external mcp25625.
So will enable/disable this in the library when i switch boards.

@jeroenveer
Copy link
Author

Tested the MCP25625 and can transmit is working but it would not receive, it only received when there was a msg transmitted.
The interrupt was not working giving the error:
E (134) gpio: esp_ipc_call_blocking failed (0x103)
[ 2][E][esp32-hal-gpio.c:175] __attachInterruptFunctionalArg(): GPIO ISR Service Failed To Start

I disabled the attachInterrupt in mcp2515.cpp

MCP2515::MCP2515(uint8_t CS_Pin, uint8_t INT_Pin) : CAN_COMMON(6) {
  pinMode(CS_Pin, OUTPUT);
  digitalWrite(CS_Pin,HIGH);
  //pinMode(INT_Pin,INPUT);
  //digitalWrite(INT_Pin,HIGH);
  
  //attachInterrupt(INT_Pin, MCP_INTHandler, FALLING);

and added IRAM_ATTR:

void IRAM_ATTR MCP_INTHandler() {
  BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  vTaskNotifyGiveFromISR(intDelegateTask, &xHigherPriorityTaskWoken); //send notice to the handler task that it can do the SPI transaction now
  if (xHigherPriorityTaskWoken == pdTRUE) portYIELD_FROM_ISR(); //if vTaskNotify will wake the task (and it should) then yield directly to that task now
}

and set the INT pin in setup:

	CAN1.setINTPin(33);
	if (CAN1.begin(500000))
	{
		Serial.println("MCP2517FD Init OK ...");
	}
	else {
		Serial.println("MCP2517FD Init Failed ...");
	}
	CAN1.watchFor(); //allow anything through

Receiving is now working with interrupts.
And adding additional GPIO interrupt is now also working.

@jeroenveer
Copy link
Author

This also works instead of in setup

bool MCP2515::_init(uint32_t CAN_Bus_Speed, uint8_t Freq, uint8_t SJW, bool autoBaud) {
    setINTPin(_INT);

@jeroenveer
Copy link
Author

Just make the changes discriped above in your library.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants