Acabei de encontrar algumas macros para o meu compilador de microcontrolador forçar (ou sugerir) que uma função seja executada a partir da RAM.
http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM
https://community.nxp.com/thread/389099
Em que casos isso é valioso? Por que eu apenas não executava sempre a partir da RAM se o benefício é apenas maior velocidade? Isso geralmente causa maior consumo de corrente?
microcontroller
ram
tarabyte
fonte
fonte
Respostas:
Além da velocidade e de outros recursos que outros já mencionaram, a execução de código da RAM pode ser útil em gerenciadores de inicialização onde você precisa reprogramar o flash do seu micro - você não pode executar o código do flash que você está apagando e apagando. reprogramando.
fonte
Eu não olhei a folha de dados para esse micro. No entanto, geralmente é o caso nessa situação em que a busca na RAM é mais rápida do que a busca no flash em que a memória do programa é implementada.
A vantagem do flash é que grandes quantidades podem ser relativamente baratas. Portanto, os fabricantes de microcontroladores às vezes colocam muito flash em um chip e fornecem um espaço de RAM mais limitado a partir do qual o código pode ser executado. Isso permite copiar rotinas de tempo crítico para a RAM e executá-las a partir daí.
A opção do compilador a que você se refere provavelmente trabalha com o vinculador e sinaliza a seção do flash para ser copiada na RAM pelo código de tempo de execução do compilador que é executado a partir da redefinição. Diferentes implementações variam nos detalhes.
fonte
Quando você deseja executar na RAM porque é mais rápido, geralmente é porque essa RAM é SRAM no chip. Esse é um recurso escasso, que você provavelmente desejará para dados que exijam acesso de leitura / gravação.
Utilizá-lo como código quando você já possui o código em ROM / flash significa que você precisa de uma quantidade X de flash e uma quantidade X adicional de RAM.
Também requer um estágio de cópia extra na inicialização ou quando você deseja executá-lo, embora seja praticamente insignificante.
Tradicionalmente, isso é resolvido com um cache de instruções, mas em um microcontrolador pode fazer mais sentido manter a SRAM interna genérica, porque você não usa um microcontrolador porque deseja a maior velocidade de execução.
Há também um problema de confiabilidade - a execução do código na ROM real é difícil de modificar pelo código de buggy.
fonte
Além de todas as boas respostas:
Porque em um sistema incorporado, geralmente você não tem a quantidade necessária de RAM. Por exemplo, um STM32 com 32kB ou RAM e 512kB de EEPROM. Para poder executar o programa inteiro na RAM, você precisaria de um tamanho de RAM maior que o EEPROM.
fonte
Outras respostas não parecem ter discutido muito o consumo de energia, sobre o qual você perguntou especificamente.
A resposta é que depende um pouco do microcontrolador, mas geralmente a execução da RAM pode reduzir o consumo de energia, pois requer menos energia para ler as instruções da RAM do que da memória flash.
Um uso típico seria executar uma função de "suspensão" de baixa potência a partir da RAM, com a memória flash desligada. Não apenas o consumo de energia é reduzido, mas se o microcontrolador precisar acordar rapidamente (por exemplo, em resposta a uma interrupção externa), não há atraso enquanto a memória flash é ligada novamente.
Algumas partes, como algumas da linha Atmel SAM, possuem RAM de energia extra baixa especial que pode ser usada para essa finalidade. Isso permite que uma pequena quantidade de código seja carregada na RAM especial, enquanto a maior parte da RAM disponível e todas as outras memórias são desligadas e o microcontrolador entra no modo de suspensão profunda.
fonte
Além dos benefícios potenciais de velocidade mencionados por outros, o código de RAM também é dinâmico e pode ser modificado em tempo real por algum código de adaptação no FLASH, conforme necessário.
Isso pode ser tão simples quanto alterar alguns parâmetros ou podem ser rotinas de manipulador inteiras carregadas remotamente.
fonte
A execução do código da RAM é significativamente mais rápida do que a partir da memória flash. A maioria das CPUs é altamente otimizada para o acesso mais rápido possível à RAM e até mesmo a memória flash mais rápida atinge apenas uma fração da velocidade da RAM.
No entanto, lembre-se de que mover o código do flash para a RAM também leva tempo. Se o código for executado apenas uma vez, você precisará lê-lo apenas uma vez e, portanto, perderá tempo para copiá-lo primeiro para a RAM, em vez de executá-lo diretamente. Se o código for executado ocasionalmente (portanto, copiá-lo para a RAM aumentaria a execução na segunda vez em que for chamado), mas o sistema estiver geralmente ocioso, você executaria esse código mais rapidamente copiando-o para a RAM, mas ninguém se importa, porque o sistema tem tempo suficiente para gastar.
Portanto, essas otimizações valem o esforço, se o código for executado com freqüência e você o mediu como um ponto de asfixia do sistema.
Por outro lado, a RAM precisa manter ativamente os dados armazenados, enquanto a memória flash não, então o consumo total de energia aumenta, se a RAM precisar ser mantida ativa. No entanto, isso é relevante apenas se a RAM não for usada, mas a maioria dos sistemas modernos - de uma maneira ou de outra - já usa a RAM disponível e, portanto, já a mantém ativa.
fonte
Há dois motivos muito comuns para executar o código da RAM:
Alguns microprocessadores não podem executar a partir do flash durante a programação do flash - embora muitos possam fazer isso desde que o código esteja em um bloco diferente do flash que está sendo gravado. As gravações em Flash podem reprogramar o aplicativo (caso do carregador de inicialização) ou quando o Flash é usado para armazenar informações não voláteis do programa (configuração, calibração etc.)
Em muitos microprocessadores, a RAM é muito mais rápida que o flash. Para esses dispositivos, pequenas rotinas críticas à velocidade podem ser executadas a partir da RAM, embora geralmente a RAM seja muito mais curta que o flash.
fonte
Outro caso de uso para RAM, apenas execução de segurança contra bitflips aleatórios. Usamos esse modelo em nossos cubos pequenos, porque a placa principal do computador possui uma ram ECC que tolera bitflips devido à radiação. Todo o sistema operacional é carregado no ram como um ramdisk na inicialização executado completamente em um ambiente ECC.
O flash não é protegido por ECC (padrão nos cartões micro SD), no entanto, temos outros métodos para verificar se há corrupção (várias imagens, somas de verificação etc.)
fonte