Micrium Rtos - OSTimeDly no funciona

2

He inicializado Micrium Rtos y no hay ningún error al compilar el proyecto, pero hay una función OSTimeDly en mi código que no funciona.

Debo notificar que cuando doy el primer argumento de esta función (relacionado con el número de tics para especificar el retardo de tiempo) el valor de 0, mi tarea funciona bien pero le doy cualquier otro valor a este argumento (500 en mi código), detiene el programa. ¿Necesito activar otra cosa para habilitar el uso de las funciones de retardo?

Aquí está mi código:

#include <GPIO_LPC17xx.h>
#include <app_cfg.h>
#include <os.h>
static          OS_TCB      AppTaskStartTCB;
static          CPU_STK     AppTaskStartStk[1000];
static          void            AppTaskStart(void *p_arg);

void SysTick_Handler(void)
{
OS_CPU_SysTickHandler();
}
int main(void)
{
    OS_ERR err; 
    GPIO_SetDir(0,20,GPIO_DIR_OUTPUT);
    GPIO_PinWrite(0,20,1);
    OSInit(&err);
    if (err !=OS_ERR_NONE) {
        GPIO_PinWrite(0,20,0);
    }
    OSTaskCreate((OS_TCB        *)&AppTaskStartTCB,
                            (CPU_CHAR       *)"App Task Start",
                            (OS_TASK_PTR)AppTaskStart,
                            (void           *)0,
                            (OS_PRIO         )5,
                            (CPU_STK        *)&AppTaskStartStk[0],
                            (CPU_STK_SIZE)1000/10,
                            (CPU_STK_SIZE)1000,
                            (OS_MSG_QTY  )0,
                            (OS_TICK         )0,
                            (void             *)0,
                            (OS_OPT          )(OS_OPT_TASK_STK_CHK  |  OS_OPT_TASK_STK_CLR),
                            (OS_ERR         *)&err);

    if (err !=OS_ERR_NONE) {
        GPIO_PinWrite(0,20,0);
    }                       
    OSStart(&err);
    if(err !=OS_ERR_NONE){
        GPIO_PinWrite(0,20,0);
    }
}
static void AppTaskStart (void *p_arg)
{
    OS_ERR err;
    p_arg = p_arg;
    CPU_Init();
    cpu_freq = 100000000; 
    cnts     = (cpu_freq / OSCfg_TickRate_Hz);              
    OS_CPU_SysTickInit(cnts); 
    SYSTICK_InternalInit(10);
    SYSTICK_IntCmd(ENABLE);
    SYSTICK_Cmd(ENABLE);
    GPIO_PinWrite(0,20,0);
    while(1)
    {
        OSTimeDly((CPU_INT16U   )   500,
                            (OS_OPT         )   OS_OPT_TIME_DLY,
                            (OS_ERR      *) &err);
        GPIO_PinWrite(0,20,1);
        OSTimeDly((CPU_INT16U   )   500,
                            (OS_OPT         )   OS_OPT_TIME_DLY,
                            (OS_ERR      *) &err);
        GPIO_PinWrite(0,20,0);
    }
}

Por favor, ayúdame a resolver este problema.

Mi compilador es Keil.

Gracias de antemano

    
pregunta Nima

2 respuestas

0

Abrir startup_LPC177xx.s Reemplace PendSV_Handler con OS_CPU_PendSVHandler y SysTick_Handler con OS_CPU_SysTickHandler. Presione CTRL + F y use la pestaña Reemplazar para hacer esto con todo su proyecto.

¡Funcionará!

    
respondido por el Pedram Miyar
1

Cuando llama a OSTimeDly () con un valor distinto de cero, elimina la tarea de la lista de listas y registra el número de tics en el bloque de control de la tarea (OS_TCB). La tarea no estará lista para volver a ejecutarse hasta que el número de tics disminuya a cero.

El conteo de tics de la tarea disminuye cuando OSTimeTick () se ejecuta. OSTimeTick () debe llamarse periódicamente a la velocidad de tick. Su puerto del sistema operativo debe proporcionar el mecanismo para llamar a OSTimeTick () periódicamente. Probablemente, lo que debe hacer es configurar un temporizador de hardware para interrumpir periódicamente a esa velocidad de tic. Luego, el ISR del temporizador de hardware debe llamar a OSTimeTick ().

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas