Académique Documents
Professionnel Documents
Culture Documents
Adems, muchos de estos modos puede ser mixto. Una tarea no es per se
regular, su cdigo implementar decide lo que pasa y esto puede ser decidido
contexto o dependiente situacin. Esta flexibilidad se consigue por la idea
bsica de que tiene una planificador controlado evento, donde los casos de uso
tpico RTOS son apoyados por proporcionar eventos de acuerdo, 1 Ver
www.arduino.cc 2 El compilador de C de GNU es bastante complicada en
mezclar archivos de C y C ++. Aunque RTuinOS est escrito en C que no es
materia implementan funciones de trabajo en C ++ si slo las reglas generales
de la combinacin de C y C ++ y las consideraciones acerca de utilizando las
funciones de biblioteca (sobre todo nuevos) en un entorno multi-tarea se
obedeci. Funciones miembro de clase no estticos Obviamente, no hay
candidatos para una funcin de tarea.
que se disminuye por primera y nica tarea activa (si slo es una tarea round
robin). Cuando el contador alcanza nula que se vuelve a cargar y la tarea se
toma inmediatamente de la cabeza de su lista de vencimientos y puso en el
final de esta lista. Esto significa que la tarea se mantiene debido pero quedar
inactiva. Otra de las tareas, el nuevo jefe de la lista, es un candidato ms
prometedor para el nuevo, tarea activa. El siguiente paso es comprobar las
condiciones de todas las tareas suspendidas. Para cada uno de tales tarea se
comprueba si su condiciones de reanudacin se ha cumplido, es decir, si todos
los eventos que est esperando han sido escritos a ella por su parte. Si es as,
se saca de la lista de tareas suspendidas y se coloca al final de la lista debido a
la clase de prioridad de la tarea pertenece. Ahora, despus de la reordenacin
de las tareas en las varias listas, el ISR termina con la bsqueda de lo nuevo,
activo tarea. La decisin es fcil. Se realiza un bucle sobre todas las listas de
vencimiento, a partir de la ms alta prioridad. El jefe de la lista no vaca
primero encontrado es el nuevo, tarea activa. Si todas las listas de vencimiento
estn vacos, se elige la tarea vaca. La tarea seleccionada se activa y termina
el ISR. 2.3 Eventos Explcitamente anunciados Adems de la tic temporizador
del sistema, el programador se vuelve activo en otras dos situaciones. El
primero es el evento publicado explcitamente por una tarea de aplicacin.
RTuinOS conoce un nmero predefinido de propsito general eventos, que
pueden ser enviados por una tarea y que otra tarea puede esperar. Esta ltima
tarea suspende s y especifica el evento como condicin currculum. Bajo las
condiciones de aplicacin definido, el ex tarea llama a la funcin API RTuinOS
rtos sendEvent y esta ltima tarea se reanudar. En esta situacin depende de
las prioridades de las dos tareas cmo rtos SendEvent devoluciones. Si el
evento- tarea ajuste tiene el mismo o superior rtos prioritarios sendEvent
devolver inmediatamente como un ordinario sub-rutina. La otra tarea vence
pero no activo. Si la tarea de evento de recepcin tiene la mayor prioridad,
RTOS sendEvent conduce a la inactivacin temporal de la tarea de llamada y
slo volver cuando se activa de nuevo. Ms en general, RTOS sendEvent se
implementa como una interrupcin de software (SWI) y se comporta similar a el
ISR temporizador del sistema. Notifica un evento transmitido ordinaria a todas
las tareas actualmente suspendidas, que se espera de l y pasa a eventos de
tipo mutex o un semforo a la propia tarea de alta prioridad, que exigido para
adquirirla. El resto se hace exactamente como el temporizador del sistema ISR
hace. cheques rtos SendEvent la condicin hoja de vida de todas las tareas
suspendidas. Esas tareas la condicin de que se cumple se mueven a al final
de su debido lista. Entonces se selecciona la nueva tarea activa. Este podra
ser el mismo o en otro tarea. El SWI termina con la continuacin de la nueva
tarea activa. Como cuestin de hecho, una llamada de RTOS sendEvent nunca
har que la indebida tarea llamada (es decir, en suspensin); ms externa
inactiva. Esta es la razn, por qu rtos sendEvent incluso puede ser llamado
por la tarea ociosa. Nota al pie: Existe una relacin transversal entre rtos
sendEvent y los comandos de suspensin. A vista de pjaro sobre el cambio de
principal que hacer cuando el cambio entre tareas es alterar el valor del
contador de programa de la que se secuencia a uno de los otros. Hay comando
CPU dedicada para hacerlo, como salto, que directamente carga el PC con la
direccin deseada objetivo o estrategia en tiempo real y reti, que cargar el PC
de la pila. Obviamente, un programador tiene que ser capaz de continuar
despus la secuencia de comandos izquierda, o tarea respectiva tivamente. La
continuacin tiene que ser transparente, hacer como si no hubiera habido un
cambio a otro secuencia en absoluto. Esto significa, en primer lugar, que
nosotros recordamos el valor del PC tena antes de que nos forzamos para que
apunte a la otra secuencia del programa. Pero tambin significa que los
registros de datos de todas las CPU tienen exactamente el mismo valor que
solan tener antes del cambio. Esta condicin slo puede cumplirse si salvamos
el contenido de todos los registros antes de cambiar a otra secuencia de
comandos. El AVR CPU tiene 32 registros de datos de uso general adems de
un registro de estado. El planificador tiene una objeto de tarea para cada tarea.
Sera sencillo tener una uint8 ordenacin t saveReg [32 + 1] como miembro del
objeto de trabajo y colocar el contenido del registro aqu. S, esto bsicamente
trabajar bien pero hay es una manera mucho ms simple y ms barato que
hacer: Todos los registros se insertan en la pila. La facilidad de hacer comienza
con el ahorro de la PC: Como hemos visto, un cambio de tarea se inicia siempre
por cualquiera de una interrupcin o la llamada de una funcin API (una funcin
o RTOS SendEvent suspender). Ambas operaciones de las mquinas comienzan
ejecucin con empujar la PC actual en la pila. Como tenemos la intencin de
utilizar la pila como lugar de almacenamiento de todo nuestro registra que est
bien tener ya la PC aqu, donde desea que tenga. Almacenamiento de los otros
registros en la pila es tan fcil: El conjunto de comandos de cualquier CPU
contiene un comando de empuje que almacena directamente la contenido de
un registro de datos en la pila. Para una CPU AVR este comando se llama
empuje. En consecuencia, todas las rutinas de interrupcin de servicio y todas
las funciones de la API, lo que podra iniciar un cambio de tarea, empezar con
32 empuje operaciones para guardar los registros de datos de propsito
general. (Una excepcin importante se menciona en la seccin 2.7.1 .) Esta
secuencia de cdigo se completa con dos comandos CPU simples que tambin
empujan el estado de la CPUregistrarse en la pila. El registro de entrada
empujando los comandos de un ISR o una funcin API cambio de tarea
causando bsicamente permiten esta funcin para cambiar el PC para que
apunte al cdigo de otra tarea (y as continuar con esa tarea). Averiguar si esto
es necesario, ser el siguiente paso de estas funciones. Muy a menudo esto no
lo har ser el caso. En cuyo caso, la funcin termina haciendo todo en orden
inverso. Todos los registros se leen y tomada de la pila de nuevo. (Ellos se
"saltaron" de la pila). Esto incluye el PC como ltimo registro - y la ejecucin de
cdigo contina donde la interrupcin haba interrumpido el cdigo de tarea, o
detrs la funcin de la API, respectivamente. Esto es como cualquier rutina de
servicio de interrupcin ordinaria. Cmo guardar los registros en la pila es fcil,
en la pila es como subir una colina, desde su cima de saltar a la parte superior
de cualquiera de las otras colinas alrededor y luego nos deslizamos hacia abajo
(es decir, restaurar los registros con el contenido de esta otra colina). Hacer la
buena preparacin de almacenar el contexto de la CPU en la pila el cambio de
tarea completa se reduce a nada ms que intercambiar el valor de puntero de
pila de la CPU. El valor de la todava tarea activa se guarda y se carga el valor
de la tarea recin activado - eso es todo. A continuacin os dejamos el cambio
de tarea causando funcin y su registro sencillo apareciendo cdigo de salida
carga el contexto anterior guardada de la nueva tarea al igual que en la CPU.
La historia general es completa si mencionamos la inicializacin. Antes de la
primera tarea se vuelve activo el cdigo de inicializacin todava un-roscados
de RTuinOS prepara las reas de pila de todas las tareas como si estas tareas
haba estado activo antes y como si hubieran sido suspendidos luego. Esto se
hace por la simple, ensamblador cdigo libre C funcin prepareTaskStack. Se
coloca 33 bytes al comienzo de esta zona de memoria 12 - Y estos bytes se
convertirn en los valores iniciales de los registros de datos de la CPU cuando
se activa la tarea que el primera vez muy (registros de propsito general y
estado). Y frente a estos 33 bytes se coloca el dos o tres bytes de la PC
deseada (dependiendo del tipo de microcontrolador AVR). En tiempo de
ejecucin es la ubicacin de memoria de programa dnde continuar una tarea;
ahora en tiempo de inicializacin es obviamente el inicio direccin de la tarea o
- en C - el puntero a la funcin de la tarea. La direccin donde el ltimo byte ha
sido coloc es el valor del puntero de pila que tiene que ser almacenado en el
objekt tarea. Cuando se preparan todas las reas de la pila de la interrupcin
del reloj del sistema est activado y la primera tarea de activacin un poco
ms tarde de ninguna manera puede ser distinguida de cualquier cambio de
tarea ms tarde. 10 Demostrar: Para continuar la tarea izquierda no es un
requisito previo que la tarea activado termina - con el fin de "retorno" a la tarea
a la izquierda. 11 El contador de programa se extrae como el ltimo registro
con un reti comando "regreso de interrupcin". 12 El principio lgico se refera.
Esta es la ltima direccin de la memoria en el rea de pila. La arquitectura
AVR permite la pila crecer de mayor a menor direcciones de memoria.
Pgina 18
18 CAPTULO 2. CMO FUNCIONA RTUINOS? 2.7.1 Interrupcin frente Funcin
API Bsicamente todo cambio de tarea causando funciones se comportan como
se describe en la seccin anterior. Conmutador de tareas causando funciones
son o rutinas de interrupcin de servicio o funciones de la API. Las
interrupciones pueden ser el tic temporizador del sistema o una solicitud de
interrupcin. Las funciones de la API son o bien la suspensin rtos comando
waitForEvent 13 o funcin RTOS sendEvent para publicar un evento. Hay una
diferencia significativa entre las rutinas de servicio de interrupcin y funciones
de la API. La funcin API ciones pueden devolver un resultado al cdigo de
llamada pero un ISR no. Cuando la ISR devuelve a una tarea (la haba
Pgina 25
3.6. SUSPENDER UNA TAREA: RTOS WAITFOREVENT 25 la configuracin de
RTuinOS, ver [4]. A la espera de un semforo y conseguir que significa
disminuir los semforos cuenta interna. La tarea se concede el acceso a una
instancia de los recursos que son administrados por el semforo. Tenga en
cuenta, que los semforos de manejo como Boolean eventos (estar all o no
estar all) valorado impide proporcionar una API ms generalizado a los
semforos. En RTuinOS es por principio imposible adquirir varios casos desde el
fondo de recursos a la vez. Una aplicacin que tiene que tener varios casos
est obligado a repetir la invocacin de RTOS waitForEvent ese nmero de
veces. Aunque este finalmente lleva a la cantidad necesaria de instancias no es
equivalente con respecto a la distribucin patrn de los recursos compartidos.
La misma consideracin se aplica a la devolucin / liberacin de un semforo
utilizando rtos sendEvent. Desde la perspectiva de una tarea a la espera de un
semforo es como la espera de los acontecimientos ordinarios. La tarea se
suspende hasta que una instancia (o valor del contador respectivamente) del
semforo est disponible. Este ser el caso cuando una instancia cualesquiera
otros lanzamientos de tareas tales usando rtos sendEvent. O inmediatamente,
si Actualmente hay al menos un caso que queda en el semforo. Si una tarea
suspende a la espera de un semforo puede suceder que rtos waitForEvent no
suspende la llamando tarea pero vuelve inmediatamente. Por favor, consulte la
seccin 3.6.3 para ms.3.6.3 Notas sobre la espera de eventos de tipo objeto
mutex o un semforo Puede suceder que los disponibles inmediatamente
exclusiones mutuas o semforos satisface la condicin de espera de la
llamando tarea: Espera para cualquier evento entre los que un mutex
disponible inmediatamente o semforos. O espera a que todos los eventos
fuera de un conjunto, pero todos ellos estn disponibles de inmediato. Si es as,
la llamada de la funcin rtos waitForEvent no suspender la tarea. En lugar rtos
waitForEvent simplemente devuelve como un ordinario sub-rutina y el valor de
retorno indica las exclusiones mutuas y semforos adquiridos. Si una tarea
espera a que uno o ms mutexes o semforos que necesita para evaluar el
cdigo de retorno de la funcin. Si un poco ajustado corresponde a un evento
mutex la tarea es el nuevo dueo de este mutex. Si un bit activado
corresponde a un evento de semforo la tarea tuvo acceso a una instancia del
fondo de recursos administrados por este semforo. Se va a poseer el mutex o
tener acceso al recurso hasta que se libere voluntariamente el mutex o un
semforo utilizando rtos sendEvent. Dado que las condiciones de espera
pueden ser complejas, el retorno de la funcin como tal hay ninguna indicacin
segura de que un mutex o un semforo ha sido adquirido por la tarea. El ms
simple ejemplo de ello es una espera para un evento mutex con tiempo de
espera y el tiempo de espera que transcurre antes de liberar el mutex por la
tarea que propietaria. Precaucin, manteniendo correctamente un registro de la
propiedad de las exclusiones mutuas e instancias de semforos est
otra parte, estas dos funciones son un poco ms barato en trminos de Carga
de la CPU. Le sugerimos que lo use cuando la secuencia de cdigo protegido es
bastante corto, por ejemplo, slo uno o unos pocos tareas sencillas y utilizar
rtos entran / LeaveCriticalSection lo contrario. En RTuinOS una tarea de mayor
prioridad nunca llegar a ser inactivo en favor de una tarea de baja prioridad
con tal de que no suspende voluntariamente. Y si la tarea no es una tarea
round robin que va incluso nunca convertido en inactivo en favor de una tarea
igualmente prioridad (con tal de que no suspende en s). Por lo tanto, una
tarea normal de la misma o mayor prioridad no necesita operaciones atmicas
acceder comparte datos con otras tareas de igual o menor prioridad, una
tarea round robin de mayor prioridad no necesitan operaciones atmicas para
acceder a los datos que comparte con otras tareas de menor prioridad. Pero a
la inversa, sus homlogos de igual o menor prioridad, por supuesto, necesitan
proteger su cdigo de acceso para los mismos, datos compartidos. En las
tareas de sistemas cooperativos generalmente no necesitan para proteger su
acceso a los datos compartidos como tareas nunca ser interrumpido en
puntos imprevisibles (e indeseables) en el tiempo. En RTuinOS cooperativa
aplicaciones multitarea son implementados por las tareas de todos los que
pertenecen a la misma clase de prioridad. En resumen, Siempre ponga su
cdigo de acceso a datos en un par de funciones de proteccin si las acciones
de tarea esta de datos o partes del mismo con al menos otra tarea de mayor
prioridad, Siempre ponga su cdigo de acceso a datos en un par de funciones
de proteccin si la tarea tiene round robin caractersticas y si comparte estos
datos o partes de ella con al menos otra tarea de igual o mayor prioridad,
rtos uso entran / LeaveCriticalSection como par de funciones de proteccin si el
cdigo de acceso es complejo, Uso cli / sei como par de funciones de
proteccin si el cdigo de acceso es trivial. 3.8.1 Objeto mutex frente seccin
crtica Acceso a los datos compartidos de diferentes tareas de forma segura se
puede hacer con diferentes patrones de cdigo. El crtico seccin se puede
utilizar o un mutex se puede aplicar. Hay diferencias e implicaciones
significativas. El uso de un mutex es un tipo de contrato entre diferentes
tareas. Estn de acuerdo en acceder a los datos compartidos slo cuando
poseen el mutex y que prometen ser la duea ya no lo absolutamente
necesario. Hay sin embargo no hay medios tcnicos que garanticen este;
cualquier tarea realmente puede acceder a los datos compartidos en cualquier
momento y corromperlo. Por otra parte, no hay ninguna relacin directa, visible
en el cdigo fuente entre el mutex y los datos compartidos. Los ejemplos de
cdigo que vienen junto con RTuinOS demuestran dos tcnicas a superar esta:
o re-definir el nombre genrico de la exclusin mutua para que la relacin con
el compartido objetos se hacen evidentes o se esconden las operaciones para
adquirir y liberar el mutex de la misma clase que implementa el objeto
compartido. Una seccin crtica es un mecanismo tcnico, lo que dificulta el
planificador para cambiar a cualquier otra tarea (Incluyendo las interrupciones
y sus tareas de controlador) mientras se ejecuta el cdigo cerrado. Manejo de
biblioteca AVR cualquier lugar tenemos una dependencia plataforma tan obvia.
El caso ms es "aplicacin mentado "como directiva error para que usted est
apuntando directamente a todos estos lugares de cdigo simplemente
haciendo un compilacin con otro microcontrolador seleccionado en el
makefile. Todas las ubicaciones de cdigo, donde se coloca una directiva de
este tipo de errores son declaraciones fcil y sencillo de modificar. Usted
encontrar una cierta direccin en los comentarios de cdigo cerca de las
directivas de error. Sin embargo, decidimos a no probar una implementacin ya
que no se prob. Desafortunadamente, hay un riesgo restante, que hay ms
dependencias de la plataforma que actualmente previsto en el cdigo. Esto
slo se puede encontrar por hacer la migracin y las pruebas. La
retroalimentacin es bienvenida. El proceso de construccin makefile
controlado depende de la placa Arduino, tambin. Un cambio obvio es el
especificacin del microcontrolador en uso al compilar el cdigo. Sin embargo,
hay ms cambios requerida en el makefile. Por favor, consulte la seccin 4.2.4
para ms.
Pgina 42
Captulo 5 Panorama Esperamos que RTuinOS se considera til como es y que
aade un poco de valor para el mundo Arduino. No obstante, somos
conscientes de que tiene sus limitaciones y que una gran cantidad de mejoras
son imaginables y algunos incluso factible. Algunas ideas y comentarios se han
recogido aqu. Las listas que contienen las tareas que vencen se implementan
como matrices de longitud fija. Todas las clases de prioridad utilizar una lista de
idntica longitud. Esto ha sido decidido slo por las limitaciones de la
compilacin constante expresiones de tiempo y macros. El cdigo se ejecutara
sin ningn cambio si la matriz rectangular sosteniendo todas las listas seran
reemplazados por una serie lineal de los punteros, que se inicializan para que
apunte a la clase-individuo arrays lineales. Esta construccin se ahorrara
espacio de memoria RAM en las aplicaciones que tienen las clases de prioridad
de difiriendo significativamente de tamao. Adems de algunos RAM
almacenada y la inicializacin menos transparente en la aplicacin lado 1 no
hay absolutamente ninguna diferencia de ambos enfoques y, por tanto, la
urgencia de este cambio no es considerado suficientemente alto como para
hacerlo realmente. Actualmente, la tarea de inactividad se describe por un
objeto adicional de la matriz de tarea - aunque carece de la mayora de las
propiedades de una tarea verdadera. Ubicacin En realidad, slo el puntero de
pila guardar y el (siempre cero) vectores de eventos recibidos estn en uso. Si
el objeto de tarea se divide en dos de tales objetos (manteniendo las
propiedades de todos tareas y la celebracin de las propiedades de las tareas
verdaderas solamente) algunos bytes de RAM actualmente desperdiciados
podran salvarse. La prioridad de una tarea podra ser cambiado en tiempo de
ejecucin si slo los arrays son lo suficientemente grandes - pero esto es de
todos modos en la responsabilidad de la aplicacin. La aplicacin es sencilla, ya
aadindole al final del mismo, entre parntesis, el nombre del autor o editor
original de esa seccin, si es conocido, o no, un nmero nico. Hacer el mismo
ajuste a los ttulos de seccin en la lista de Secciones Invariantes en la nota de
licencia del combinado trabajo. En la combinacin, debe combinar cualquier
seccin titulada "Historia" en los distintos docu- originales umentos, formando
una seccin titulada "Historia"; la misma forma combine cualquier seccin
titulada "Confirmacin tos ", y cualquier seccin titulada" Dedicatorias ". Debe
borrar todas las secciones tituladas "Aprobaciones". 6. COLECCIONES DE
DOCUMENTOS
Pgina 48
48 CAPTULO 5. PERSPECTIVAS Puede hacer una coleccin que conste del
Documento y de otros documentos liberados bajo esta Licencia y reemplazar
las copias individuales de esta Licencia en todos los documentos por una sola
copia que se incluye en la coleccin, siempre que siga las reglas de esta
Licencia para cada copia literal de cada uno de los documentos en todos los
dems aspectos. Puede extraer un solo documento de una de tales colecciones
y distribuirlo individualmente bajo esta Licencia, siempre que inserte una copia
de esta Licencia en el documento extrado, y siga esta Licencia en todos los
dems aspectos relativos a la copia literal de dicho documento. 7.
AGREGACIN CON TRABAJOS INDEPENDIENTES Una recopilacin del
Documento o sus derivados y de otros documentos separados e
independientes o obras, en o sobre un volumen de un medio de
almacenamiento o distribucin, que se llama un "agregado" si el derecho de
autor resultante de la compilacin no se usa para limitar los derechos legales
de los usuarios de la compilacin ms all de lo los trabajos individuales
permiten. Cuando el Documento se incluye en un agregado, esta Licencia no
aplicarse a los otros trabajos del agregado que no sean en s mismos derivados
del Documento. Si el requisito de Texto de Cubierta de la seccin 3 es aplicable
a estas copias del Documento y el Documento es menor que la mitad del
agregado entero, Textos de Cubierta del Documento pueden colocarse en
cubiertas que enmarquen solamente el Documento dentro del agregado, o el
equivalente electrnico de las cubiertas si el Documento est en forma
electrnica. En caso contrario deben aparecer en cubiertas impresas
enmarcando el conjunto agregado. 8. TRADUCCIN Traduccin es considerada
como un tipo de modificacin, por lo que puede distribuir traducciones del
Documento en los trminos de la seccin 4. El reemplazo las Secciones
Invariantes con traducciones requiere permiso especial a los titulares de
derechos de autor, pero puede incluir traducciones de algunas o todas las
Secciones Invariantes adicionalmente a las versiones originales de las
Secciones Invariantes. Puede incluir una traduccin de esta Licencia, y todas
las notas de licencia del documento, y las Limitaciones de Garanta, a condicin
de que incluya tambin la versin original en Ingls de esta Licencia y las
versiones originales de las notas y renuncias. En caso de desacuerdo entre la