Timer interruption is unstable with wifi thread
Posted: Sun Jun 13, 2021 12:38 pm
Hello, i have some confusing problems with timer interrupt and freertos thread.
i ran wifi thread in core 0 and spi thread in core 1.
i used timer group 0 with every 200us interrupted as hardware timer source.
In timer callback , i just put AD7606 convert in order to get accuracy sampling rate and gave notify to SPI thread.
## There is timer code
Then, SPI receive notify from timer callback.
## there is wifi thread.
In Oscilloscope , timer interrupt callback was strange because i found GPIO convert pin will happen in spi transaction.
Assumption 1 : wifi thread priority is higher than timer callback ?
Assumption 2 : timer callback with RTOS is unstable
If my assumption are correct, how could i resolve this problem??
Or, i missed some important factors ? Please give me some advice or solutions to this problem .
Thanks a lot
i ran wifi thread in core 0 and spi thread in core 1.
i used timer group 0 with every 200us interrupted as hardware timer source.
In timer callback , i just put AD7606 convert in order to get accuracy sampling rate and gave notify to SPI thread.
## There is timer code
Code: Select all
void Timer_Init(timer_group_t Timer_Group, timer_idx_t Timer_id, uint32_t Divider, uint64_t Timer_Ovfl, bool Timer_reload, TaskHandle_t *Taskptr)
{
//define Struct for ISR Pointer
Timer_Spec_t *Timer_Specs_p = calloc(sizeof(Timer_Spec_t), 1);
Timer_Specs_p->Taskptr = *Taskptr;
Timer_Specs_p->Timer_id = Timer_id;
//Timer Init. Group0, Timer0
timer_config_t timer_basis;
timer_basis.divider = Divider;
timer_basis.counter_dir = TIMER_COUNT_UP;
timer_basis.counter_en = TIMER_PAUSE;
timer_basis.alarm_en = TIMER_ALARM_EN;
timer_basis.auto_reload = Timer_reload;
timer_basis.intr_type = TIMER_INTR_LEVEL;
//Init Timer
timer_init(Timer_Group, Timer_id, &WPC_timer_basis);
//Set timer to start value
timer_set_counter_value(Timer_Group, Timer_id, 0x00000000ULL);
//Set timer alarm
timer_set_alarm_value(Timer_Group, Timer_id, Timer_Ovfl);
//Interrupt enable
timer_enable_intr(Timer_Group, Timer_id);
timer_isr_register(Timer_Group, Timer_id, timer_group0_isr, (void *) Timer_Specs_p, ESP_INTR_FLAG_NMI || ESP_INTR_FLAG_IRAM, NULL);
//Timer start
timer_start(Timer_Group, Timer_id);
}
void IRAM_ATTR timer_group0_isr(void *para)
{
//save the data from the pointer
Timer_Spec_t *Settings = (Timer_Spec_t *) para;
//Get interrupt status
uint32_t intr_status = TIMERG0.int_st_timers.val;
//Delete interrupt flags
TIMERG0.int_clr_timers.t0 = 1;
//Reactivate alarm
TIMERG0.hw_timer[Settings->Timer_id].config.alarm_en = TIMER_ALARM_EN;
gpio_set_level(GPIO_CONVERT, 0);
gpio_set_level(GPIO_CONVERT, 1);
xTaskNotifyFromISR(Settings->Taskptr,0x00,eNoAction,NULL);
portYIELD_FROM_ISR();
}
Code: Select all
void spi_thread(void *pvParameters){
spi_bus_config_t buscfg={
.miso_io_num=GPIO_MISO,
.mosi_io_num=GPIO_MOSI,
.sclk_io_num=GPIO_SCLK,
.quadwp_io_num=-1,
.quadhd_io_num=-1
};
spi_device_interface_config_t devcfg = {
.clock_speed_hz = 10000000,
.mode = 0,
.spics_io_num = GPIO_CS,
.queue_size = 8
};
//Initialize the SPI bus
ret = spi_bus_initialize(VSPI_HOST, &buscfg, 2);
assert(ret == ESP_OK);
ret = spi_bus_add_device(VSPI_HOST, &devcfg, &dev);
assert(ret == ESP_OK);
uint32_t remain ;
spi_transaction_t trans = {
.length = 8*8,
.tx_buffer = tx_data,
.rx_buffer = (void*)rx_data };
while(1){
xTaskNotifyWait(0x00, 0xffffffff, NULL, portMAX_DELAY);
ret = spi_device_transmit(dev, &trans);
assert(ret == ESP_OK);
remain = xStreamBufferBytesAvailable( xStreamBuffer);
if ( remain <= 110000) {
xStreamBufferSend(WPC_xStreamBuffer, (void*)(trans.rx_buffer), 8 ,1);
}
}
Code: Select all
void wifi_thread(void *pvParameters) {
wifi_station_initialze();
uint16_t ReturnBuf;
while (1){
ReturnBuf = xStreamBufferReceive(WPC_xStreamBuffer, (void*)ESP32_Tx_buffer, 800 ,portMAX_DELAY);
send(sock, ESP32_Tx_buffer, ReturnBuf, 0);
}
}
Code: Select all
void app_main(void){
WPC_xStreamBuffer = xStreamBufferCreate(110000,1);
char ESP32_Tx_buffer[30000];
TaskHandle_t tcp_TaskHandle;
TaskHandle_t spi_TaskHandle;
TaskHandle_t wifi_TaskHandle;
xTaskCreatePinnedToCore( tcp_thread, "tcp_thread", 2048, (void*)AF_INET, 3, &tcp_TaskHandle,0);
xTaskCreatePinnedToCore( wifi_thread," wifi_thread", 2048, (void*)AF_INET, 2, &wifi_TaskHandle, 0);
xTaskCreatePinnedToCore( spi_thread, " spi_thread", 2048, (void*)AF_INET, 1, &spi_TaskHandle,1);
Timer_Init(TIMER_GROUP_0, TIMER_0, 80 ,200, TIMER_AUTORELOAD_EN, &spi_TaskHandle);
}
Assumption 1 : wifi thread priority is higher than timer callback ?
Assumption 2 : timer callback with RTOS is unstable
If my assumption are correct, how could i resolve this problem??
Or, i missed some important factors ? Please give me some advice or solutions to this problem .
Thanks a lot