24 Replies Latest reply: Oct 2, 2012 4:00 PM by DiegoHaro RSS

Módulo 4 - Scheduler

Damaris Ochoa Flores Employee

Hola Estimados Participantes,

 

Les comparto la presentación para éste último Módulo de The Freescale Cup 2011. 

 

Un Saludo!

 

El Archivo llamado SchedulerInicialPlusManual.zip contiene el proyecto usado en el entrenamiento del 27 de Agosto asi como la presentación.

 

 

 

 

 Los links de los videos del entrenamiento, con audio sincronizado en un solo mp4.
Cortesia del equipo Leopards de la UDG.
Parte 1

 


  • Re: Módulo 4 - Scheduler
    LUIS  MANUEL BRACAMONTES HERNANDE Level 1
    hola! puedo generar tareas menores a 1ms (1 us poe ejemplo) en el scheduler??
  • Re: Módulo 4 - Scheduler
    Enrique  Rodrメguez Toscano Level 1
    Si es posible, tendrías que reconfigurar el RTC para que genere interrupciones cada 1us, y tendrías tareas de 1us 2us 5us 10us 100 us por ejemplo. Pero esto no es práctico, generalmente los schedulers tienen tareas de 5ms en adelante. Si configuras el RTC para que te genere interrupciones cada 1us estarías interrumpiendo el código cada 1us y como te dije eso no es práctico, usarias demasiado tiempo del micro para atender tus interrupciones mas que para ejecutar tu código . No es recomendable
  • Re: Módulo 4 - Scheduler
    Luis Alberto Gonzalez Cuevas Level 1
    Hola, mi duda es la siguiente: en algunos micros de freescale he manejado algo que se llama KBI, como puedo encontrar el equivalente en el Bolero. Según vi en el modulo 4 comentaron algo de como dar de alta las interrupciones pero no he encontrado en donde definir una interrupción de este tipo. Lo que quiero hacer es generar una interrupción cuando reciba un uno en un pin del micro.  Saludos!!!
  • Re: Módulo 4 - Scheduler
    Enrique  Rodrメguez Toscano Level 1
    Que tal Alberto.  Si te refieres al KBI (Keyboard Interrupt Module) de microcontroladores HC(S)08/RS08 me parece que Bolero no tiene este modulo.  Para generar una interrupción cuando recibas un "1" puedes usar una External interrupt. Revisa en la documentación de bolero MPC5604B/C Microcontroller Reference Manual.  Tambien revisa el archivo IntcIsrVectors.c del scheduler, o si usas tu propio scheduler donde tengas tu tabla de interrupciones  7.4.1.2 External interrupt request input pins (EIRQ[0:15])1 7.5.3.3 Interrupt Status Flag Register (ISR) 7.6.4 External interrupts Table 9-10. Interrupt vector table (SIU External IRQ_0 SIUL)
  • Re: Módulo 4 - Scheduler
    Luis Alberto Gonzalez Cuevas Level 1
    Ya inicialize mis interrupciones y habilito los EIRQ que utilizare con mi flanco de subida:  void app_eirq_init() { SIU.IRER.B.EIRE5 =1; SIU.IREER.B.IREE5 =1; } En mi tabla de los vectores de interrupcion ya agregue la funcion en el lugar 41 que seria para SIUL(EIRQ): void hw_interrupt_eirq( void ) { INTC.SSCIR[41].R = 1; /* Clear channel's flag */ SIU.ISR.B.EIF5 = 1; SCHM_Funcion_Encoder(); } Esta función borra mis banderas y mando llamar mi funcion Encoder y dentro de ahi estoy haciendo pruebas para toglear un pin cada ves que se ejecuta la interrupción.  Al parecer no se ejecuta nunca la interrupción ya revisé todo paso a paso, pero no logro hacer que se ejecute.  Platicamos el día de la semifinal un poco respecto a esto, y al parecer estabamos haciendo lo correcto pero no funciona.  agradeceria mucho la ayuda!!  Enrique Rodríguez Toscano said:
    Que tal Alberto.

    Si te refieres al KBI (Keyboard Interrupt Module) de microcontroladores HC(S)08/RS08 me parece que Bolero no tiene este modulo.

    Para generar una interrupción cuando recibas un "1" puedes usar una External interrupt. Revisa en la documentación de bolero MPC5604B/C Microcontroller Reference Manual.

    Tambien revisa el archivo IntcIsrVectors.c del scheduler, o si usas tu propio scheduler donde tengas tu tabla de interrupciones

    7.4.1.2 External interrupt request input pins (EIRQ[0:15])1
    7.5.3.3 Interrupt Status Flag Register (ISR)
    7.6.4 External interrupts
    Table 9-10. Interrupt vector table (SIU External IRQ_0 SIUL)
  • Re: Módulo 4 - Scheduler
    Enrique  Rodrメguez Toscano Level 1
    Que tal Luis  1. Verifica que el Glitch Filter del SIUL esta deshabilitado o que no tenga un preescaler muy grande, o un conteo muy grande 2. Asignale una prioridad diferente de 0 a tu interrupcion 41. como referencia revisa las funciones *hw_interrupt_interrupt_iniCfg *hw_interrupt_initSwIrq
  • Re: Módulo 4 - Scheduler
    Luis Alberto Gonzalez Cuevas Level 1
    Que tal Enrique, ya cheque esos registros. Los valores despues del Reset indican que el Glitch Filter del SIUL esta deshabilitado, que el preescaler es 0 (quiero entender que es un valor muy pequeño) y el conteo es 0 (que también entiendo es un contador pequeño), lo que hicimos también fué modificar estos valores al inicializar las interrupciones asignando valores de 0 para el Glitch, 1 para el preescales y 1 para el contador y tampoco funcionó.  Respecto a la prioridad le asignamos una prioridad de 1 y de 4 y con ninguna de las dos funciona.  Por otro lado intentamos también utilizar la interrupción del puerto UART para que nos indicara el término de la transmisión y no tuvimos respuesta de la interrupción.  Definitivamente algo estamos haciendo mal pero ya leimos el Reference Manual varias ocaciones y no encontramos que pueda ser, espero nos puedan ayudar a resolver este problema o que nos puedan facilitar algún ejemplo funcionando de estas interrupciones.  Saludos!!!  Enrique Rodríguez Toscano said:
    Que tal Luis

    1. Verifica que el Glitch Filter del SIUL esta deshabilitado o que no tenga un preescaler muy grande, o un conteo muy grande
    2. Asignale una prioridad diferente de 0 a tu interrupcion 41. como referencia revisa las funciones
    *hw_interrupt_interrupt_iniCfg
    *hw_interrupt_initSwIrq
  • Re: Módulo 4 - Scheduler
    Luis Alberto Gonzalez Cuevas Level 1
    Estos son los archivos del vector de interrupciones y el de la funcion de la interrupción.  Saludos!!! Enrique Rodríguez Toscano said:
    Que tal Luis

    1. Verifica que el Glitch Filter del SIUL esta deshabilitado o que no tenga un preescaler muy grande, o un conteo muy grande
    2. Asignale una prioridad diferente de 0 a tu interrupcion 41. como referencia revisa las funciones
    *hw_interrupt_interrupt_iniCfg
    *hw_interrupt_initSwIrq
  • Re: Módulo 4 - Scheduler
    Enrique  Rodrメguez Toscano Level 1
    Luis todo parece estar bien, no se porque no te genera la interrpción. Solo me resta decir que verifiques que efectivamente llegue ese pulso al pin del micro, y que el pin del micro este configurado como entrada
  • Re: Módulo 4 - Scheduler
    Damaris Ochoa Flores Employee
    La ultima sesión aqui la pueden encontrar.
  • Re: Módulo 4 - Scheduler
    Michel David Robles Romero Level 1

    Para los que piensen usar el scheduler, un tip para cambiarle el nombre al proyecto:

    Vayan a la carpeta donde tienen el proyecto del scheduler y renombren los siguientes items con el nombre que le quieran dar a su proyecto:

    el archivo Scheduler.mcp y la carpeta Scheduler_Data, adicionalmente pueden renombrar la carpeta del proyecto. Procuren tener Code Warrior cerrado. La carpeta Scheduler_Data tiene que terminar en _Data

    Recuerden usar solo letras y numeros, ni espacios ni caracteres especiales. : )

  • Re: Módulo 4 - Scheduler
    Damaris Ochoa Flores Employee
    Ya estan subidos los entrenamientos de este modulo.
  • Re: Módulo 4 - Scheduler
    Luis Fernando Higareda Amezcua Level 1

    Hola Damaris, cmpañeros.
    Les mando los links de los videos del entrenamiento, cmo ia saben, audio sincronizado en un solo mp4.
    Cortesia del equipo Leopards de la UDG.
    Parte 1
    Nos vemos en la carrera y a demostrar quien es el mejor.
  • Re: Módulo 4 - Scheduler
    Andres Torres Garcia Level 2

    Chido Luis, gracias por tu aporte, nos vemos en la carrera.

     

    Otra cosa, alguien sabe en cual archivo viene el scheduler actualizado?

     

    Saludos


    Luis Fernando Higareda Amezcua said:


    Hola Damaris, cmpañeros.
    Les mando los links de los videos del entrenamiento, cmo ia saben, audio sincronizado en un solo mp4.
    Cortesia del equipo Leopards de la UDG.
    Parte 1
    Nos vemos en la carrera y a demostrar quien es el mejor.
  • Re: Módulo 4 - Scheduler
    Michel David Robles Romero Level 1

    En el zip que dice SchedulerInicialPlusManual en los attachments incluidos al inicio de esta discusion

    Saludos


    Andres Torres Garcia said:

    Chido Luis, gracias por tu aporte, nos vemos en la carrera.

     

    Otra cosa, alguien sabe en cual archivo viene el scheduler actualizado?

     

    Saludos

  • Re: Módulo 4 - Scheduler
    Andres Torres Garcia Level 2

    Quiero ver si entendí bien el scheduler, entonces en el define #define TIMER_PERIOD (T_UWORD)1 configuro el tick del scheduler? y despues en el define #define SCHEDULER_RATE 145 para que sirve?

     

    Saludos y Gracias

  • Re: Módulo 4 - Scheduler
    Andres Torres Garcia Level 2

    Otra cosa, que significado tienen las carpetas HAL y MAL en el directorio del proyecto del scheduler? y que se supone que se debería de poner ahí?

     

    Saludos y Gracias

  • Re: Módulo 4 - Scheduler
    Michel David Robles Romero Level 1

    Hola Andres, espero responder tus dudas:

    con #define TIMER_PERIOD (T_UWORD)1 configuro el tick del scheduler?

    En realidad no, pero cambiar este numero es parte de lo que tienes que hacer para cambiar la el periodo del tick del scheduler. En la tabla donde programas las tareas "...\src\mw_schm_cfg.c" tu puedes definir el retraso de inicio (startup delay) y el periodo de execucion para cada tarea. En el algoritmo del scheduler "...\src\mw_schm.c" en la linea 125(+o-) se usa este simbolo. Aqui podras observar que el valor que se programa en la columna Startup delay y en Execution Period es decrementado TIMER_PERIOD veces. Entonces, si tu cambias este valor debes ser conciente de que los valores de tiempo de las tareas sean multiplos del nuevo valor configurado. Pero aun cambiando solo este valor, el tick del scheduler no cambia, y los valores de tiempo programados para cada tarea no coincidiran con el comportamiento real.

    #define SCHEDULER_RATE 145 para que sirve?

    Este valor cambia realmente el tick del scheduler. El valor actualmente programado permite generar una interrupcion periodica cada 1ms. Si este valor es cambiado para que se genere una interrupcion periodica cada 5 ms, por ejemplo, entonces el valor del simbolo TIMER_PERIOD debe ser cambiado tambien a 5 para que los tiempos que se programan para cada tarea sea congruente con el verdadero comportamiento. Si solo cambias SCHEDULER_RATE y no TIMER_PERIOD, los tiempos programados para las tareas no representarian milisegundos, si no periodos multiplos del periodo programado.

  • Re: Módulo 4 - Scheduler
    Michel David Robles Romero Level 1

    Hola,

    Para comprender mejor estos terminos revisen las presentaciones del training de C. Aqui una explicacion breve:

    Continental recomendo usar programacion en capas, que de hecho es como se usa en la industria. Cuantas capas y que hace cada una? dependera de la arquitectura que elijan. Por default el scheduler implementa una programacion en capas compuesta por 3 capas (en realidad 4 si cuentas al scheduler como una). Estas capas son: APP (application abstraction layer), HAL (Hardware abstraction layer) y MAL (en este caso se interpreta como Microcontroler abstraction layer). En APP colocas todo el software de la aplicacion, no debes usar de forma directa registros del microcontrolador, si no simbolos, macros, o APIs que son provistas por las capas HAL o MAL. Tampoco debes preocuparte por los detalles de algun hardware en particular, por ejemplo, si se usa un arreglo de N displays de 7 segmentos, lo ideal es que en APP se llame alguna funcion que permita cambiar el valor mostrado por el display, esa funcion debera estar definida en una capa inferior, en este caso en HAL, por tratarse de hardware del sistema (no del micro), esto es conocido como driver. A su vez en HAL se usan simbolos, macros o APIs provistas por la capa MAL. Por ejemplo, para cambiar el estado de algun pin no deberia usarse SIU.GPDO[10].B.PDO = 1; si no una macro que represente dicha operacion y que esta definida en MAL:

    #define      IO_PinWrite(pinPcr, value)       ( SIU.GPDO[(pinPcr)].B.PDO = (value) )

    Los objetivo de usar programacion en capas son principalmente la portabilidad, la division modular del software, que reduce la complejidad de los modulos individuales y permite el trabajo en equipos, y la facilidad de mantenimiento y cambios.

     

    Andres Torres Garcia said:

    Otra cosa, que significado tienen las carpetas HAL y MAL en el directorio del proyecto del scheduler? y que se supone que se debería de poner ahí?

     

    Saludos y Gracias

     

  • Re: Módulo 4 - Scheduler
    Andres Torres Garcia Level 2

    Gracias David, por tu invaluable ayuda, mis dudas quedaron resueltas

     

    Saludos y nos vemos en la carrera.

  • Re: Módulo 4 - Scheduler
    JOEL  MARTINEZ PALACIOS Level 1

    Alguien me puede decir como generar una interrupción de microsegundos, estoy trabajando con la que muestran en el entrenamieto 4-2, para ser mas exacto esta:

    // Init and enable PIT module (All channels)

    PIT_initModule();

    // Configure PIT channel cero to create an interrupt every 250 ms

    PIT_init(0,16000000UL);

    // Start timer PIT_EnablePITchannel(0, TRUE);

    //APPLeds_Led3_init();

    si modifico este valor 16000000 cambia el valor de 250ms, pero no puedo bajarlo demasiado por que deja de funcionar la interrupción, de que manera puedo generar un delay de microsegundos. 

  • Re: Módulo 4 - Scheduler
    Michel David Robles Romero Level 1

    Que tal Joel,

    Si el delay que deseas es realmente pequeño puedes usar un loop finito, por ejemplo

    for(i=0; i<CONSTANTE01; i++){};

    Pero este delay tiene que ser realmente pequeño, tal vez 100us o menos, dependiendo de cuantas tareas estes implementando con el scheduler.

    O tal vez exista en las librerias que vienen con el compilador algunas funciones de delay, tendrias que checarlo.

    En teoria, con el PIT podrias alcanzar delays incluso menores a 1 us, pero no es recomendable generar interrupciones periodicas con periodos de ese valor por que el micro estaria invirtiendo demasiado tiempo en las interrupciones. Aun asi puedes utilizar el PIT para generar delays pequeños en vez del loop con for si usas polling para checar por el bit TIF, para ello desabilita la interrupcion del timer que uses en esa forma.

     

    JOEL MARTINEZ PALACIOS said:

    Alguien me puede decir como generar una interrupción de microsegundos, estoy trabajando con la que muestran en el entrenamieto 4-2, para ser mas exacto esta:

    // Init and enable PIT module (All channels)

    PIT_initModule();

    // Configure PIT channel cero to create an interrupt every 250 ms

    PIT_init(0,16000000UL);

    // Start timer PIT_EnablePITchannel(0, TRUE);

    //APPLeds_Led3_init();

    si modifico este valor 16000000 cambia el valor de 250ms, pero no puedo bajarlo demasiado por que deja de funcionar la interrupción, de que manera puedo generar un delay de microsegundos. 

  • Re: Módulo 4 - Scheduler
    Omar Isai Pinales Ayala Level 1

    Los links para bajar el video del ultimo entrenamiento ya no funcionan,