Home
Diseño de un planificador
Contents
1. If task task_queue task_ptr Return E a ke K de EN dede ll EN de Na EN 7 EN dk de A of J me ae EEN asm Label3 asm LDX task asm STA task asm TSTX asm BNE Label4 asm AIS 6 asm BRA Label5 asm Label4 asm STX TSK_DES X asm LDA 0x06 asm MUL Label3 task task_queue task_ptr Tf task 0 Jump to Label5 task_desplaced task 1 task_cpu_state task asm PSHX For more than 42 tasks ye asm PULH For more than 42 tasks asm TAX asm PULA asm STA task_cpu_state X asm PULA asm STA task_cpu_state 1 X asm PULA asm STA task_cpu_state 2 X asm PULA asm STA task_cpu_state 3 X asm PULA asm STA Otask_cpu_state 4 X asm PULA asm STA task_cpu_state 5 X asm Label5 define load_pc asm CLRH For more than 42 tasks asm LDX task asm LSLX asm LDA init_cpu_state X asm PSHA asm LDX init_cpu_state 1 X asm PULH asm CLI asm JMP X define init_context asm SEI asm CLRH asm LDX task asm LDA init_dead_time X asm STA DEAD _TIME X asm CLR TSK_DES X define next_task asm LDX task_ptr asm CLR TSK QU X asm TXA asm INCA asm AND 0x0F asm STA task_ptr Pull registers from Stack Label5 Load Program Counter N init_cpu_state task Load PCH
2. Load PCL Enable interrupts Return Reset task_cpu_state Disable interrupts dead_time task init_time task task desplaced task 0 Calculate next task to process task queueltask ptr 0 task_ptr Ea de EN EA A 7 EA A EN IN A a a af a ed a A EN asm TAX asm LDX TSK_QU X task task_queue task_ptr asm STX task define load_context Load CPU state asm TST TSK_DES X If task_desplaced task 0 asm BNE Label6 Jump to Label6 asm LSLX init_cpu_state task asm LDA init_cpu_state X Load PCH asm PSHA asm LDX init_cpu_state 1 X Load PCL asm PULH asm CLI asm JMP X Return asm Label6 Label6 asm LDA 0x06 task_cpu_state task asm MUL pe asm PSHX For more than 42 tasks EIN a asm PULH For more than 42 tasks sa asm TAX asm LDA task_cpu_state 5 X Load PCL asm PSHA asm LDA task_cpu_state 4 X Load PCH asm PSHA asm LDA task_cpu_state 3 X Load X asm PSHA asm LDA task_cpu_state 2 X Load A asm PSHA asm LDA task_cpu_state 1 X Load CCR asm PSHA asm LDA task_cpu_state X Load H asm PSHA asm PULH Return asm RTI define decrement_time task_dead_time asm CLRH asm LDA task_ ptr asm Label7 asm TAX asm LDX TSK_QU X asm BEQ Label9 asm DEC DEAD _TIME X task_dead_time task
3. void task 2 TASK2 void Tarea 2 Fragmento del c digo asociado a esta tarea end_task void task 3 TASK3 void Tarea 3 Fragmento del codigo asociado a esta tarea end_task
4. asm BPL Label8 asm INC DEAD_TIME X asm Label8 asm INCA asm AND 0x0F asm BRA Label7 asm Label9 endif EDF H A N EN a a ae A EA A HN a ay N A A A A EN include edf h byte counter Contador const byte init_dead_time N 0 5 7 4 Plazos iniciales de finalizacion const word init cpu_state N Estados iniciales de las tareas word task_0_Infinite_Loop 3 word task_1_ TASK1 word task_2 TASK2 word task_3_ TASK3 void thread_task byte thread_tsk A adir nueva tarea pendiente thread_tsk amp 0x7F Bulo para que se meta thread_tsk en pila thread j void Config_EDF void byte i if task_queue 0 amp amp task_desplaced 0 amp amp task_dead_time 0 Bulo para que se compilen las tareas task_0_Infinite_Loop Este c digo nunca llega a ejecutarse task_1_TASKI1 task_2 TASK2 task _3_TASK3 task amp 0x7F for 1 0 1 lt N i Copiar estados iniciales task dead time i init_dead_time i j void task_0_Infinite_Loop void Tarea 0 Bucle infinito asm AIS 2 Dejar la pila vac a asm CLI Habilitar interrupciones while 1 Bucle infinito pragma DATA SEG MY_ZEROPAGE Variables en direccionamiento directo byte aux Byte auxiliar byte task Tarea en curso byte task_ptr Puntero a la tarea en curso byte queue ptr Puntero a la ltima tarea
5. programaci n se realizar para el microcontrolador HC08 cuyas caracter sticas vienen ampliamente detalladas en el manual de usuario A pesar de programar para el HCO8 el planificador presentado se podr utilizar en cualquier microcontrolador con un juego de instrucciones compatible Muchos microcontrolador ya incluyen un m dulo planificador el algoritmo dise ado ser especialmente til para aquellos a los que se le quiera dotar de un peque o SOTR basado en planificaci n EDF por software Modelo de programaci n Para poder utilizar el planificador dise ado se hace necesario realizar ciertos cambios en la forma habitual de programar para sistemas empotrados La diferencia principal radica en la sustituci n del programa principal por un simple bucle infinito while 1 Se dividir el c digo en fragmentos que formar n tareas las cuales se ejecutar n tras la aparici n de alg n evento que las active Como es l gico habr que incluir el fichero edf c en el proyecto y escribir la l nea include edf h al comienzo de todos los ficheros que describan tareas Cualquier evento ser producido por una interrupci n ya que es la nica forma de salir del bucle infinito de forma que cualquier m dulo del microcontrolador pueda requerir el uso del procesador para ejecutar una tarea Las rutinas de atenci n a las interrupciones ISR se programar n de la siguiente forma 1 Borrar el flag que produjo la interrupci n 2 Activar e
6. pendientes de ejecuci n Al producirse un nuevo evento y por lo tanto una nueva tarea que ha de ser ejecutada se introduce esta ltima en la cola adelantando a todas aquellas tareas que sean menos urgentes menor tiempo l mite de finalizaci n El procesador ejecuta por orden todas las tareas de la cola de forma que cuando la cola queda vac a vuelve al bucle infinito A continuaci n se incluyen los ficheros necesarios para programar con el planificador Conviene leer los comentarios para entender su funcionamiento Para un funcionamiento correcto es imprescindible que al iniciar una tarea y justo antes de ejecutar end_task la pila no haya sido modificada Lo normal es que sea suficiente con poner el end_task justo al final de la tarea pero hay compiladores que tienen una pol tica diferente de funcionamiento como el Code Warrior en el que hay que activar Disable any low level common subexpression elimination en las opciones de optimizaci n del compilador Adem s habr que modificar las definiciones de TSK_QU TSK_DES y DEAD_TIME en el caso de estar mapeadas en direcciones RAM diferentes en Code Warrior se deber mirar en el fichero map que se crea tras la compilaci n y buscar las variables task_queue task _desplaced e init cpu_state The routines will only work for less than 127 tasks 1 In CodeWarrior check P amp E FCS Settings Compiler for HC08 Options Optimizations Disable any low level common subexpression el
7. Diseno de un planificador Area Sistemas Operativos de Tiempo Real Jos Hernandez Carretero y Alberto Valverde Carretero Introduccion El planificador es el elemento fundamental del sistema operativo en tiempo real SOTR Revisa las prioridades de las tareas que quieren ejecutarse y selecciona la m s prioritaria Para ello ha de controlar el estado de las tareas y decidir cu l har uso del procesador Nuestro trabajo consiste en el dise o de un algoritmo de planificaci n que determine el orden de acceso de las tareas al procesador Se basa en le m todo de planificaci n expulsiva primero el m s urgente earliest deadline first que se denota por sus siglas en ingl s EDF Las tareas a ejecutar se despachar n por orden de sus respectivos tiempos l mite plazos absolutos La primera tarea que se ejecuta es la m s urgente aquella cuyo plazo vence antes Por ello es necesario calcular los tiempos l mite durante la ejecuci n Esta rese a es la que hace que el planificador sea caracterizado como un planificador din mico Los planificadores din micos poseen un n cleo de multiprogramaci n m s complejo lo que implica unos tiempos de proceso mayores La caracter stica mencionada hace que el SOTR requiera una buena parte del tiempo el uso del procesador Para intentar paliar el problema analizado en el p rrafo anterior se programar el planificador en lenguaje ensamblador y as minimizar el tiempo de proceso En concreto la
8. de la cola byte task queue 0x10 Cola de tareas pendientes byte task _desplaced N Tareas desalojadas byte task_dead_time N Plazos de finalizacion stack task_cpu_state N Estados de las tareas itr c include edf h void Config ITR void T2SC_TOIE 1 Habilitaci n de interrupci n por Overfolw T2SC_PS2 1 Poner el preescaler a 2 7 T2SC PS1 1 T2SC_PS0 0 T2MOD 768 Interrupci n por overflow cada 0 02s T2SC_TSTOP 0 Arrancar contador libre interrupt 9 void ISR_ITR void T2SC_TOF 0 Borrar el flag decrement_time Decrementar tiempo en las tareas pendientes asm STA COPCTL Resetear el WatchDog counter Evento periddico if counter 5 0 thread_task TASK1 Evento periddico condicionado if counter 10 1 amp amp state STATEO thread_task TASK2 Evento producido al finalizar una cuenta atras if Back_counter Back_counter if Back_counter thread_task TASK3 end_interrupt Ejecutar siempre al finalizar una interrupci n main c include edf h define STATEO 0 void Config ITR void void main void byte state Byte de estado byte Back counter Cuenta atras para activar un evento Configuraci n Config ITRQ Config EDF Bucle infinito task_0_Infinite_LoopQ Iniciar tarea void task_1_TASK1 void Tarea 1 Fragmento del c digo asociado a esta tarea end_task
9. efine TSK_QU 0x42 define TSK_DES 0x52 define DEAD_ TIME 0x60 Assembly routines define end_interrupt save_context load_pc define end_task init_context next_task load_context define thread asm CLRH asm LDX 1 SP asm LDA DEAD _TIME X asm PSHA asm LDA queue_ptr asm PSHA asm INCA asm AND 0x0F asm STA queue _ptr asm BRA Labell asm Label2 asm TXA asm LDX aux asm STA TSK_QU X asm Labell asm PULA asm STA aux asm DECA asm AND 0x0F asm PSHA asm TAX asm LDX TSK_QU X asm LDA 2 SP asm CMP DEAD TIME X asm BLO Label2 asm LDX aux asm AIS 2 asm LDA 1 SP asm STA TSK_QU X define save_context asm CLRH asm LDX task_ptr asm LDA TSK_QU X asm CMP task asm BNE Label3 asm PULH asm RTI 111 Address of task_queue Look map file Address of task_desplaced Look map file 111 Address of init_cpu_ state Look map file Run to finish an interrupt Save CPU state Load Program Counter Run to finish a task Reset task_cpu_state Calculate next task to process Load CPU state Add pending task to queue AAA AA task_ptr queue_ptr quene pirt Jump to Labell Label2 Labell task_ptr X dead_time queued_task A dead _time thread_tsk IfX lt A Jump to Label2 task_queue task_ptr thread _tsk Save CPU state
10. imination ifndef EDF H define EDF H Variable type typedef unsigned char byte typedef unsigned int word Declaration of EDF functions void thread_task byte thread_tsk void Config EDF void Definition of tasks define N define Infinite Loop define TASK1 define TASK2 define TASK3 UNO Struct declaration typedef struct byte H byte CCR byte A byte X word PC stack Declaration of task functions void task_0 Infinite Loop void void task_1_TASK1 void void task_2 TASK2 void void task_3_TASK3 void extern byte aux extern byte task extern byte task_ptr extern byte queue_ptr extern byte task queue 0x10 extern byte task desplaced N extern byte task dead time N extern stack task _cpu_state N extern byte counter extern const byte init dead_time N extern const word init cpu_state N Conditional definition of _EDF_H Number of tasks Task 0 Infinite Loop Bytes de estado que se guardan en pila Index register High byte Condition code register Accumulator Index register Low byte Program counter Auxiliar byte Actual task task pointer in queue Pointer to last task in queue Queue of pending tasks Tasks that have been desplaced In this time the task must be finished Desplaced tasks state Counter incremented in ITR Initial time to finish task Initial state of tasks d
11. ventos mediante la funci n thread_task 3 Ejecutar la macro end_interrupt Ser n una excepci n las interrupciones muy prioritarias que posean una ISR muy corta como pueden ser las del m dulo SCI en este caso ser preferible no asignarles ninguna tarea para no perder tiempo en cambios de contexto Las tareas se programar n como funciones normales a las que se a adir al final la macro end_task A cada tarea se le asignar un n mero que ser el que se le pase como par metro a la funci n thread_task Adem s es imprescindible incluir la tarea en el array init_cpu_state que posee las direcciones de comienzo en memoria ROM de los fragmentos de c digo Por ltimo se calcular el plazo l mite de finalizaci n como un n mero entero de veces el periodo de la interrupci n peri dica y se indicar en el array init_dead_time La interrupci n peri dica ITR jugar un papel muy importante ser la responsable de realizar los siguientes encargos Sondeos necesarios para producir eventos Eventos peri dicos ya sean condicionados o no Llevar la cuenta del tiempo Reiniciar el WatchDog El periodo de la ITR se tendr que elegir cuidadosamente teniendo en cuenta la periodicidad de los eventos que activa y no debe superar en ning n caso el tiempo que tarda el WatchDog en reiniciar el sistema Planificador Este peque o SOTR tiene una forma sencilla y muy efectiva de actuar Posee una cola con todas las tareas
Download Pdf Manuals
Related Search
Related Contents
Samsung DVD-VR370 User Manual Xerox 2060 Printer User Manual L-VIS100-RE User Manual Parts & Service Manual COP. USO-MAN.CL 700 BRC FuelMaker Please Click here to the Instructions PDF File Omni-Directional Voltage-Powered User`s Manual Sitecom ISDN USB Adapter el archivo de datos tecnicos en PDF Copyright © All rights reserved.
Failed to retrieve file