Um colega mencionou que as instruções Thumb eram significativamente mais lentas que as instruções ARM (isto era para um processador AT91SAM7S32). Isso é verdade? Quais são os benefícios de desempenho de uma instrução definida sobre a outra?
Um colega mencionou que as instruções Thumb eram significativamente mais lentas que as instruções ARM (isto era para um processador AT91SAM7S32). Isso é verdade? Quais são os benefícios de desempenho de uma instrução definida sobre a outra?
As instruções THUMB não são intrinsecamente mais lentas que as instruções ARM, mas são mais limitadas em capacidade. Se o seu código precisar apenas da funcionalidade das instruções THUMB, ele ocupará menos espaço que o ARM, mas terá o mesmo número de instruções e, outras coisas, será executado na mesma velocidade. Se o seu código precisar de mais funcionalidade, isso exigiria mais instruções THUMB do que as instruções ARM para executar e levaria mais tempo, mais uma vez outras coisas são iguais (veja abaixo)
O THUMB é popular em microcontroladores por causa das instruções de tamanho menor por dois motivos:
Pela segunda razão, quando seu código não requer funcionalidade do conjunto de instruções ARM, o código THUMB na verdade é executado mais rapidamente. Isso ocorre porque suas instruções podem ser buscadas em um ciclo de E / S do flash em vez de dois. Dependendo da velocidade da sua interface flash, essa segunda leitura pode incorrer em um ou mais ciclos de espera por instrução em que sua CPU está simplesmente parada e não pode fazer nada.
Isso se torna menos problemático se você pode copiar seu código para a RAM antes de executá-lo (o que eu normalmente considero como 32 bits para microcontroladores ARM recentes), onde a única preocupação é a densidade do código. Para isso, muitas ferramentas tentarão descobrir qual representação é mais eficiente para uma determinada função. Se o compilador puder produzir o código THUMB em menos instruções, ele produzirá, mas se o ARM resultar em menos instruções, você receberá o ARM. Este é o modo padrão para Keil, se bem me lembro.
Para seu chip específico (AT91SAM7S32), a documentação menciona que o controlador flash possui um buffer de pré-busca que pode prever acessos para tornar as coisas mais eficientes, o que pode melhorar a execução das instruções do ARM. No entanto, também afirma que a pré-busca é um buffer "duplo de 32 bits" que "otimiza acessos de 16 bits", o que é mais adequado para "executar no modo Thumb", o que parece indicar que não se destina a acelerar Instruções do BRAÇO, mas para permitir que seu núcleo seja executado mais rapidamente no modo THUMB.
A partir dos diagramas, parece que o flash no seu chip realmente possui um barramento de dados de 32 bits. O pré-buscador parece funcionar lendo 32 bits inteiros, fornecendo 16 para a CPU (no modo THUMB) e armazenando em cache os 32 bits inteiros. Durante o próximo ciclo, quando a CPU ler os segundos 16 bits, desta vez do cache, o controlador flash estará lendo os próximos 32 bits e o armazenará em cache. Dessa maneira, o código THUMB pode ser executado sem mais que uma espera inicial, mesmo que a velocidade do flash seja um pouco mais lenta que a velocidade do núcleo da CPU. Seção 19.2.2 "Operações de leitura" tem mais detalhes.
Como o flash é um barramento de 32 bits (o mais próximo que posso ver), se os relógios da CPU e do Flash forem os mesmos, o THUMB fornecerá apenas a densidade de código no ARM. Se você deseja que o núcleo da CPU seja executado mais rapidamente que o Flash (e observe que não revi todo o tempo desse chip; presumo que a CPU possa executar mais rapidamente porque permite definir estados de espera), a pré-busca fornece uma velocidade vantagem do THUMB devido à redução dos acessos reais do flash. No entanto, essa vantagem de velocidade é uma vantagem por instrução. Se o número de instruções THUMB versus instruções ARM for grande o suficiente, ele superará a velocidade por instrução, resultando em uma maior velocidade por rotina do ARM.