4 votos

¿Cuáles son los detalles sobre el enlace archivos y código de inicio se necesita saber para escribir un sistema operativo para una uC?

Sé que a algunas personas les digo que no es necesario escribir un sistema operativo, porque hay un montón de opciones que hay. Pero no estoy interesado en el uso de un sistema operativo para resolver un problema específico. Quiero escribir uno por mí mismo, para aprender a hacerlo.

Conozco a un montón de cosas acerca de la teoría de Sistemas Operativos y también sé cómo programar microcontroladores en el metal desnudo. Pero yo sé muy poco acerca de los detalles de configuración que no están directamente relacionadas con la programación. Estoy hablando de enlace de archivos de comandos de inicio de código, etc.

Mi pregunta es: ¿qué necesito saber acerca de estos "configuración" de cosas relacionadas con el fin de poner el sistema operativo? Por favor, enlace a cierto contenido externo acerca de esas cosas, si es posible.

7voto

AitorTheRed Puntos 241

Aquí hay algunas cosas que se me vienen a la mente de inmediato.

  1. Usted debe saber todos los detalles de lo que sucede cuando el procesador sale de un power-on reset. Habrá un número de registros de control y estos tienen valores por defecto. Usted debe saber que estos, abajo fría.
  2. Usted debe saber todo de la arquitectura de CPU de los detalles. Todos los registros, modos especiales de usarlos, etc. Estas cosas se le dan pistas acerca de cómo organizar los registros de la llamada y regresar de funciones, etc. Si usted está utilizando C, o quiere ser compatible con C, usted tendrá que leer acerca de las decisiones hechas por diversos compilador de C de los proveedores (no siempre las mismas opciones.)
  3. Usted debe saber todos los detalles acerca de las diversas unidades funcionales y biblioteca código que se va a permitir que se vinculen. En particular, si el apoyo de tanteo y retracto. En algunos casos, no se puede permitir el pre-emption ya que no hay forma de guardar el estado de algunas de las operaciones que están en marcha (el MSP430 multiplicador es como este) a pesar del hecho de que el temporizador de intervalos puede interrumpir ese proceso. En algunos casos, respecto a las bibliotecas, que no puede ser interrumpido, ya que han estado estático que sería dañado por un subproceso independiente con acceso al mismo código. Etc.
  4. El código de inicio tendrán que estar vinculados a la power-on reset de la dirección de la MCU. Su trabajo es hacer lo que la inicialización se prometió. Esta podría ser la tabulación de las áreas de memoria, la inicialización de la memoria, y cualquier otra cosa que se espera que en algún estado conocido antes de la ejecución de la primera rosca/proceso. Si C está implicada, esto significa que la inicialización de todos los inicializan las variables estáticas por sus valores apropiados y la inicialización de todas las demás variables estáticas para su semántica equivalente a 0, lo que puede ser.
  5. Usted necesita saber todas las maneras en que las excepciones pueden llevarse a cabo y cómo diferenciar entre, por ejemplo, un temporizador de vigilancia de eventos vs un power on reset evento.
  6. El enlazador de archivo de entrada simplemente establece las áreas donde el código y se inicializan los datos pueden ser colocados y lo grandes que son. También utiliza los nombres de modo que el proceso de vinculación puede asignar nombre código nombre o datos inicializados a los lugares adecuados como se indica en el enlace de archivo de entrada. Esto no es complicado. Pero los detalles no tienen que ser correctos. Si usted está usando un compilador de C, que compilador de C, probablemente hará que todo tipo de suposiciones acerca de los nombres de las secciones (segmentos) y usted tendrá que obedecer o bien escribir una herramienta que modifica el código del objeto antes de la vinculación.
  7. Usted puede necesitar escribir una herramienta especial para el enlace, de todos modos. Esto puede suceder si usted tiene que admitir varios compiladores de C la generación de nombre diferentes segmentos en sus ficheros objeto; o un ensamblador de salida que también utiliza diferentes nombres; etc. A veces, la rutina de los prólogos y epílogos de no cometer los mismos supuestos, incluso, y usted puede necesitar a la revisión de esas cosas antes de vinculación. Usted también puede necesitar para escribir un instrumento de parches, de todos modos, el parche o "arreglar" las direcciones que se especifican en el objeto de archivos antes de la vinculación. (Yo he tenido que hacer esto con 6502/65816 procesador de código destinado para el archivo de ROM producción con extraños memoria-mappers que son diferentes y también incompatibles el uno con el otro.)

Y eso es sólo una lista muy corta que fluye de mis dedos, sin pensar en ello. Estoy seguro de que si me pasó otros 5 minutos, yo podía volver a esta lista. (Por ejemplo, de que no me he incluso a abordar nada acerca de lo que un depurador pueda desear en términos de información y/o modificar o insertar un código para apoyar sus operaciones. Ni he discutido las diferencias implicadas en la universidad de Harvard vs von Neumann sistemas de memoria. Ni he discutido el estándar de "programa modelo" de organización [código; constantes; init datos; uninit de datos; montón; pila, etc.])

Yo recomendaría tomar este en pasos lentos. Ya que dicen saber ya sobre el metal desnudo de la programación y conocer acerca de los sistemas operativos, así, permítanme simplemente recomendamos que lea la primera XINU libro de Douglas Comer (es circa 1984, tiene una tapa roja y no hay ningún volumen 2, etc.) Y luego ver si puede improvisar un cambio de cooperativa del sistema operativo. Esto significa que NO hay PRE-EMPTION. Sólo los HILOS -- no incluye, aparte de los procesos -, pero los hilos que comparten el mismo espacio de código, y las constantes estáticas de datos, y el montón; con la única diferencia de que se han separado de las pilas. El apoyo de un interruptor() llamada a hacer esta cooperativa cambio de subproceso de trabajo. También debe soporte de hardware controlador de eventos sin accidentalmente desbordante algunos de pila del subproceso en el proceso. Usted necesita para diseñar cuidadosamente cómo manejar los eventos de hardware y su código de controlador. (I dividir esto en hardware de bajo nivel de respuesta código + alto nivel de subproceso accesible código separados por buffers para separar los dos el uno del otro para que puedan operar de forma independiente, mientras que también apoya el hardware totalmente.)

Si quieres ir al siguiente paso, agregar inter-hilo de mensajería. El uso de una simple palabra, sólo una palabra, para cada hilo y dejar que cualquier otro hilo de escribir. Sobrescribir, de hecho. Esta no debe ser complicado. Vea si usted puede conseguir una sola palabra de mensajes entre los procesos de bien.

A continuación, añadir un sueño cola y proporcionar un temporizador que puede mover los hilos del sueño de la cola de nuevo en la cola de ejecución.

A continuación, agregue el semáforo de colas.

Si usted puede llegar a este punto, habrás aprendido mucho.

Y por cierto, me tomó menos de dos días laborables (lunes, hasta principios de los martes por la tarde) para obtener todos los de arriba de trabajo (desde cero y sin una sola línea de código a partir de proyectos anteriores, por lo que acaba de escribir tan rápido como pude pensar -- incluyendo una completa mezcla de asamblea y C a manejar eventos de hardware y así sucesivamente. Yo había corrido/el sueño/el semáforo de colas, temporizadores, y co-operative hilos junto con cada subproceso manejo de excepciones adicionales ... en menos de dos días.

Así que esto NO es una tarea particularmente difícil por delante.

Tener en ella.

2voto

RelaXNow Puntos 1164

La mayoría de los microcontroladores no es realmente apropiado para este fin. Usted quiere más de un microprocesador de propósito general.

Algunos altos final de 32 bits micros como el BRAZO y PIC32 podría dejar de escribir un sistema operativo razonable. Para un general de sistema operativo, usted necesita un procesador que puede ejecutar el código de usuario en una forma que el código de usuario no puede dañar el sistema. Esto se hace generalmente por tener una privilegiada modo y un modo de usuario. La mayoría de los micros no tienen esto.

Otro problema es que la mayoría de los micros sólo ejecutar fuera de la ROM, no de la RAM. Que hace que la carga arbitraria de código de usuario, a continuación, ejecutar difícil o imposible. El total de memoria RAM y ROM de espacio también es por lo general fijo, y no, y no puede ser extendida de forma externa. Eso no impide que un sistema operativo, sino que lo hacen las aplicaciones que el sistema puede funcionar bastante limitado. La mayoría de los micros no tienen MMUs que puede reasignar real a la lógica direcciones de memoria, y a causa de las trampas en el intento de acceder a ciertas memoria. Que hace que la paginación de difícil o imposible.

Echa un vistazo a los PIC32. Se puede ejecutar desde la memoria RAM, y tiene al menos un básico de la MMU. Algunas variantes tienen memoria suficiente para hacer útiles programas de modo de usuario posible.

Como para los detalles de la vinculación, usted realmente tiene que leer los manuales de las herramientas. No hay ningún sustituto para la comprensión de lo que el enlazador ¿y cómo controlarlo. Usted tiene que RTFM. No hay ningún acceso directo.

0voto

Bevan Puntos 20976

Sospecho que podría ser posible implementar un sistema operativo en tiempo real sin ningún conocimiento especial o personalización de la enlazador de la directiva de secuencia de comandos y el tiempo de ejecución de C código de inicio.

El enlazador de la directiva script identifica las regiones y secciones de la memoria. Si la herramienta de proveedor proporciona un defecto enlazador archivo de secuencia de comandos que funciona para su bare-metal de aplicaciones a continuación, se podría trabajar para su RTOS-aplicación basada en. Te gustaría personalizar el linker script si su aplicación se ha especializado requisitos de memoria. Los ejemplos incluyen una aplicación para un encargo del tablero con memorias externas, una aplicación especializada a las secciones de memoria que requieren especializados de inicialización, y una aplicación que funciona en combinación con un gestor de arranque de programa. No puedo pensar en una razón por la que el uso de un RTOS tendría la fuerza para personalizar el linker script. El conocimiento sobre cómo personalizar el linker script es importante para cualquier aplicación especializada que requieran independientemente de si un RTOS se utiliza.

El código de inicio inicializa el C entorno de tiempo de ejecución para su aplicación. Si la herramienta del proveedor predeterminado de inicio de código es lo suficientemente buena para su bare-metal de la aplicación, a continuación, podría ser lo suficientemente bueno para su RTOS basado en la aplicación. El código de inicio de copias de inicialización de los valores de la ROM a la RAM y ceros fuera datos sin inicializar. (Para C++ se llama a los constructores para asignan estáticamente objetos). Te gustaría personalizar el código de inicio si se han especializado las secciones de memoria que requieren especial de inicialización. Usted también puede personalizar el código de inicio si tu placa tiene especial inicialización de hardware que debe ser realizado antes de que el entorno de tiempo de ejecución de inicialización (o antes main()). No puedo pensar en una razón por la que el uso de un RTOS tendría la fuerza para personalizar el código de inicio. El RTOS puede ser inicializado desde main() (después de que el código de inicio). El conocimiento sobre cómo personalizar el código de inicio es importante para cualquier aplicación especializada que requieran independientemente de si un RTOS se utiliza.

Sin embargo, usted va a querer saber todo acerca de los registros de la CPU y de cómo las interrupciones son manejados por la CPU. Usted necesita saber que los registros de la CPU se debe guardar/restablecer para cambiar los contextos. Y las interrupciones son una excelente oportunidad para que cuando un RTOS contexto se produce el cambio.

Además de la FreeRTOS documentación, echa un vistazo a la uC/OS-III libros de Micrium.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X