¿Por qué las funciones relacionadas con el indicador de evento no funcionan correctamente fuera de las tareas en keil rtx?

0

Como ya sabe, los indicadores de eventos son muy útiles (por ejemplo, permiten que la tarea se ejecute), pero desafortunadamente sus funciones de control (os_evt_clr / set / wait) no funcionan fuera de los cuerpos de tareas correctamente (por ejemplo, en las funciones de manejo de interrupciones). Como alternativa, utilicé una variable, la inicialicé en el controlador de interrupciones cuando fue necesario, luego la usé en otra tarea para ejecutar una función os_evt_set () para permitir que MCU ingrese una tarea.

    bool Instance_Variable;

    Interrupt_Handler()
    {
    if(xxxx)
    Instance_Variable=1
    }
//--------------------------        
    Secondary_Task()
    {
    //This is frequently run task
    if(Instance_Variable==1)
    {
    os_evt_set (0x0001, Primary_Task_ID);
    Instance_Variable=0;
    }
    }
//--------------------------    
    Primary_Task()
    {
    Result = os_evt_wait_or (0x0001, 0xFFFF);
    //Task's body 
    os_evt_clr (0x0001, Primary_Task_ID);
    }

¿Algún enfoque mejor? WBR.

    
pregunta Dizgah

1 respuesta

3

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

    
respondido por el Dave851

Lea otras preguntas en las etiquetas