Tengo un poco de interrupción, digamos desde UART para hacer un ejemplo real:
void USART2_IRQHandler(void)
{
int i = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
static uint8_t cnt = 0;
char t = USART_ReceiveData(USART2);
if((t!='!')&&(cnt < MAX_STRLEN))
{
received_string[cnt] = t;
cnt++;
}
else
{
cnt = 0;
if(strncmp(received_string,"connection",10) == 0)
{
USART2_SendText("connection ok");
}
else if(strncmp(received_string,"sine",4) == 0)
{
DAC_DeInit();
DAC_Ch2SineWaveConfig();
USART2_SendText("generating sine");
}
else
{
USART2_SendText("unknown commmand: ");
USART2_SendText(received_string);
}
for (i = 0; i <= MAX_STRLEN+1; i++) // flush buffer
received_string[i] = 'void USART2_IRQHandler(void)
{
int i = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
static uint8_t cnt = 0;
char t = USART_ReceiveData(USART2);
if((t!='!')&&(cnt < MAX_STRLEN))
{
received_string[cnt] = t;
cnt++;
}
else
{
cnt = 0;
if(strncmp(received_string,"connection",10) == 0)
{
USART2_SendText("connection ok");
}
else if(strncmp(received_string,"sine",4) == 0)
{
DAC_DeInit();
DAC_Ch2SineWaveConfig();
USART2_SendText("generating sine");
}
else
{
USART2_SendText("unknown commmand: ");
USART2_SendText(received_string);
}
for (i = 0; i <= MAX_STRLEN+1; i++) // flush buffer
received_string[i] = '%pre%';
}
}
}
';
}
}
}
Pero el código de interrupción debería ejecutarse lo más rápido posible. Y aquí tenemos algunas funciones que llevan mucho tiempo dentro.
La pregunta es: ¿Cuál es la forma correcta de implementar interrupciones en las funciones que consumen tiempo de llamadas?
Una de mis ideas es crear búferes de indicadores e indicadores en interrupción. Y procesar el búfer de bandera en el bucle principal llamando a las funciones apropiadas. ¿Es correcto?