proex escreveu:A memoria Ram e Flash do ARM é organizada em Bytes (8 bits). Logo se usar uma variavel de 32bits, o sistema terá que fazer 4 ciclos de leitura para montar essa variavel naquele banco de registradores de 32 bits.
Só se esta implementação do Cortex-M0 for assim. Em todos os outros ARM que vi, Cortex-M3 inclusive, a word na memória tem 32 bits, e o barramento também, portanto as transferências de 32 bits alinhadas são sempre feitas em 1 ciclo de clock + wait state, que no caso dos µC que vi, costuma ser 0 para ram, e as vezes tbm para flash.
O sistema de memória deve aceitar sempre leituras/gravações em alinhamentos naturais, portanto p/ reads ou writes de 16 bits, tem que estar alinhado em 16 bits. P/ ler/gravar em 8 bits isto se torna irrelevante.
Quando o acesso é desalinhado (tou falando do cortex, que tem instruções para tal; Os arm7tdmi por ex. só fazem acesso alinhado), ou seja, fora do alinhamento natural, o que o cortex implementa é um buffer e uma lógica que calcula se pode satisfazer o pedido com 1 ou "n" reads no barramento. Estes reads são feitos alinhados como na regra anterior, e em sequencia, para um buffer interno, onde os dados são movidos e mascarados por hardware. Isto foi feito meramente para reduzir a densidade do código, embora pequeno ganho de performance tenha sido obtido pela eliminação das instruções extras. Isto está descrito com detalhes na documentação da ARM sobre o cortex-m3, e sobre o barramento de memória local.
Se o cortex-m0 foi simplificado (?) a ponto de transformar uma leitura de 32 em 4 de 8, eu não sei, mas a meu ver não faria muito sentido implementar um micro-barramento e fazer acessos a 8 bits, esta técnica está em desuso e não faz sentido num projeto voltado a reduzir o número de transistores (bus < largura da word precisa de lógica auxiliar) e o consumo de energia (mais ciclos para efetuar mais transações tendem a consumir mais energia do que transferências mais largas, mas claro que isto depende de como a coisa é implementada e mesmo quando é tradicional, tem um ponto na curva onde a equação balança pro outro lado).