Trying to configure more than 8 buttons interrupts returns -12 error just when enable CONFIG_DEBUG.

Hello,

I am developing an application using nRF52840 with the NRF Connect SDK version 2.4.0 based on Matter: Template sample and I configured 10 buttons interrupts successfully as following:


/*First feedbackPin*/
#define fb5_NODE	DT_ALIAS(fb5)
#if !DT_NODE_HAS_STATUS(fb5_NODE, okay)
#error "Unsupported board: fb5 devicetree alias is not defined"
#endif
static const struct gpio_dt_spec feedbackPin_1 = GPIO_DT_SPEC_GET_OR(fb5_NODE, gpios,
							      {0});

/*Second feedbackPin*/
#define fb6_NODE	DT_ALIAS(fb6)
#if !DT_NODE_HAS_STATUS(fb6_NODE, okay)
#error "Unsupported board: fb6 devicetree alias is not defined"
#endif
static const struct gpio_dt_spec feedbackPin_2 = GPIO_DT_SPEC_GET_OR(fb6_NODE, gpios,
							      {0});

/*Third feedbackPin*/
/*Forth feedbackPin*/
/*Fifth feedbackPin*/
/*Sixth feedbackPin*/

/*Ninth feedbackPin*/

/*Tenth feedbackPin*/
#define fb14_NODE_	DT_ALIAS(fb14)
#if !DT_NODE_HAS_STATUS(fb14_NODE_, okay)
#error "Unsupported board: fb14 devicetree alias is not defined"
#endif
static const struct gpio_dt_spec feedbackPin_10 = GPIO_DT_SPEC_GET_OR(fb14_NODE_, gpios,
							      {0});




static struct gpio_callback feedback_cb_data_1st;
static struct gpio_callback feedback_cb_data_2nd;
static struct gpio_callback feedback_cb_data_3rd;
static struct gpio_callback feedback_cb_data_4th;
static struct gpio_callback feedback_cb_data_5th;
static struct gpio_callback feedback_cb_data_6th;
static struct gpio_callback feedback_cb_data_7th;
static struct gpio_callback feedback_cb_data_8th;
static struct gpio_callback feedback_cb_data_9th;




CHIP_ERROR AppTask::Init()
{

/*Some Initialization Code*/


	int ret_;

/*First feedbackPin*/
	if (!gpio_is_ready_dt(&feedbackPin_1)) {
		printk("Error: feedbackPin_1 device %s is not ready\n",
		       feedbackPin_1.port->name);
		ret_ = 1;
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_configure_dt(&feedbackPin_1, GPIO_INPUT);
	if (ret_ != 0) {
		printk("Error %d: failed to configure %s pin %d\n",
		       ret_, feedbackPin_1.port->name, feedbackPin_1.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_1,
					      GPIO_INT_EDGE_RISING);
	if (ret_ != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %d\n",
			ret_, feedbackPin_1.port->name, feedbackPin_1.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	gpio_init_callback(&feedback_cb_data_1st, feedback_EventHandler, BIT(feedbackPin_1.pin));
	gpio_add_callback(feedbackPin_1.port, &feedback_cb_data_1st);
	printk("Set up feedbackPin_1 at %s pin %d\n", feedbackPin_1.port->name, feedbackPin_1.pin);


/*Second feedbackPin*/
	if (!gpio_is_ready_dt(&feedbackPin_2)) {
		printk("Error: feedbackPin_2 device %s is not ready\n",
		       feedbackPin_2.port->name);
		ret_ = 1;
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_configure_dt(&feedbackPin_2, GPIO_INPUT);
	if (ret_ != 0) {
		printk("Error %d: failed to configure %s pin %d\n",
		       ret_, feedbackPin_2.port->name, feedbackPin_2.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_2,
					      GPIO_INT_EDGE_RISING);
	if (ret_ != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %d\n",
			ret_, feedbackPin_2.port->name, feedbackPin_2.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	gpio_init_callback(&feedback_cb_data_2nd, feedback_EventHandler, BIT(feedbackPin_2.pin));
	gpio_add_callback(feedbackPin_2.port, &feedback_cb_data_2nd);
	printk("Set up feedbackPin_2 at %s pin %d\n", feedbackPin_2.port->name, feedbackPin_2.pin);


/*Third feedbackPin*/
	if (!gpio_is_ready_dt(&feedbackPin_3)) {
		printk("Error: feedbackPin_3 device %s is not ready\n",
		       feedbackPin_3.port->name);
		ret_ = 1;
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_configure_dt(&feedbackPin_3, GPIO_INPUT);
	if (ret_ != 0) {
		printk("Error %d: failed to configure %s pin %d\n",
		       ret_, feedbackPin_3.port->name, feedbackPin_3.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_3,
					      GPIO_INT_EDGE_RISING);
	if (ret_ != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %d\n",
			ret_, feedbackPin_3.port->name, feedbackPin_3.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	gpio_init_callback(&feedback_cb_data_3rd, feedback_EventHandler, BIT(feedbackPin_3.pin));
	gpio_add_callback(feedbackPin_3.port, &feedback_cb_data_3rd);
	printk("Set up feedbackPin_3 at %s pin %d\n", feedbackPin_3.port->name, feedbackPin_3.pin);


/*Forth feedbackPin*/
	if (!gpio_is_ready_dt(&feedbackPin_4)) {
		printk("Error: feedbackPin_4 device %s is not ready\n",
		       feedbackPin_4.port->name);
		ret_ = 1;
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_configure_dt(&feedbackPin_4, GPIO_INPUT);
	if (ret_ != 0) {
		printk("Error %d: failed to configure %s pin %d\n",
		       ret_, feedbackPin_4.port->name, feedbackPin_4.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_4,
					      GPIO_INT_EDGE_RISING);
	if (ret_ != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %d\n",
			ret_, feedbackPin_4.port->name, feedbackPin_4.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	gpio_init_callback(&feedback_cb_data_4th, feedback_EventHandler, BIT(feedbackPin_4.pin));
	gpio_add_callback(feedbackPin_4.port, &feedback_cb_data_4th);
	printk("Set up feedbackPin_4 at %s pin %d\n", feedbackPin_4.port->name, feedbackPin_4.pin);


/*Fifth feedbackPin*/

/*Sixth feedbackPin*/

/*Seventh feedbackPin*/

/*Eighth feedbackPin*/



/*Ninth feedbackPin*/
	if (!gpio_is_ready_dt(&feedbackPin_9)) {
		printk("Error: feedbackPin_9 device %s is not ready\n",
		       feedbackPin_9.port->name);
		ret_ = 1;
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_configure_dt(&feedbackPin_9, GPIO_INPUT);
	if (ret_ != 0) {
		printk("Error %d: failed to configure %s pin %d\n",
		       ret_, feedbackPin_9.port->name, feedbackPin_9.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	ret_ = gpio_pin_interrupt_configure_dt(&feedbackPin_9,
					      GPIO_INT_EDGE_RISING);
	if (ret_ != 0) {
		printk("Error %d: failed to configure interrupt on %s pin %d\n",
			ret_, feedbackPin_9.port->name, feedbackPin_9.pin);
		return chip::System::MapErrorZephyr(ret_);
	}

	gpio_init_callback(&feedback_cb_data_9th, feedback_EventHandler, BIT(feedbackPin_9.pin));
	gpio_add_callback(feedbackPin_9.port, &feedback_cb_data_9th);
	printk("Set up feedbackPin_9 at %s pin %d\n", feedbackPin_9.port->name, feedbackPin_9.pin);

/*Tenth feedbackPin*/



	return CHIP_NO_ERROR;
}




void AppTask::feedback_EventHandler(const struct device *dev, struct gpio_callback *cb,
		    uint32_t pins)
{
	LOG_INF("Feedback_EventHandler: ");//%s \n", dev.port->name);
}


The build and flash process succeeded.

Issue Description: In my prj_no_dfu.conf file, I enabled debugging using CONFIG_DEBUG option and the application built successfully. However, when I flash the code to the board I got an -12 error from 

gpio_pin_interrupt_configure_dt(&feedbackPin_9, GPIO_INT_EDGE_RISING);


The error message:

Error -12: failed to configure interrupt on gpio@50000000 pin 28
E: Exited with code 200000c

Even If I change the pin or increase the main stack size or the system work queue stack size the problem still exist.

CONFIG_MAIN_STACK_SIZE=16384
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=8192

Important notes:

  • The application ran successfully with 10 interrupts but without enabling the debugging config.
  • All the interrupts configured with the same callback function "feedback_EventHandler()".

Best reagrds,

Basem

Parents Reply Children
No Data
Related