Proceso de migración de FreeRTOS 10.4.3 en una plataforma RISCV

No es tan buena una buena memoria como una mala pluma, es fácil resumir y afinar por un lado para registrar la experiencia del trasplante, y por otro lado, compartir, para que otros puedan evitar algunos desvíos.

En primer lugar, resuelva el marco de trasplante. FreeRTOS sigue siendo muy simple. Es mucho más liviano que los sistemas de trabajo pesado como RT-Thread y Nuttx. Por lo tanto, FreeRTOS generalmente no se usa en soluciones de trabajo pesado con MMU. Más aplicaciones son en industrias como la industria Aplicaciones integradas como control o electrodomésticos.

El marco general de trasplante es el siguiente:

Hablemos de los pasos específicos del trasplante:

  1. Configure el entorno de construcción, prepárese para usar el entorno ya construido en melis y pida prestados "pollos". El objetivo es trasplantar el sistema FreeRTOS, por lo que esta parte no se centra en la grabación. En resumen, el entorno se ha construido.
  2. ¿Utiliza sbi por el momento y lo optimiza más tarde, porque en comparación con Melis, el sistema construido por FreeRTOS es mucho más simple? Sin la compatibilidad con MMU, todo el sistema FreeRTOS y las aplicaciones pueden ejecutarse en modo M, y sbi perderá su existencia Necesario, pero decidió mantenerlo primero y optimizarlo después de que se complete el trasplante. Hay tres consideraciones principales: 1. Hay dependencias entre el entorno y el sbi, incluidos los scripts de enlace, algunas compilaciones, etc. No quiero tocarlo en este momento. 2. El propio SBI proporciona algunas interfaces de extensión de proveedores. Estas cosas no están seguros por el momento. No se utilizará. Si se omite, se puede volver a agregar de alguna forma en caso de necesidad, lo cual es problemático. Por lo tanto, comience temporalmente con SBI y luego realice la resta gradualmente. 3. Utilice el controlador de puerto serie encapsulado en sbi para iniciar el sistema mínimo. Para comenzar con SBI, debe realizar algunas modificaciones menores en el firmware de SBI, los cambios son los siguientes:
    1. diff --git a/firmware/fw_jump.S b/firmware/fw_jump.S
      index afbcec0..79b3de8 100644
      --- a/firmware/fw_jump.S
      +++ b/firmware/fw_jump.S
      @@ -84,7 +84,7 @@ fw_next_addr:
               * The next address should be returned in 'a0'
               */
       fw_next_mode:
      -       li      a0, PRV_S
      +       li      a0, PRV_M
              ret
      

      Modifique la implementación de fw_next_addr, y use el siguiente estado devuelto para que sea PRV_M, es decir, la siguiente etapa es M-Mode, S-Mode que no se ejecuta en Linux y Melis. La verificación es la siguiente: 0x40010600 es el SO _star dirección, es posible saltar correctamente fuera del OSE y entrar en esta dirección, lo que indica que el siguiente arranque de la CPU se puede realizar.  ,

    2. La siguiente figura representa el estado abierto de los componentes funcionales del procesador actual.Puede ver que la caché de I / D y los mecanismos relacionados con la PMU se han activado.

      1.  mxstatus bit 30 bit 31 es 0b11, lo que indica que el sistema se está ejecutando en modo máquina.

  3. Desarrolle el script de enlace para determinar la distribución del diseño del archivo ELF después del enlace final. MMU no está habilitado, por lo que el VA = PA general, como se muestra en la siguiente figura:
  4. Consideraciones sobre el proceso de puesta en marcha
    1. Todos los registros definidos por ISA se encuentran en un estado determinado, incluidos GPRS y FPU.
    2. Inicialice el TLB, pero el modo M no accede a la tabla de páginas. Esto es para acceder a la dirección de memoria alta en el modo S, porque después de mapear a través de la MMU, la memoria física puede acceder a 40 bits, no solo a los 39 bits definidos por el VPA.
    3. Dado que la tabla de páginas está construida en el TLB, no en la memoria, el TLB se inicializa directamente aquí. La tabla de páginas en el TLB no se puede vaciar porque la memoria física no tiene entradas de tabla de páginas. (Esto es fácil de cumplir, el el rango de mapeo y acceso es menor que el TLB La capacidad que se puede mapear, las entradas de TLB no se intercambiarán, por supuesto, si hay una opción de bloqueo de TLB, estará más garantizada).
    4. A diferencia del aterrador acceso del kernel de Linux a la FPU, para que FreeRTOS se ejecute a toda velocidad, vamos a admitir completamente la aceleración de la unidad FPU del kernel y usaremos SR_SD para indicar el estado del registro FPU configurado en Logre guardar / restaurar de forma diferida. (Utilice la compilación -mabi = lp64d o -mabi = lb64v, el kernel de Linux solo se puede compilar con -mabi = lp64, el modo de usuario solo tiene la opción),
    5. Inicialice la pila de visualización y rellénela con instrucciones "ebreak" para evitar accidentes.
    6. Los parámetros pasados ​​al kernel incluyen el tiempo de inicio, la ubicación de misa y sbi, que serán optimizados por SBI más adelante.

      1.  
  5. Si quieres hacer bien tu trabajo, primero debes afilar tus herramientas.En cuanto a la impresión, después de ingresar c, lo máximo que quieres ver es imprimir.La eficiencia de depuración y ensamblaje para cada problema sigue siendo relativamente baja. Aquí vamos a utilizar la función de impresión printf en newlibc, y la capa inferior conectará _write_r al controlador del puerto serie depurado en sbi. Encontré un episodio en el medio. Cuando llamé a printf para la salida, en realidad ingresé la excepción handle_exception. El análisis encontró que el _write_r original se usó en el paquete SBI en el modo S, y se llamó a la instrucción ecall. Este método es ciertamente posible en el modo S, pero el problema es que vamos a ejecutar FreeRTOS en el modo M , por lo que el programa en sí se ejecuta en modo M como SBI, y el registro mtvec del modo M se ha modificado a un nuevo handle_exception en el proceso anterior. Por supuesto, las solicitudes de SBI no se procesarán aquí. La solución es llamar SBI basado en la instrucción "ecall" Modificado para llamar directamente a la función sbi. El proceso de análisis se muestra en la siguiente figura:
    1. Forzar la parada en la entrada de handle_exceptions, imprimir mepc,
    2. Descubrí que mepc apunta a 0x4001b65a, descompila el archivo elf para encontrar la ubicación correspondiente y descubre que es la instrucción "ecall":
    3.  Transplante el controlador de impresión en SBI en el sistema, obtenga:
  6. Configure el temporizador y use el temporizador de clic incorporado. Este temporizador es impulsado por un oscilador de cristal externo de 24M y se puede usar directamente. Más tarde, se usará como la fuente de interrupción del latido del sistema para impulsar la programación periódica.
  7. Desarrolle la función de interrupción del temporizador de arco, use el registro de comparación y valor en clic como la fuente de latido del reloj, y el valor es impulsado por 24M. Cuando el valor y la comparación son iguales, se activa la interrupción. En este momento, la comparación de la el siguiente punto de disparo debe establecerse en el procesamiento de la interrupción Valor, el método de cálculo del incremento es 24000000 / CONFIG_HZ, es decir, el número de ciclos entre cada dos interrupciones. En primer lugar, consulte el enfoque de Linux para habilitar la interrupción del temporizador y la capacidad de interrupción externa del modo máquina en trap_init.
  8. Encienda el temporizador de clic arch. Tenga en cuenta que los registros Mtime y Compare son similares al mecanismo de generación de ticks en MIPS. Este es el diseño de SIFive, y muchos proveedores lo siguen.
  9. El flujo completo del segmento se muestra en la figura siguiente, y el último paso activa el programador:
  10. Las interfaces que deben personalizarse incluyen  xPortStartScheduler, pxPortInitialiseStack, vPortSetupTimerInterrupt, xPortStartFirstTask cuatro interfaces, preste atención a la conexión de la interrupción del temporizador de arco.
  11.  Diseño de contexto del sitio de programación de tareas:
  12. Implementar portasmHANDLE_INTERRUPT, vPortSetupTimer Definición de interrupción, utilizada para habilitar la interrupción del temporizador y la interfaz de procesamiento de interrupciones periféricas, configCPU_CLOCK_HZ, configTICK_RATE_HZ establecer ciclo de interrupción de tick
  13. Realice el manejo de excepciones e interrupciones, y conecte la interfaz de interrupción del temporizador y la interfaz de interrupción periférica mencionadas anteriormente al proceso de manejo de excepciones.
  14. Tenga en cuenta que la organización de la pila en el sitio de interrupción es la misma que la organización de la pila en el sitio de programación de tareas, y también es consistente con el diseño de la pila cuando se inicializa la tarea. Dado que la programación de preferencia y la programación activa se ingresan a través de una ruta anormal , el procesamiento en freeRTOS es muy consistente, no es necesario distinguir si es un sitio de despacho de interrupciones o un sitio de despacho donde las tareas se transfieren activamente, como se muestra en la siguiente figura:

La lógica de programación del planificador principal:

15: Resultados del trasplante:

Resumen: Con respecto a T-HEAD ICE, he usado muchos ICE antes. Siento que hay una cosa en común, es decir, un FPGA XILINX está integrado en muchos emuladores ICE de mayor costo. La función principal de ICE es convertir PC instrucciones de depuración a JTAG. Para las señales de temporización, hay muchos chips de conversión estándar como FT232, XILINX también desempeña un papel en la conversión de protocolo, pero la lógica FPGA desaparecerá cuando se apague. ¿Cómo se asegura ICE de que la lógica de depuración no desaparece? Después de comunicarme con colegas, aprendí que generalmente hay un Flash o EEPROM integrado en el ICE para almacenar la lógica solidificada, similar al archivo de bits utilizado en la fase de verificación física de FPGA. Cada vez que se enciende el FPGA, la lógica de diseño del archivo de bits se cargarse desde la EEPROM. Sin embargo, es un poco absurdo que, aunque CKLink Pro usa XINLINX FPGA como control principal, CKLink Lite sorprendentemente ahorra y solo usa STM32 como control principal. Desde el precio, también podemos ver la diferencia obvia entre los dos, el primero es Taobao 1200, el último es solo 200, el control principal se cambia y 1,000 yuanes están fuera.

¡fin!

Supongo que te gusta

Origin blog.csdn.net/tugouxp/article/details/113111847
Recomendado
Clasificación