Eu finalmente descobri por que estava sempre quebrando. Foi uma combinação de dois fatores (como é o caso dos problemas complicados).
- Ao acessar a memória através de
/dev/mem
, ela deve estar alinhada à página - Ao acessar a memória do FPGA, o fluxo de bits deve ser carregado primeiro
Inicialmente, eu estava carregando o fluxo de bits do FPGA (com cat stream.bit > /dev/xdevcfg
) e, em seguida, tentando acessar os registradores diretamente com a referência do endereço físico (sem mapeamento). Mais tarde, examinei a leitura de /dev/mem
com devmem2, mas não carreguei o fluxo de bits. Ambos causaram erros semelhantes, travamentos de programa e congelamentos de kernel, e demorou um pouco para ver que havia dois erros.