Lo que he hecho en estas situaciones es usar un mensaje o una cola de correo dependiendo de la cantidad y el tipo de información que desea registrar. Cuando se utiliza en el ISR, los valores de tiempo de espera deben ser cero. A continuación se muestra un ejemplo de cómo estoy manejando un ISR de un FTM que se está utilizando para medir una señal PWM entrante.
void FTM0_IRQHandler(void){
toMail = (FTM_data*) osMailAlloc(FTM_mail,0);
if( toMail == NULL ){
FTM0_STATUS = 0x00;
return;
}
toMail->status = FTM0_STATUS;
toMail->c0v = FTM0_C0V;
toMail->c1v = FTM0_C1V;
toMail->c2v = FTM0_C2V;
toMail->c3v = FTM0_C3V;
osMailPut(FTM_mail,toMail);
FTM0_STATUS = 0x00;
}
Ahora que estoy usando una cola de correo, debo asegurarme de que se asignó un bloque de memoria para su uso, si la cola de correo está llena, devolverá NULL.
Ahora, cuando desee verificar los datos en la cola de correo, puede hacer lo siguiente. osWaitForever se puede reemplazar con un número y luego esperará esa cantidad de milisegundos antes de devolver un error de tiempo de espera.
osEvent FTM_evt;
// Wait for FTM data
FTM_evt = osMailGet(FTM_mail,osWaitForever);
if(FTM_evt.status == osEventMail){
// Mail was present
// Get data struct
FTM_info = (FTM_data*) FTM_evt.value.p;
// Free memory when done
osMailFree(FTM_mail,FTM_info);
}else if(FTM_evt.status == osEventTimeout){
// Time limit reached, no data present
}
También hay otros dos errores. Uno para ningún correo en cola cuando no tenía tiempo de espera especificado y otro para un error de parámetro.
Ahora, si solo necesita enviar un solo número, puede usar una cola de mensajes. Estos son más simples porque no necesita asignar memoria para ellos. Las dos llamadas son solo osMessagePut con el nombre de la cola de correo, el número y el tiempo de espera. osMessageGet funciona de la misma manera que lo hace, ya sea devolviendo el primer objeto en la cola u otro código, por lo que dicen que los datos no estaban disponibles o que se alcanzó el tiempo de espera ect.
Ahora también sepa que tiene que inicializar estas colas con los ID de las colas en el ámbito adecuado (global en la mayoría de los casos). Ejemplos a continuación.
// Mail system, FTM_mail is the ID used to access data, 15 is the size of the queue
// and FTM_data a structure type of the items that will be stored in the queue
osMailQDef(FTM_mail,15,FTM_data);
osMailQId FTM_mail;
int Init_Thread_RxPPM (void) {
//Init mail
FTM_mail = osMailCreate(osMailQ(FTM_mail),NULL);
//Start Thread
tid_Thread_RxPPM = osThreadCreate (osThread(Thread_RxPPM), NULL);
if(!tid_Thread_RxPPM) return(-1);
return(0);
}
La inicialización de la cola de mensajes es casi idéntica, solo algunas diferencias en los parámetros.
También hay un tutorial para RTX que incluye más información sobre estos temas y cómo usar una cola de mensajes para almacenar punteros para que pueda tener elementos dinámicos en la cola
enlace