Perdoe-me se esta pergunta já foi respondida, mas não consegui encontrar uma resposta nesta página ou na Internet em geral.
Sou um desenvolvedor experiente, com conhecimento decente sobre programação de baixo nível, mas relativamente novo no desenvolvimento incorporado. Eu tenho me ensinado a desenvolver sistemas embarcados usando uma placa ST-NUCLEO144, que possui uma MCU STM32F746ZG. Uma pergunta que me parece não óbvia é por que os campos de bits relacionados logicamente em um registro podem estar em locais diferentes.
Um exemplo é o USART_CR1
registro no STM32746ZG. Os campos M0
e M1
bit juntos controlam o comprimento da palavra em USART TX / RX, um valor combinado de 2 bits que 0b00
especifica 8 bits, 0b01
especifica 9 bits etc. Isso tudo é bastante direto, exceto que M0
está no bit 12 e M1
está no bit 28 ... por que isso?
Isso ocorre por motivos de design herdados, como um novo recurso que foi inserido no espaço reservado anteriormente? É por razões relacionadas ao design do chip que eu não estou considerando, ou existe um propósito maior para isso que eu não estou vendo?
Obviamente, isso é bastante trivial para superar com mascaramento de bits, mas estou curioso.
Respostas:
Nesse caso em particular (e em casos semelhantes que eu já vi), sim, isso é feito para ajudar a manter a compatibilidade com dispositivos anteriores e minimizar as alterações necessárias no código (talvez bem testado e qualificado / certificado) já escrito para esses dispositivos antigos . Novos recursos e funcionalidades (exigindo novos bits de registro para controle e configuração), portanto, precisam usar bits não contíguos, se os bits adjacentes aos bits de registro originais já estiverem sendo usados.
Por exemplo, aqui está o
USART_CR1
registro da antiga família STM32F1xx.Figura 1. Uso do registro STM32F10xxx USART_CR1
Fonte da imagem: Manual de referência da família STM32F10xxx RM0008, seção 27.6.4
Esse USART antigo (com apenas duas opções de comprimento de palavra) precisa de apenas um
M
bit para configurar o comprimento da palavra USART entre as duas opções, e esse é o bit 12. Observe como os bits 11 e 13 também são usados e, portanto, indisponíveis para "expansão" futura .Como você disse, na mais recente STM32F7 (e, por exemplo, também o STM32F4) a USART agora tem 3 opções de comprimento de palavra (7, 8 e 9 bits) e por isso precisa de outro bit de configuração - bit 12 é
M0
, comM1
agora em pouco 28 (previamente reservado no mapa de registro STM32F1, como você vê acima).Figura 2. Uso do registro STM32F74xxx USART_CR1
Fonte da imagem: Manual de referência das famílias STM32F75xxx e STM32F74xxx RM0385, seção 31.8.1
Eles não podiam colocar o novo
M1
bit nos bits de registro 11 ou 13, sem mover os bits de registro já utilizados para outras funções e, assim, remover a compatibilidade com o código existente (por exemplo, para o STM32F1) que os utilizava.Portanto, eles tentaram manter alguma compatibilidade com versões anteriores, o que leva a novos bits de registro sendo adicionados em locais inesperados.
Manter o mapeamento de registros para UARTs independentes, do 8250 ao 16550, com novos registros adicionados em outras partes do mapa de registros, foi outro exemplo.
fonte
Você está certo com
Até onde eu sei, as próprias posições de bits quase não têm impacto no design (na implementação de chips, na minha opinião) na maioria dos casos. Os designers geralmente tentam utilizar o que está disponível. E, em alguns casos, como quando você está tentando estender larguras etc.
Dito isto, existem alguns casos em que as posições dos bits são intencionalmente mantidas afastadas. Especificamente para bits críticos e que NÃO devem ser modificados por gravações não intencionais (devido a posições / máscaras incorretas ou embaralhadas por segurança) que podem fazer com que o sistema termine em um estado indesejado.
fonte