Hi, I have a simple application with logic is:
- every 3 or 20 seconds send some data via modem (based on AT commands),
- sending and receiving data via serial port to and from the modem,
Application:
I)
When we take MCU ON the application each 3s is asking about the range (till range == true). After then the timer is switching TIME_INTERVAL from 3s to for example each 20s
II)
If we have a range app. is sending in each timer interrupt some short data.
Problem description:
I'm using two interrupt handlers, first is from the timer and second is from a serial port. When I wrote the code application was hang up each time during sending the data. By the trial-and-error method, I found that if I will change in NRF_SERIAL_DRV_UART_CONFIG_DEF()
UART_DEFAULT_CONFIG_IRQ_PRIORITY) to 1
All start works fine.
I spoke with my friend and he tells me that I should use scheduler and maybe then such situation shouldn't have a place.
I put the code from nrf_serial_evt_handler() to scheduler but the problem is the same:
if UART_DEFAULT_CONFIG_IRQ_PRIORITY then an application is hanging but when I change the prior to 1 start works fine.
Question:
How it should look like properly of using the scheduler in my case? and what I'm doing wrong?
Code parts:
int main(void)
{
ret_code_t ret;
/*Initialization, peripheral configuration.*/
board_system_init();
/*Application part*/
bc95_rst();
application_timers_start();
/*Say hello*/
ret = nrf_serial_write(&serial_uart, "Sensor is ready.\r\n", strlen("NBIoT sensor ready.\r\n"), NULL, NRF_SERIAL_MAX_TIMEOUT);
APP_ERROR_CHECK(ret);
while (true)
{
app_sched_execute();
CheckBuffer();
}
}
void nrf_serial_evt_handler(struct nrf_serial_s const * p_serial, nrf_serial_event_t event){
if(event == NRF_SERIAL_EVENT_RX_DATA){
/*if rx any char - put it to array*/
app_sched_event_put(NULL, 0, serial_scheduler_event_hanler);
}else if (event == NRF_SERIAL_EVENT_TX_DONE) {
/*invert led if something was send via serial to modem*/
bsp_board_led_invert(3);
}
}
void app_timer_timeout_handler(void * p_context){
ret_code_t err_code, ret;
app_timer_pause();
if (rangeNB == false) {
rangeReady();
}else if (rangeNB == true && lng_int_set == false) {
/*If we have range we can change time interval*/
app_timer_stop(m_app_timer_id);
err_code = app_timer_start(m_app_timer_id, TIMER_INTERVAL_20S , NULL);
APP_ERROR_CHECK(err_code);
app_timer_pause();
lng_int_set = true;
ret = nrf_serial_write(&serial_uart, "changing time interval to 20s\n", strlen("changing time interval to 20s\n"), NULL, 0);
APP_ERROR_CHECK(ret);
bsp_board_led_on(1); /*Device have a range*/
}else if (rangeNB == true && lng_int_set == true) {
/*
* Make measurment and send it -
* - not elegant construction because we are in interrupt handler (try move it to scheduler)
* */
char tx_mesg_open[] = "AT+NSOCR=DGRAM,17,5000,0\r\n";
char tx_mesg_udp[] = "AT+NSOST=0,000.000.000.000,5000,4,64757061\r\n";
char tx_mesg_close[] = "AT+NSOCL=0\r\n";
(void)nrf_serial_write(&serial_uart, tx_mesg_open, strlen(tx_mesg_open), NULL, 0);
nrf_delay_ms(50);
(void)nrf_serial_write(&serial_uart, tx_mesg_udp, strlen(tx_mesg_udp), NULL, 0);
nrf_delay_ms(50);
(void)nrf_serial_write(&serial_uart, tx_mesg_close, strlen(tx_mesg_close), NULL, 0);
nrf_delay_ms(50);
}
app_timer_resume();
}
Logs from serial port:
Board to modem> [13:41:54:219] Sensor is ready.␍␊
Board to modem> [13:42:00:206] AT+CSQ␍␊
Modem to board> [13:42:00:228] +CSQ:21,99␍␊
Modem to board> [13:42:00:228] OK␍␊
Board to modem> [13:42:03:229] changing time interval to 20s␊
Board to modem> [13:42:23:199] A
//After print "A" mcu hangs