Por que executar código da RAM?

27

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.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

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?

tarabyte
fonte
13
A execução de código da RAM consome menos corrente (não tenho certeza se isso é verdadeiro para todas as CPUs / SoCs). Certa vez, fiz um projeto em que colocamos a maior parte do código na RAM porque era um dispositivo de bateria e queríamos que ele durasse o maior tempo possível. Se você puder executar o código apenas da RAM, poderá desligar os blocos de flash em alguns SoCs e economizar ainda mais energia.
Al Bundy
4
@pipe - Eu imagino que a razão para fazer um comentário em vez de uma resposta é que ela não responde à pergunta real, e é por isso que você não gostaria de sempre usar a RAM para executar seu código.
Jules
11
@ Jules Sim, eu imagino que seja uma "anedota útil". O que o Stack Exchange foi projetado para evitar, por muito boas razões.
pipe
11
Porque você não possui registros suficientes para executar a partir do registro. (Eu tenho aquele chip.)
Joshua
Além de tudo: a execução específica do código da RAM dinâmica poderia fazer parte de um elaborado truque de software para realizar a atualização da DRAM. :)
Kaz

Respostas:

32

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.

brhans
fonte
4
depende de quantos blocos de flash você possui e quais o seu gerenciador de inicialização permite que sejam modificados, quanta memória RAM você deixou para armazenar os dados para o próximo bloco, etc. mas fiel ao trampolim do flash para que você possa modificar a memória RAM. bom para isso ...
old_timer 6/09/17
11
Isso parece responder apenas a metade da pergunta (a parte titular). O OP também perguntou "Por que eu não sempre executava a partir da RAM se o benefício aumenta apenas a velocidade?", E essa resposta não explica por que não se pode executar a partir da RAM.
Doktor J
2
Até aí tudo bem, mas o que acontece se você perder energia (e, portanto, RAM) no meio da reescrita do flash? Isso pode ser resolvido, mas, como qualquer outro design para um gerenciador de inicialização, ele deve ser considerado.
AaronD
19

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.

Olin Lathrop
fonte
17

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.

tubo
fonte
14

Além de todas as boas respostas:

Por que eu apenas não executava sempre a partir da RAM se o benefício é apenas maior velocidade?

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.

Marko Buršič
fonte
5
"Porque em um sistema embarcado, normalmente você não tem a quantidade necessária de RAM." - e porque se você faz tem RAM suficiente para fazer isso, você pode quase certamente reduzir custos, a mudança para um MCU mais barato com menos RAM. Porque se você está fazendo a pergunta, há sempre um MCU mais barato com menos RAM (a arquitetura menor e mais barato MCUs uso Harvard, portanto, não pode executar a partir de RAM)
Jules
13

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.

do utilizador
fonte
7

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.

Trevor_G
fonte
Ou o código na memória RAM pode ser carregado a partir do disco (por exemplo SD) ou rede
TeamBob
4

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.

TwoThe
fonte
4

Há dois motivos muito comuns para executar o código da RAM:

  1. 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.)

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

Dave Nadler
fonte
2

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

Tejas Kale
fonte
Eu teria assumido que algo como EEPROM ou flash seria muito "mais difícil" de se movimentar pela radiação, ou seja, exigiria mais energia.
pipe
É verdade que sim, mas como usamos apenas o flash padrão sem recursos especiais de ECC, o uso de ram é muito melhor para esse fim.
Tejas Kale