arduino / arduino/ArduinoCore-mbed

detachInterrupt causes Pico to crash

Open
#392 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C
Stars
411
Forks
225
PR merge metrics
No merged PRs in 30d

Description

OS: Windows 10
Board: Raspberry Pi Pico
IDE: Arduino IDE Version: 1.8.19
Mbed OS: Version 2.6.1

Context
I wrote some test code (below) for handling interrupts and my Pico crashes every time the detachInterrupt(pin_num); line is called. The onboard LED begins flashing 3-4 time slowly, then 3-4 time quickly, then repeats.

Problem
Here's the code snippet to reproduce the issue:

int but_in_1 = 12;
int but_in_2 = 13;
int but_in_3 = 14;
int but_in_4 = 15;
int led_out_1 = 16;
int led_out_2 = 17;
bool allow_input = false;
bool is_interrupt = false;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
interrupt_pin_enable(but_in_1);
//attachInterrupt(digitalPinToInterrupt(but_in_1),ZeroDetection,FALLING);
//pinMode(but_in_1, INPUT_PULLUP);
pinMode(but_in_2, INPUT_PULLUP);
pinMode(but_in_3, INPUT_PULLUP);
pinMode(but_in_4, INPUT_PULLUP);
pinMode(led_out_1, OUTPUT);
pinMode(led_out_2, OUTPUT);
digitalWrite(led_out_1, HIGH);
digitalWrite(led_out_2, LOW);
}
void loop() {
if (allow_input){
if (digitalRead(but_in_2) == 0){
digitalWrite(led_out_1, !digitalRead(led_out_1));
digitalWrite(led_out_2, !digitalRead(led_out_2));
allow_input = false;
}
}
if ((digitalRead(but_in_3) == 0) && (digitalRead(but_in_4) == 0)){
interrupt_pin_enable(but_in_1);
}
if (allow_input == false){
if ((digitalRead(but_in_2) == 0) && (digitalRead(but_in_4) == 0)){
interrupt_pin_disable(but_in_1);
}
}
Serial.print(F("Button 1 Status: "));
Serial.print(digitalRead(but_in_1));
Serial.print(F(", Button 2 Status: "));
Serial.print(digitalRead(but_in_2));
Serial.print(F(", Button 3 Status: "));
Serial.print(digitalRead(but_in_3));
Serial.print(F(", Button 4 Status: "));
Serial.print(digitalRead(but_in_4));
Serial.print(F(", Interrupt Enabled: "));
Serial.print(is_interrupt);
Serial.print(F(", Allow Input: "));
Serial.println(allow_input);
}
void ZeroDetection(){
allow_input = true;
interrupt_pin_disable(but_in_1);
}
void interrupt_pin_enable(int pin_num){
if (is_interrupt == false){
is_interrupt = true;
attachInterrupt(digitalPinToInterrupt(pin_num),ZeroDetection,FALLING);
pinMode(pin_num, INPUT_PULLUP);
}
}
void interrupt_pin_disable(int pin_num){
if (is_interrupt){
is_interrupt = false;
detachInterrupt(pin_num); <--ISSUE LINE
//pinMode(pin_num, INPUT_PULLUP);
}
}
``

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the provided interrupt sketch on the Raspberry Pi Pico and trace the detachInterrupt(pin_num) call in the ArduinoCore-mbed implementation. Done means disabling the interrupt no longer crashes the board and the reported interrupt behavior remains correct.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, raspberry-pi
Domain
embedded-iot
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.