Por que os campos de bits relacionados logicamente nos registros MCU costumam ser em locais separados?

9

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_CR1registro no STM32746ZG. Os campos M0e M1bit juntos controlam o comprimento da palavra em USART TX / RX, um valor combinado de 2 bits que 0b00especifica 8 bits, 0b01especifica 9 bits etc. Isso tudo é bastante direto, exceto que M0está no bit 12 e M1está 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.

ajxs
fonte
11
No caso do UART especificamente, é uma tecnologia muito antiga, portanto, o motivo é quase sempre a compatibilidade com versões anteriores. A mesma razão pela qual o UART registra campos de bits geralmente tem nomes ruins que causam colisões de namespace por toda parte.
Lundin

Respostas:

13

Isso ocorre por motivos de design herdados, como um novo recurso que foi inserido no espaço reservado anteriormente?

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_CR1registro da antiga família STM32F1xx.


STM32F1xx registra o uso de bit USART_CR1

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 Mbit 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, com M1agora em pouco 28 (previamente reservado no mapa de registro STM32F1, como você vê acima).


STM32F74xxx registra o uso de bit USART_CR1

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 M1bit 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.

SamGibson
fonte
11
Muito obrigado por reservar um tempo para apontar isso. Talvez eu devesse ter verificado o antigo material de referência da família F antes de perguntar. Achei que poderia haver mais na história.
Ajxs 19/05/19
11
@ajxs - De nada. Só posso falar de minhas experiências (aqueles velhos UARTS foram outro bom exemplo). É sempre possível que outra pessoa tenha outras experiências relevantes e pode ser adiada por gastar um tempo escrevendo uma resposta, se a pergunta já tiver uma resposta aceita. Para que você sempre "inaceite" minha resposta, espere (digamos) um dia por alguém para responder de perspectivas diferentes e veja se você acha que eles respondem à pergunta melhor do que a minha? Caso contrário, você sempre pode aceitar novamente o meu :-) Só não quero que você perca outras perspectivas de resposta em potencial.
SamGibson 19/05/19
2
Isso parece razoável, vou seguir seu conselho! Obrigado por ser tão cortês a ponto de fazer a sugestão. Se não houver uma resposta melhor amanhã, aceito a sua. Obrigado novamente.
Ajxs 19/05/19
5

Você está certo com

"..por motivos de design herdados, como um novo recurso foi inserido no espaço previamente reservado ..".

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.

rs747
fonte