Планирую использовать os_event для посылки сообщений от обработчика прерывания.
Провел замеры времени от посылки до получения и чешу репу.
Код такой:
Результаты при редких импульсах на входе прерывания:
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=689 max=689
mcp_poll_task: MCP_INT event delta T=5 max=689
mcp_poll_task: MCP_INT event delta T=4 max=689
mcp_poll_task: MCP_INT event delta T=4 max=689
Тут в одном случае ос жевала сопли почти 700мс.
Теперь частые импульсы (дребезг от пинцета). Совсем весело:
попытка номер 1
mcp_poll_task: MCP_INT event delta T=4 max=689
mcp_poll_task: MCP_INT event delta T=2164 max=2164
mcp_poll_task: MCP_INT event delta T=4599 max=4599
mcp_poll_task: MCP_INT event delta T=7005 max=7005
mcp_poll_task: MCP_INT event delta T=9134 max=9134
попытка номер 2
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=5 max=9134
mcp_poll_task: MCP_INT event delta T=5 max=9134
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=2198 max=9134
mcp_poll_task: MCP_INT event delta T=4612 max=9134
mcp_poll_task: MCP_INT event delta T=7096 max=9134
mcp_poll_task: MCP_INT event delta T=9452 max=9452
mcp_poll_task: MCP_INT event delta T=11855 max=11855
mcp_poll_task: MCP_INT event delta T=14365 max=14365
mcp_poll_task: MCP_INT event delta T=14664 max=14664
В случае частых испульсов есть предположение что тормозит ets_uart_printf.
Провел замеры времени от посылки до получения и чешу репу.
Код такой:
Код:
void mcp_int_handler(void* *para)
{
uint32_t time = system_get_time();
uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
if (gpio_status & BIT(MCPINT_PIN))
{
//disable interrupt
//gpio_pin_intr_state_set(GPIO_ID_PIN(MCPINT_PIN), GPIO_PIN_INTR_DISABLE);
//clear interrupt status
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status & BIT(MCPINT_PIN));
mcpintisr_var ++;
system_os_post(USER_TASK_PRIO_1,MCP_INT, time);
}
}
uint32_t maxdeltat = 0;
void mcp_poll_task(os_event_t *e)
{
uint32 i, d;
switch(e->sig)
{
case MCP_INT:
i=system_get_time();
d=(i >= e->par)? i - e->par : e->par - i;
if (maxdeltat < d)
maxdeltat = d;
ets_uart_printf("mcp_poll_task: MCP_INT event \t delta T=%d \t max=%d\n", d, maxdeltat);
break;
default:
ets_uart_printf("mcp_poll_task: unknown event\n");
} // switch(e->sig)
}
void ICACHE_FLASH_ATTR mcp_poll_task_init(void)
{
system_os_task(mcp_poll_task, USER_TASK_PRIO_1, mcpQueue, sizeof (mcpQueue)/sizeof(os_event_t ));
system_os_post(USER_TASK_PRIO_1, 0 , 0);
}
//Init function
void ICACHE_FLASH_ATTR user_init()
{
uint8 rw_buffer[16];
uint8 w_buffer[16];
uint32_t i, i2;
system_timer_reinit();
set_cpu_freq(0);
uart_init(BIT_RATE_230400, BIT_RATE_230400);
os_delay_us(10000);
ets_uart_printf("Current 'heap' size: %d bytes\n", system_get_free_heap_size());
user_gpio_init();
mcp_poll_task_init();
hspi_init();
ets_uart_printf("MCP reset = %d\n", mcp251x_hw_reset());
}
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=5 max=6
mcp_poll_task: MCP_INT event delta T=4 max=6
mcp_poll_task: MCP_INT event delta T=689 max=689
mcp_poll_task: MCP_INT event delta T=5 max=689
mcp_poll_task: MCP_INT event delta T=4 max=689
mcp_poll_task: MCP_INT event delta T=4 max=689
Тут в одном случае ос жевала сопли почти 700мс.
Теперь частые импульсы (дребезг от пинцета). Совсем весело:
попытка номер 1
mcp_poll_task: MCP_INT event delta T=4 max=689
mcp_poll_task: MCP_INT event delta T=2164 max=2164
mcp_poll_task: MCP_INT event delta T=4599 max=4599
mcp_poll_task: MCP_INT event delta T=7005 max=7005
mcp_poll_task: MCP_INT event delta T=9134 max=9134
попытка номер 2
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=5 max=9134
mcp_poll_task: MCP_INT event delta T=5 max=9134
mcp_poll_task: MCP_INT event delta T=4 max=9134
mcp_poll_task: MCP_INT event delta T=2198 max=9134
mcp_poll_task: MCP_INT event delta T=4612 max=9134
mcp_poll_task: MCP_INT event delta T=7096 max=9134
mcp_poll_task: MCP_INT event delta T=9452 max=9452
mcp_poll_task: MCP_INT event delta T=11855 max=11855
mcp_poll_task: MCP_INT event delta T=14365 max=14365
mcp_poll_task: MCP_INT event delta T=14664 max=14664
В случае частых испульсов есть предположение что тормозит ets_uart_printf.