TODOPIC
Microcontroladores PIC => RTOS => Mensaje iniciado por: aripod en 13 de Agosto de 2012, 14:41:15
-
Baje el port del sitio de micrium para el PIC24, solo que no utilizo el pic para el que esta hecho el port, sino para el 24FJ256GB110. Luego lo "limpie" dejando solamente la tarea principal y a partir de ella solo quiero crear una tarea para hacer parpadear un led por ahora.
Logre hacer que compile, cosa que el original bajado no lo hacia.
A pesar de que compila, el codigo no vuelve nunca de la funcion OSTimeDly la primera vez que se la llama, se queda "dando vueltas" en OS_Sched().
Pongo a continuacion el app.c (archivo donde recomiendan poner el port):
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 2006, Micrium, Weston, FL
* All Rights Reserved
*
*
* Microchip Application Code
*
* File : APP.C
* By : Eric Shufo
*********************************************************************************************************
*/
#include <includes.h>
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* STACKS
*********************************************************************************************************
*/
#define APP_TASK_START_STK_SIZE 128
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK Start_TaskStk[APP_TASK_START_STK_SIZE];
OS_STK DisplayStk[APP_TASK_START_STK_SIZE];
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Displays(void *pdata);
/*
*********************************************************************************************************
* STARTUP TASK
*
* Description : This is an example of a startup task. As mentioned in the book's text, you MUST
* initialize the ticker only once multitasking has started.
*
* Arguments : p_arg is the argument passed to 'AppStartTask()' by 'OSTaskCreate()'.
*
* Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
* used. The compiler should not generate any code for this statement.
* 2) Interrupts are enabled once the task start because the I-bit of the CCR register was
* set to 0 by 'OSTaskCreate()'.
*********************************************************************************************************
*/
void Task_START(void *p_arg)
{
int i_data;
CPU_INT08U i;
CPU_INT08U j;
(void)p_arg;
BSP_Init(); /* Initialize BSP functions */
//#if OS_TASK_STAT_EN > 0
// OSStatInit(); /* Determine CPU capacity */
//#endif
OSTaskCreate(Displays, (void *)0, &DisplayStk[0], 1);
i_data = *((int *)p_arg);
// task loop
for(;;)
{
OSTimeDly(100);
}
}
/*
*********************************************************************************************************
* main()
*
* Description : This is the standard entry point for C code.
* Arguments : none
*********************************************************************************************************
*/
CPU_INT16S main (void)
{
CPU_INT08U err;
int i_data;
BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */
OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel" */
OSTaskCreate(Task_START, (void *)0, &Start_TaskStk[0], 0);
OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
return (-1); /* Return an error - This line of code is unreachable */
}
void Displays(void *p_arg)
{
while(1)
{
PORTFbits.PORTF3=1;
OSTimeDlyHMSM(0,0,1,0);
PORTFbits.PORTF3=0;
OSTimeDlyHMSM(0,0,2,0);
}
}
Alguien logro hacer andar el PORT?? Mejor aun, con el 24FJ256GB110???
-
Mira lo mio son los cooperativos como el Salvo & OSA y si no incrementas los ticks del sistema siempre queda esperando en el scheduler como creo que te esta pasando sera que te falta la función que es llamada en la interrupción de algún timer ...que es la que incrementa los ticks ...digo.
saludos
-
En la funcion BSP_Init(); esta la funcion:
static void Tmr_TickInit (void) /* Initialize the uC/OS-II tick interrupt */
{
CPU_INT32U tmr_frq;
CPU_INT16U cnts;
tmr_frq = BSP_CPU_ClkFrq(); /* Get the CPU Clock Frequency (Hz) (Fcy) */
cnts = (tmr_frq / OS_TICKS_PER_SEC) - 1; /* Calaculate the number of timer ticks between interrupts */
#if BSP_OS_TMR_SEL == 2
T2CON = 0; /* Use Internal Osc (Fcy), 16 bit mode, prescaler = 1 */
TMR2 = 0; /* Start counting from 0 and clear the prescaler count */
PR2 = cnts; /* Set the period register */
IPC1 &= ~T2IP_MASK; /* Clear all timer 2 interrupt priority bits */
IPC1 |= (TIMER_INT_PRIO << 12); /* Set timer 2 to operate with an interrupt priority of 4 */
IFS0 &= ~T2IF; /* Clear the interrupt for timer 2 */
IEC0 |= T2IE; /* Enable interrupts for timer 2 */
T2CON |= TON; /* Start the timer */
#endif
#if BSP_OS_TMR_SEL == 4
T4CON = 0; /* Use Internal Osc (Fcy), 16 bit mode, prescaler = 1 */
TMR4 = 0; /* Start counting from 0 and clear the prescaler count */
PR4 = cnts; /* Set the period register */
IPC6 &= ~T4IP_MASK; /* Clear all timer 4 interrupt priority bits */
IPC6 |= (TIMER_INT_PRIO << 12); /* Set timer 4 to operate with an interrupt priority of 4 */
IFS1 &= ~T4IF; /* Clear the interrupt for timer 4 */
IEC1 |= T4IE; /* Enable interrupts for timer 4 */
T4CON |= TON; /* Start the timer */
#endif
}
Definitivamente esa no esta configurando bien el timer....
-
es que creo que me estas mostrando la inicializacion y no la función de interrupcion por el timer ...... no si me esplique bien pero a mi parecer si el scheduler no tiene noción de los ticks del sistema nunca va a temporizar, y los ticks son incrementados (por lo general y para tner presicion del cristal ,en las interrupciones por desborde del timer) en los cooperativo en una interrupción del tmr
-
a ver donde tenes esta llamada ?
OSTimeTick();
-
La llamada OSTimeTick() esta en OS_Tick_ISR_Handler lo cual acabo de comprobar que efectivamente es llamada cada vez que se interrumpe el timer2 y por medio de un break y dandole play y halt veo que el timer si se incremente y el sistema queda interumpiendose constantemente, es decir, estoy con play y halt siempre en el breakpoint de OSTimeTick();.
-
hola fíjate si es que tenes algun debuger que el mplab tiene un visor para los rtos y que micrium es soportado.... tiene la opcion para ver los timer.
de todas formas subite el código completo que lo miro....yo también estoy incursionando en los preemptives pero inicialmente tiro por el FreeRTOS
Salutes
-
Hay que descomprimir la carpeta micrium en C. El main esta en app.c que esta en C:\Micrium\Software\EvalBoards\Microchip\Explorer16\PIC24FJ128\MPLAB_C30\OS-Probe
-
me pide una tercera parte del rar
-
Sigo subiendo...son 6 partes...no deja mas de 500k maximo con 200 x archivo.....
-
Ultimos dos
-
donde esta el manual de referencia ? necesito conocer las servicios
-
Supongo que lo que te referis esta en la carpeta AppNotes?
-
Mira yo tengo el MMD24 de mikroe que tiene el mismo micro en cuestion pero ni en el main enciende un led ese proyecto me estoy fijando que puede ser ...
-
No era lo que quieria leer..jaja....lograste hacerlo compilar sin problemas supongo?
-
si compila pero en las opciones de compilacion figuran como que busca encabesados de un port para la placa de desarrollo pic16 explorer
-
Del port original le saque lo que no voy a usar....cosas que estan en la placa de desarrollo...