Un poco más de RISC-V

Estoy programando un microcontrolador. Y no solo escribo programas para ellos, sino sobre todo programas para programadores. Y quería compartir un poco de alegría por el mk ganado. De repente, alguien está ahora atormentado con gd32vfxx.



Programa MK el más diferente. Estos son los conocidos stm, lattice, microchip, nuvoton, altera, etc. y cosas exóticas como azoteq, silicon works o freescale de alguna versión de 2003. Todos (bueno, casi todos) desarrollan su propio protocolo, único, que nadie más tiene y es el mejor. Aunque se lleva a cabo bajo el lema de lo universal. Y todo este conjunto de protocolos universales agrada con su diversidad. Si hay una exageración aquí, es bastante.



Pero este artículo reciente me impulsó a escribir aquí... Me acaban de llegar muestras para diferentes familias de gd32 y, habiendo escrito programas para programar todas las familias inferiores, me entusiasmé con la familia RISC-V. Y vi este artículo. Bueno, pensé, si alguien está interesado en volver a contar la hoja de datos, entonces la hoja de datos de programación de programación también puede ser interesante.



Las familias más jóvenes se programan a través de JTAG y SWD (con pequeñas excepciones, donde solo hay SWD.gd32f130xx, por ejemplo). gd32vf, por otro lado, solo tiene JTAG. Pero JTAG o SWD es solo una herramienta. Conducir con estas herramientas ocurre de formas muy diferentes. Si puede leer la Especificación de arquitectura de interfaz de depuración ARM sobre gd32f y todo se describe con bastante claridad allí, entonces acerca de gd32vf está manchado en Soporte de depuración externa de RISC-V y el Manual del conjunto de instrucciones de RISC-V. Y estas dos obras no se pueden dominar con media patada. Este último también tiene un subtítulo Volumen II. Esto alarmó. Así que también hay un cerdo con el número 1 y posiblemente los números 3 y 4.



De acuerdo con el soporte de depuración externa de RISC-V, el acceso a los registros se puede realizar de dos maneras:



  1. Usando el comando abstracto
  2. Usar búfer de programa


A la memoria tres:



  1. Usando System Bus Access (falta en GD32VF)
  2. Usar búfer de programa
  3. Uso del acceso a memoria abstracta


Dado que el GD32VF no tiene acceso al bus del sistema (los "accesos al bus del sistema son compatibles" bits en el registro sbcs), y no hay ningún placer en usar un búfer de programa y escribir ensamblador allí, hay una muy buena manera de arreglárselas con los comandos. Al principio me resultó completamente incomprensible dónde estos malditos tipos inteligentes obtienen el número del registro (Número del registro para acceder). La descripción del valor regno dice con orgullo: Número del registro para acceder, como se describe en la Tabla 3.3.



imagen



Pero dónde exactamente. Pero luego los encontré en la hoja de datos cercana mencionada anteriormente (Manual del conjunto de instrucciones de RISC-V. Volumen 2) y el sol brilló.



Así que todo funcionó. Todo resultó realmente más conveniente que el de gd32f. Desde el punto de vista de verter código en él. Pero eso fue solo el comienzo. Ahora necesitaba escribir un monitor para ello. Para hacerlo aún más rápido que rápido. IAR no me dejó descargar mi BANCO DE TRABAJO de él, aunque se jactaba de ello con todas sus fuerzas. Todavía no he encontrado un lugar para hacer clic y descargar. El director chino que envió las muestras dijo que estaban usando NucleiStudio y yo lo descargué y lo instalé. Me pareció que lo más inconveniente que usé fue la mecedora. No entiendo cómo los bastardos del pasado llevaban agua y luego caminaban secos. Estaba mojado hasta la coronilla. Pero NucleiStudio ha superado al rockero. En general, después de mucho sufrimiento, logré colocar los datos y la función en los lugares correctos de la memoria. Estoy seguro de que se puede hacer con más gracia, pero no fue suficiente.



Se parece a esto.



Necesitamos encontrar el guión original (lo encontré en algún lugar de las entrañas de este eclipse, si estaba mal), que contiene un montón de garabatos incomprensibles y agregar una descripción de las direcciones necesarias allí.



  . = 0x20000000;
  .data_sect : { *(.data_sect) }
  . = 0x20000400;
  .a_sect : { *(.a_sect) }
  . = 0x20000500;
  .f_sect : { *(.f_sect) }


Aún así, ¡cuánto el archivo * .icf de IAR parece mucho más claro y simple! Pero esto es una cuestión de costumbre, supongo. Cuando estaba buscando este desafortunado archivo, Google me aseguraba todo el tiempo que no hay nada más poderoso, más fuerte, más fresco y más flexible que un script de enlace. Quizás, pero estoy agotado. De todas formas. Con pala.



Ahora solo necesito reorganizar la PC y todo funcionará a una velocidad terrible. Pero el monitor seguía sin funcionar. Y ahora el párrafo por el que comencé todo esto. Lo que ayudará a los futuros investigadores de RISC-V-Miracle.



Aquí está él.



Para reorganizar la PC, solo necesita escribir su valor en el registro dpc, y luego, al comienzo de hart, el valor se copiará a la PC. Hasta este punto, el programa ya ha escrito y leído muchos otros registros. Con gran éxito, debo admitir. Y el monitor no funciona. Al final resultó que, para escribir en dpc, debe escribir allí y luego leer desde allí. Por qué es así, no lo sé. Volví a leer toda la documentación y "seguí con entusiasmo el destino de los héroes". Pero nunca encontré por qué esto es así.



Después de eso, todo funcionó. El único inconveniente, para leer algo de la memoria, es detener hart y luego iniciarlo de nuevo. No es muy conveniente, pero no da miedo. Por ejemplo, para saber cómo se siente el monitor allí y si ha terminado de funcionar, debe detener hart, leer la memoria requerida y, si es necesario, comenzar de nuevo.



Espero que el párrafo sobre dpc le ahorre a alguien un par de horas de tiempo y sea posible no hacer nada con todo este tiempo ahorrado.



All Articles