Um pouco mais de RISC-V

Estou fazendo programação de microcontroladores. E não apenas escrevo programas para eles, mas principalmente programas para programadores. E queria compartilhar um pouco da alegria do mk conquistado. De repente, alguém está sofrendo com gd32vfxx.



Programa MK o mais diferente. Estes são os bem conhecidos stm, lattice, microchip, nuvoton, altera, etc. e coisas exóticas como azoteq, silicon works ou freescale de algum lançamento de 2003. Todos eles (enfim, quase todos) desenvolvem um protocolo próprio, único, que ninguém mais tem e é o melhor. Embora seja realizada sob o lema do universal. E todo esse conjunto de protocolos universais agrada pela diversidade. Se há um exagero aqui, é um pouco.



Mas este artigo recente me levou a escrever aqui... Acabaram de chegar até mim amostras de diferentes famílias gd32 e, tendo escrito programas para programar todas as famílias inferiores, bufei sobre a família RISC-V. E eu vi este artigo. Bem, pensei, se alguém estiver interessado em reler a folha de dados, a folha de dados de programação também pode ser interessante.



As famílias mais jovens são programadas via JTAG e SWD (com pequenas exceções, onde existe apenas SWD.gd32f130xx, por exemplo). O gd32vf, por outro lado, possui apenas JTAG. Mas JTAG ou SWD são apenas ferramentas. A condução com essas ferramentas ocorre de maneiras muito diferentes. Se você puder ler a especificação de arquitetura de interface de depuração ARM sobre gd32f e tudo estiver claramente descrito lá, então sobre gd32vf está manchado em Suporte a depuração externa RISC-V e no Manual de conjunto de instruções RISC-V. E essas duas obras não podem ser dominadas com meio chute. Este último também tem um subtítulo Volume II. Isso assustou. Portanto, há também um pig com o número 1 e possivelmente os números 3 e 4.



De acordo com o Suporte de depuração externa RISC-V, o acesso aos registros pode ser feito de duas maneiras:



  1. Usando Comando Abstrato
  2. Usando Buffer de Programa


Para memória três:



  1. Usando o acesso ao barramento de sistema (ausente no GD32VF)
  2. Usando Buffer de Programa
  3. Usando o Acesso à Memória Abstrata


Como o GD32VF não tem acesso ao barramento de sistema (os bits de "acesso de barramento de sistema são suportados" no registro sbcs) e não há prazer em usar um buffer de programa e escrever assembler nele, há uma maneira muito boa de lidar com os comandos. No começo era completamente incompreensível para mim onde esses caras espertos pegavam o número do cadastro (Número do cadastro para acessar). A descrição do valor regno orgulhosamente diz: Número do registro a acessar, conforme descrito na Tabela 3.3.



imagem



Mas onde exatamente. Mas então eu os encontrei na folha de dados adjacente mencionada acima (Manual do Conjunto de Instruções RISC-V. Volume 2) e o sol brilhou.



Então tudo funcionou. Tudo realmente acabou sendo mais conveniente do que o gd32f. Do ponto de vista de despejar código nele. Mas aquilo era apenas o começo. Agora eu precisava escrever um monitor para ele. Para torná-lo ainda mais rápido do que rápido. IAR não me deixou baixar minha BANCADA dele, embora ele estivesse se gabando disso com força e força. Ainda não encontrei um lugar para clicar e fazer o download. O gerente chinês que enviou as amostras disse que eles estavam usando o NucleiStudio e eu baixei e instalei. Pareceu-me que o mais inconveniente que usei foi a cadeira de balanço. Não entendo como os desgraçados do passado carregaram água e secaram. Eu estava molhada até o topo da minha cabeça. Mas o NucleiStudio superou o roqueiro. Em geral, depois de muito tormento, consegui enfiar os dados e funções nos lugares certos da memória. Tenho certeza de que você pode fazer isso com mais elegância, mas não fui o suficiente.



Se parece com isso.



Precisamos encontrar o script original (eu o encontrei em algum lugar nas entranhas deste eclipse, se estava errado), que contém um monte de rabiscos incompreensíveis e adicionar uma descrição dos endereços necessários lá



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


Ainda assim, o quanto do arquivo * .icf do IAR parece muito mais claro e simples! Mas isso é uma questão de hábito, eu acho. Quando eu estava procurando por esse arquivo infeliz, o Google me garantiu o tempo todo que não há nada mais poderoso, forte, legal e flexível do que um script de link. Talvez, mas estou exausto. De qualquer forma. Shoveled.



Agora só preciso reorganizar o PC e tudo funcionará em uma velocidade terrível. Mas o monitor ainda não funcionou. E agora o parágrafo pelo qual comecei tudo isso. O que ajudará futuros pesquisadores RISC-V-Miracle.



Aqui está ele.



Para reorganizar o PC, você só precisa escrever seu valor no registrador dpc e, no início do hart, o valor será copiado para o PC. Até este ponto, o programa já escreveu e leu vários outros registradores. Com grande sucesso, devo admitir. E o monitor não funciona. Acontece que, para escrever no dpc, você precisa escrever lá e depois ler a partir daí. Por que isso acontece, eu não sei. Eu li toda a documentação novamente e "segui o destino dos heróis com entusiasmo". Mas nunca descobri por que isso acontece.



Depois disso, tudo funcionou. O único inconveniente de ler algo de memória é parar Hart e reiniciá-lo. Não é muito conveniente, mas não assustador. Por exemplo, para descobrir como o monitor se sente lá e se ele terminou de funcionar, você precisa interromper Hart, ler a memória necessária e, se necessário, iniciar novamente.



Espero que o parágrafo sobre dpc poupe algumas horas de tempo para alguém e seja possível não fazer nada durante todo esse tempo.



All Articles