Red de conocimiento informático - Consumibles informáticos - ¿Cómo inicializar s3c2410 en Chuyang?

¿Cómo inicializar s3c2410 en Chuyang?

Con el desarrollo de la tecnología de la información y la popularización de los productos digitales, los sistemas integrados con tecnología informática, tecnología de chips y tecnología de software como núcleos se han convertido una vez más en un punto caliente en la investigación y aplicación actuales. Un sistema integrado que tiene requisitos estrictos en cuanto a función, confiabilidad, costo, volumen y consumo de energía generalmente consta de cuatro partes: un microprocesador integrado, dispositivos de hardware periféricos, un sistema operativo integrado y aplicaciones de usuario. el núcleo de su hardware y software respectivamente.

Los procesadores ARM se utilizan ampliamente en soluciones RISC integradas de 16/32 bits debido a su pequeño tamaño, bajo consumo de energía, bajo costo y alto rendimiento, y representan casi el 75% de la participación de mercado de los microprocesadores integrados. Este artículo selecciona el chip SOC S3C2410 de alto rendimiento y bajo consumo basado en el núcleo ARM920T producido por Samsung como plataforma de hardware para la solución de trasplante. Los principales sistemas operativos integrados en tiempo real del mercado incluyen Vxworks, pSos, WinCE, Linux, etc. Basándonos en consideraciones de rendimiento en tiempo real, costo y dificultad de desarrollo, elegimos el sistema operativo integrado en tiempo real de código abierto UC/OS II.

1 Introducción a uC/OS II

UC/OS II (Microcontroller Operating System II) es un kernel multitarea en tiempo real que puede ejecutarse en base a ROM y puede personalizarse y adelantado (ver Figura 1), altamente portátil, especialmente adecuado para microprocesadores y controladores. Es un sistema operativo en tiempo real (RTOS) con el mismo rendimiento que muchos sistemas operativos comerciales. Para proporcionar el mejor rendimiento de portabilidad, uC/OS II se desarrolla utilizando en su mayor parte el lenguaje ANSI C y se ha portado a casi 40 sistemas de procesador, cubriendo varias CPU (incluido DSP) desde 8 bits hasta 64 bits.

UC/OS II puede considerarse simplemente como un programador multitarea, en el que se mejoran y agregan servicios del sistema relacionados con los sistemas operativos multitarea, como semáforos, buzones de correo, etc. Sus características principales son código fuente abierto, estructura de código clara, comentarios detallados, organización clara, buena portabilidad y se puede cortar y solidificar. El núcleo es interrumpible y puede gestionar hasta 60 tareas. Desde 1992, uC/OS II se ha utilizado en una amplia gama de aplicaciones, desde cámaras hasta aviónica, debido a su alta confiabilidad, robustez y seguridad.

2 Portabilidad de UC/OS II en S3C2410

La llamada portabilidad consiste en permitir que este kernel en tiempo real se ejecute en un microprocesador. Para facilitar la portabilidad, la mayoría de los códigos de uC/OS II están escritos en lenguaje C, pero algunos códigos relacionados con el procesador aún deben escribirse en C y lenguaje ensamblador, porque uC/OS II solo puede leer y escribir registros del procesador en lenguaje ensamblador. . Debido a que uC/OS II fue diseñado teniendo en cuenta la portabilidad, portar uC/OS II es relativamente fácil. La estructura del marco de uC/OS II se muestra en la Figura 2.

El funcionamiento normal de uC/OSII requiere que la plataforma del procesador cumpla con los siguientes requisitos:

a) El compilador C del procesador puede generar código reentrante.

b) Las interrupciones se pueden activar y desactivar en lenguaje C.

c) El procesador admite interrupciones y puede generar interrupciones programadas (normalmente entre 10 y 100 Hz).

d) El procesador admite una pila de hardware que puede contener una cierta cantidad de datos (quizás varios kilobytes).

e) El procesador tiene instrucciones para leer y almacenar el puntero de la pila y otros registros de la CPU en la pila o la memoria.

El procesador S3C2410 utiliza el núcleo ARM920T y tiene un total de 37 registros internos, de los cuales R13 se suele utilizar como puntero de pila. Siempre que el espacio de RAM del sistema lo permita, teóricamente no hay límite en el espacio de la pila. El procesador ARM proporciona dos conjuntos de instrucciones: instrucciones ARM e instrucciones Thumb. Cada conjunto de instrucciones contiene un rico conjunto de instrucciones para operar la pila, que pueden operar arbitrariamente los registros en el procesador. Según las diferentes direcciones de crecimiento de la pila, se pueden generar cuatro pilas diferentes, a saber, incremento completo, incremento vacío, decremento completo (esta migración utiliza decremento completo) y decremento vacío. En el chip se integran cinco relojes de sincronización, cualquiera de los cuales puede generar una interrupción de sincronización para cumplir el tercer requisito. El compilador integrado del entorno de desarrollo integrado ADS puede generar código reentrante y admite ensamblaje integrado. En un entorno C, los cambios se pueden interrumpir a voluntad.

En resumen, uC/OS II se puede trasplantar para ejecutarse en S3C2410.

3 Proceso de trasplante de cuerpo principal

3.1 Código de configuración relacionado con el procesador y el compilador [OS_CPU. H]

Diferentes compiladores utilizarán diferentes longitudes de bytes para representar el mismo tipo de datos, por lo que se debe definir una serie de tipos de datos para garantizar la exactitud del trasplante. Los siguientes son algunos tipos de datos definidos por uC/OS II.

carácter sin signo typedef Valor booleano;

carácter sin signo typedef INT8U/*8 bits sin signo*/

carácter con signo typedef int 16S;/* 8 bits con signo */

typedef unsigned int int 16U; /*unsigned 16 bits*/

typedef firmado int int 16S /*signed 16 bits */

typedef sin signo largo INT32U/*número de 32 bits sin signo*/

typedef con signo largo INT32S/*número de 32 bits con signo*/

typedef float FP32/*punto flotante de precisión simple */

typedef double FP64/*punto flotante de doble precisión*/

typedef unsigned int OS_STK /*Ancho de entrada de pila*/

typedef unsigned int OS; _ CPU _ SR/*Ancho de registro*/

UC/OS II necesita desactivar las interrupciones antes de acceder al código de sección crítica Permitir la interrupción nuevamente después del acceso. UC/OS II define dos macros que deshabilitan y habilitan interrupciones: OS_ENTER_CRITICAL() y OS_EXIT_CRITICAL(). Este trasplante implementa el código ensamblador de estas dos macros.

# define OS _ ENTER _ CRITICAL()(CPU _ Sr = OSCPUSaveSR())/*Deshabilitar interrupciones*/

# define OS _ EXIT _ CRITICAL()(OSCPURestorSR( CPU_Sr))/*Habilitar interrupciones*/

Exportar OSCPUSaveSR

OSCPUSaveSR

Mrs r1,cpsr

mov r0, r1

orr r1, r1, #0xc0

msr cpsr_cxsf, r1

mov pc, lr

Exportar OSCPURestorSR

OSCPURestoreSR

msr cpsr_cxsf, r0

mov pc, lr

3.2 Utilice el lenguaje C para implementar funciones relacionadas con las tareas del procesador [OS_CPU_C.C]

OSTaskStkInit()

OSTaskCreateHook()

OSTaskDelHook()

OSTaskSwHook()

OSTaskStatHook()

>

OSTimeTickHook()

Solo es necesario modificar la función OSTaskStkInit() y las otras cinco funciones deben declararse, pero es posible que no tengan contenido real. Estas cinco funciones están definidas por el usuario, por lo que no se proporciona ningún código en OS_CPU_c.c. Si necesita utilizar estas funciones, puede configurar la constante #define OS_CPU_HOOKS_EN en el archivo OS_CFG. h a 1, lo que significa que estas funciones no se utilizan.

La función OSTaskStkInit() es llamada por OSTaskCreate() o OSTaskCreateExt(). Los parámetros a pasar son la dirección inicial del código de la tarea, el puntero del parámetro (pdata) y la dirección superior de la tarea. pila y la prioridad de la tarea. Úselo para inicializar la pila de tareas. La pila inicial simula la estructura de la pila después de una interrupción.

Después de inicializar la pila, OSTaskStkInit() devuelve el nuevo puntero superior de la pila y OSTaskCreate() o OSTaskCreateExt() guarda el puntero en OS_TCB de la tarea. Llame a OSTaskStkInit() para crear una pila de contexto de tarea inicial para la tarea, cuya forma se muestra en la Figura 3.

3.3 Implementación de componentes relacionados con el procesador ensamblador

En toda la implementación del trasplante de uC/OS II, solo se requiere un archivo de lenguaje ensamblador y varias funciones que deben implementarse mediante ensamblador son proporcionó. .

a)osstarthurdy()

Esta función es responsable de obtener el puntero de pila sp de la tarea del bloque de control TCB de la tarea de mayor prioridad después de la multitarea OSStart(). se inicia y restaure la CPU en el sitio a través de sp. En este punto, el sistema cede el control al proceso de la tarea creada por el usuario hasta que la tarea se bloquea o la CPU es reemplazada por otras tareas con mayor prioridad. Esta función solo se ejecuta una vez cuando se inician varias tareas y se utiliza para iniciar la ejecución de la primera, es decir, la tarea de mayor prioridad.

b)OSCtxSw()

Esta función es una función de cambio de contexto a nivel de tarea. Se ejecuta cuando una tarea la solicita activamente y la CPU la programa porque está bloqueada. La tarea principal es guardar el sitio de la CPU de la tarea actual en la pila de tareas, luego obtener el puntero de la pila de la tarea de mayor prioridad y reciclar el sitio de la CPU de la tarea de la pila para continuar la ejecución, completando así un cambio de tarea.

C)OSIntExit()

Esta función es una función de cambio de tarea a nivel de interrupción. Cuando se encuentra una tarea de alta prioridad esperando en el ISR de interrupción del reloj, la tarea de alta prioridad lista debe programarse directamente para su ejecución sin regresar a la tarea interrumpida después de que sale la interrupción. Su propósito es permitir que las tareas de alta prioridad respondan lo más rápido posible y garantizar la naturaleza en tiempo real del sistema.

Osticksl()

Esta función es una función de procesamiento de interrupciones de reloj. Su tarea principal es manejar las interrupciones del reloj y llamar a la función OSTimeTick implementada por el sistema. Si hay una tarea de alta prioridad esperando una señal de reloj, entonces se debe programar su ejecución en el nivel de interrupción. Las otras dos funciones relacionadas son OSIntEnter() y OSIntExit(), las cuales deben ejecutarse en el ISR.

4 Prueba

En este punto, el proceso de migración del código se ha completado y el siguiente paso es la prueba. Probar un kernel multitarea en tiempo real como uC/OS II no es complicado y ni siquiera requiere una aplicación. En otras palabras, deje que el kernel en tiempo real se ejecute en la placa de destino y deje que el kernel se pruebe a sí mismo. Esto tiene dos beneficios: primero, evita complicar algo que ya es complicado; segundo, si hay un problema, sabes que el problema radica en el código del kernel y no en la aplicación. Inicialmente, puede ejecutar algunas tareas simples y marcar rutinas de servicio de interrupción. Una vez que el programador multitarea se ejecuta correctamente, agregar tareas para la aplicación es muy sencillo.

5 Conclusión

El microprocesador integrado S3C2410 basado en ARM9 puede permitir que el sistema tenga capacidades informáticas de alto rendimiento y facilitar la conexión y expansión con varios periféricos, simplificando el diseño del hardware. manteniendo la miniaturización. Como sistema operativo de código abierto, uC/OS II es estable y confiable en aplicaciones específicas y admite la pila de protocolos uIP TCP/IP, ucGUI, etc. , altamente escalable y potente. El sistema está desarrollado y diseñado utilizando ARM9+uC/OS II. Tiene las características de alta precisión, funcionamiento estable, buen rendimiento en tiempo real, fuerte capacidad antiinterferencias y rendimiento de alto costo. Puede usarse ampliamente en diversos sectores industriales. situaciones y realiza la intención del diseño original.