k_sem_take with K_FOREVER does not work in the main thread.

So I have a timer interrupt setup which triggers every 1ms in the interrupt I give the semaphore with 

void sensor_timer_event_handler(nrf_timer_event_t event_type, void * p_context)
{
    switch(event_type) {
        case NRF_TIMER_EVENT_COMPARE0:
            k_sem_give(&drdy_sem);
            // gpio_pin_toggle_dt(&dbg_pin);
            break;
        default:
            break;
    }
}


The interrupt triggers correctly as seen from logic analyzer

this should unblock the main thread

/* Main Function */
int main(void)
{
	int ret, err;
	uint32_t reset_cause;
	// k_msleep(10000);
	hwinfo_get_reset_cause(&reset_cause);
	print_reset_cause(reset_cause);
	
	ret = gpio_is_ready_dt(&dbg_pin);
	if (!ret)
	{
		LOG_ERR("DBG Pin not ready.");
		return -EIO;
	}
    
	ret = gpio_pin_configure_dt(&dbg_pin, GPIO_OUTPUT_INACTIVE);
	if (ret != 0)
	{
		LOG_ERR("Unable to configure dbg pin");
	}

	sensor_timer_init();
	sensor_timer_repeated_start(US_FOR_1KHZ);

	while (true)
	{

		err = k_sem_take(&drdy_sem, K_FOREVER);
		if (err != 0)
		{
			LOG_ERR("Error taking drdy sem: %d", err);
			
		}

		gpio_pin_toggle_dt(&dbg_pin);
		int a = 1 + 3;
		int b = a;

	}
	return 0;
}

The main thread does not run but if I change it to like this then it runs properly but then the thread runs continously which is not good for power management.

		err = k_sem_take(&drdy_sem, K_NO_WAIT);
		if (err != 0)
		{
			LOG_ERR("Error taking drdy sem: %d", err);
		}
		else 
		{
			gpio_pin_toggle_dt(&dbg_pin);
			int a = 1 + 3;
			int b = a;
		}


My prj.conf file
CONFIG_USB_DEVICE_STACK_NEXT=y
CONFIG_USBD_HID_SUPPORT=y
CONFIG_USBD_LOG_LEVEL_WRN=y
CONFIG_USBD_HID_LOG_LEVEL_WRN=y
CONFIG_UDC_DRIVER_LOG_LEVEL_WRN=y
# CONFIG_UDC_BUF_POOL_SIZE=5000

CONFIG_GPIO=y

CONFIG_IPC_SERVICE=y
CONFIG_IPC_SERVICE_BACKEND_ICMSG=y
CONFIG_MBOX=y

# Disable UART Console and enable the RTT console
CONFIG_LOG=y
# CONFIG_UART_CONSOLE=n
CONFIG_RTT_CONSOLE=y
CONFIG_USE_SEGGER_RTT=y

CONFIG_ASSERT=y

CONFIG_SOC_NRF53_CPUNET_ENABLE=y

CONFIG_STDOUT_CONSOLE=y
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_SETTINGS=y
CONFIG_SETTINGS_RUNTIME=y
CONFIG_NVS=y
CONFIG_SETTINGS_NVS=y
CONFIG_HEAP_MEM_POOL_SIZE=256
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_NORDIC_QSPI_NOR=n
CONFIG_SENSOR=y
CONFIG_NRF_FUEL_GAUGE=y
CONFIG_REGULATOR=y
CONFIG_REQUIRES_FLOAT_PRINTF=y

CONFIG_NRFX_SPIM4=y

CONFIG_NRFX_TIMER1=y

CONFIG_POWEROFF=y
CONFIG_HWINFO=y


I want to run this properly I am not sure why this is not working. Any help will be highly appreciated. 
Thanks

Parents Reply Children
No Data
Related