Autor Tema: RTOS  (Leído 2034 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado juancho.0918

  • PIC10
  • *
  • Mensajes: 2
RTOS
« en: 25 de Abril de 2015, 22:31:32 »
Tengo el siguiente problema, y es que no se porque cuando vuelve a empezar el ciclo los tiempo ya no son los mismos, agradezco a quien pueda colaborarme, este es el codigo

#include <18F452.h>
#FUSES XT
#FUSES NOWDT
#FUSES PROTECT
#use delay(clock=4M)
#use RTOS(timer=0,minor_cycle=1ms)
#include <lcd.c>


// DEFINICIONES DE PIN A USAR PARA LOS SEMAFOROS

#define ON   PIN_A0
#define A2   PIN_B0
#define V2   PIN_B1
#define R3   PIN_B2
#define A3   PIN_B3
#define V3   PIN_B4
#define R4   PIN_B5
#define A4   PIN_B6
#define V4   PIN_B7
#define R1   PIN_C4
#define A1   PIN_C5
#define V1   PIN_C6
#define R2   PIN_C7

// TAREAS

#task (rate=1ms,max=1ms)
void INICIO();

#task (rate=1ms,max=1ms,enabled=false)
void ROJO1();

#task (rate=10s,max=1ms,enabled=false)  
void AMARILLO1();

#task (rate=2s,max=1ms,enabled=false)  
void VERDE1();

#task (rate=6s,max=1ms,enabled=false)  
void AMARILLO12();



void main()
{
  setup_timer_0(RTCC_INTERNAL| RTCC_DIV_1);
  rtos_run();
}

void INICIO()
{
   if(input(ON))  
   rtos_enable(ROJO1);  
}

void ROJO1()
{
rtos_disable(INICIO);
output_low(A1);
output_high(R1);
rtos_disable(ROJO1);
rtos_enable(AMARILLO1);
}

void AMARILLO1()
{
output_low(R1);
output_high(A1);
rtos_disable(AMARILLO1);  
rtos_enable(VERDE1);
}

void VERDE1()
{
output_low(A1);
output_high(V1);
rtos_disable(VERDE1);
rtos_enable(AMARILLO12);
}

void AMARILLO12()
{
output_low(V1);
output_high(A1);
rtos_disable(AMARILLO12);  
rtos_enable(ROJO1);
}


/*
SEGUNDO SEMAFORO
*/
« Última modificación: 25 de Abril de 2015, 22:34:30 por juancho.0918 »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2692
Re: RTOS
« Respuesta #1 en: 26 de Abril de 2015, 07:10:49 »
Hola juancho

en el codigo no se ve nada raro, sin embargo veo que tienes la libreria delay incluida, no se te ocurra usarla, es mas los delay no deberian usarse nunca. ya que meten retrasos en tu codigo y mientras tu micro no hace nada.

revisa que estas poniendo bien los fuses con respecto al tipo de reloj que tengas y por ultimo, bueno, decirte que este tipo de cosas no deben extrañarte mucho si utilizas CCS, ya que es un sistema lleno de bug y nada orientado al uso profesional.


puede ser claramente que no sea problema tuyo, y que el "RTOS" de ccs este hecho con while y delays, te puedes volver loco buscando tu fallo y puedo que nisiquiera sea tuyo. yo recomiendo a todos que para microchip uses los compiladores XC, ademas podrias debuguear y buscar mejor tus fallos. busca en los foros de CCS y su comunidad si hay algún bug declarado de CCS.

siento no serte de mas ayuda, un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: RTOS
« Respuesta #2 en: 05 de Mayo de 2015, 11:22:42 »
Pues yo veo varios problemas en esta implementación:

PROBELMA 1. No devolver el procesador al kernel
 Este es el más grave de todos los problemas y debes evitarlo siempre. Máxime porque este RTOS no es expropiativo, así que es tu responsabilidad llamar a alguna función bloqueante. entiéndase rtos_yield(), rtos_wait(), rtos_await(), ... De todas ellas la más común es rtos_yield() y debe aparecer siempre al finalizar el código de tarea para que devuelvas el procesador al terminar de ejecutar el "trabajo actual".

PROBLEMA 2. Las tareas deben implementarse como un lazo cerrado con un ciclo FOR. Seguramente los tiempos se duplican en tu caso, tal como me ocurrió a mí recientemente al volver a utilizar este RTOS después de unos 8 años sin tocarlo. Bueno se duplicarán una vez añadas los rtos_yield al final de la función, pero entonces los tiempos no serán los especificados por tí.

Implementa las tareas así:

void Task()
{
/* Start up code */

/*Task Loop*/
for(;;)
{
  /* Task Code*/


  rtos_yield();  /* Return processor control to kernel */
}

} /* END TASK*/

PROBLEMA 3. Los pines del uC no deben utilizarse como semáforos. Los semáforos son estructuras del RTOS (aunque se utilice una variable entera para ello) y tienen reglas muy claras de cómo utilizarlos. Creo que todavía anda por el foro el curso de este RTOS que escribí entre 2006 y 2007.

PROBLEMA 4. Este es difícil de entender hasta que pases un tiempo programando micros y utilizando RTOS. La ejecución de código lleva tiempo y eso impacta en los instantes en que se activan las tareas. También los mecanismos de sincronización pueden alterar los períodos de ejecución de las tareas. Si por ejemplo defines una tarea para que se ejecute cada 10ms y ella debe esperar por un mensaje que debe entrar por el puerto serie, entonces lo más seguro es que no se ejecute cada 10ms como esperas sino que no se ejecutará hasta que llegue un mensaje. Este en realidad no es un problema de codificación sino un problema de comprensión que requiere tiempo y experiencia para asimilarlo.

Suerte y no dejes el RTOS, son una pasada. El otro día me puse a hacer una aplicación con este RTOS después de varios años sin tocarlo y la completé en unas 8 horas. Estimo que por los métodos tradicionales me habría tomado unos 4 ó 5 días.

Un saludo
 Reinier





Desconectado juancho.0918

  • PIC10
  • *
  • Mensajes: 2
Re: RTOS
« Respuesta #3 en: 09 de Mayo de 2015, 17:55:18 »
Ok, muchas gracias a todos por su tiempo tendre en cuenta todas sus sugerencias, nuevamente muchas gracias por su tiempo de ver mi problema.


 

anything