RAM에서 코드를 실행하는 이유는 무엇입니까?


27

방금 마이크로 컨트롤러 컴파일러가 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

어떤 경우에 이것이 가치가 있습니까? 이점이 속도 만 향상된다면 항상 RAM에서 실행하지 않는 이유는 무엇입니까? 이것이 일반적으로 더 높은 전류 소모를 유발합니까?


13
RAM에서 코드를 실행하면 전류가 덜 소비됩니다 (모든 CPU / SoC에 해당되는지 확실하지 않습니다). 나는 한때 배터리 장치이기 때문에 대부분의 코드를 RAM에 넣는 프로젝트를 만들었고 가능한 한 오래 살기를 원했습니다. RAM에서만 코드를 실행할 수 있다면 일부 SoC에서 플래시 블록의 전원을 끄고 더 많은 전력을 절약 할 수도 있습니다.
Al Bundy

4
@pipe-답변이 아닌 주석으로 만드는 이유는 실제 질문에 대답하지 않기 때문에 코드를 실행하기 위해 항상 RAM을 사용 하고 싶지는 않습니다 .
Jules

1
@Jules 네, "도움이되는 일화"라고 생각합니다. Stack Exchange는 매우 좋은 이유로 방지하기 위해 고안된 것입니다.
파이프

1
레지스터에서 실행할 레지스터가 충분하지 않기 때문입니다. (저는 그 칩을 가지고 있습니다.)
Joshua

또한 동적 RAM 에서 코드를 실행하는 것은 DRAM 리프레시를 영속화하기위한 정교한 소프트웨어 핵의 일부일 수 있습니다. :)
Kaz

답변:


32

다른 사람들이 이미 언급 한 속도 및 기타 기능 외에도 RAM에서 코드를 실행하면 마이크로 플래시를 다시 프로그래밍 해야하는 부트 로더에서 유용 할 수 있습니다. 삭제 중 및 플래시 인 코드는 실행할 수 없습니다. 재 프로그래밍.


4
플래시 블록 수와 부트 로더에서 수정할 수있는 블록, 다음 블록의 데이터를 스테이징하기 위해 남은 램의 양 등에 따라 다릅니다.하지만 플래시를 트램폴린하여 플래시 램을 수정할 수있는 경우는 그것을 위해 좋은 ...
old_timer

1
이것은 단지 질문의 절반 (질소 부분)에 답하는 것 같습니다. 영업 이익은 또한 "이익은 속도를 증가하면 왜 그냥 항상 RAM에서 실행하지 않을까요?"물었고, 한 이유를이 대답은 설명하지 않습니다 하지 RAM에서 실행합니다.
Doktor J

2
지금까지는 좋지만 플래시를 다시 쓰는 도중에 전원 (및 RAM)이 손실되면 어떻게됩니까? 이것은 해결 수 있지만 부트 로더의 다른 디자인과 마찬가지로 고려해야합니다.
AaronD

19

해당 마이크로에 대한 데이터 시트를 보지 않았습니다. 그러나이 상황에서 RAM에서 페치가 프로그램 메모리가 구현 된 플래시에서 페치하는 것보다 빠른 경우가 종종 있습니다.

플래시의 장점은 대량이 비교적 저렴할 수 있다는 것입니다. 따라서 마이크로 컨트롤러 제조업체는 때때로 칩에 많은 플래시를 넣은 다음 코드를 실행할 수있는보다 제한된 RAM 공간을 제공합니다. 이를 통해 시간이 중요한 루틴을 RAM에 복사 한 다음 거기서 실행할 수 있습니다.

참조하는 컴파일러 스위치는 링커에서 작동하며 재설정시 실행되는 컴파일러 런타임 코드에 의해 플래시의 해당 섹션이 RAM에 복사되도록 플래그를 지정합니다. 세부 사항에 따라 다른 구현이 달라질 수 있습니다.


17

RAM이 빠르기 때문에 RAM에서 실행하려면 일반적으로 해당 RAM이 온칩 SRAM이기 때문입니다. 이 리소스는 부족한 리소스이므로 읽기 / 쓰기 액세스가 필요한 데이터를 원할 것입니다.

코드를 사용하여 이미 때 ROM의 코드를 / 당신이 플래시의 X 금액 및 RAM의 추가 X 금액을해야한다는 것을 의미 플래시.

또한 부팅 할 때나 실행할 때 추가 복사 단계가 필요하지만 대부분 중요하지 않습니다.

전통적으로 이것은 명령 캐시로 해결되지만 마이크로 컨트롤러에서는 가장 빠른 실행 속도를 원하기 때문에 마이크로 컨트롤러를 사용하지 않기 때문에 내부 SRAM을 일반적으로 유지하는 것이 더 합리적 일 수 있습니다.

신뢰성 문제도 있습니다-실제 ROM에서 실행되는 코드는 버그가있는 코드로 수정하기 어렵습니다.


14

모든 좋은 답변 외에도 :

이점이 속도 만 향상된다면 항상 RAM에서 실행하지 않는 이유는 무엇입니까?

임베디드 시스템에서는 일반적으로 필요한 양의 RAM이 없습니다. 예를 들어 32kB 또는 RAM과 512kB의 EEPROM을 가진 STM32. RAM에서 전체 프로그램을 실행하려면 EEPROM보다 큰 RAM 크기가 필요합니다.


5
"내장 시스템에서는 일반적으로 필요한 양의 RAM이 없습니다."-이 작업수행 할 충분한 RAM이 있으면 RAM이 적은 저렴한 MCU로 전환하여 비용을 거의 확실히 줄일 수 있습니다. 질문을한다면 RAM이 적은 저렴한 MCU가 항상 있기 때문입니다 (가장 작은 MCU는 하버드 아키텍처를 사용하므로 RAM에서 실행할 수 없음)
Jules

13

다른 답변은 전력 소비에 대해 많이 이야기하지 않은 것 같습니다.

대답은 마이크로 컨트롤러에 다소 의존하지만 RAM에서 실행하면 플래시 메모리보다 RAM에서 명령을 읽는 데 에너지가 덜 필요하기 때문에 전력 소비를 줄일 수 있다는 것입니다.

플래시 메모리의 전원을 끈 상태에서 RAM에서 저전력 "슬립"기능을 실행하는 것이 일반적입니다. 전력 소비가 감소 될뿐만 아니라, 마이크로 컨트롤러가 (예를 들어 외부 인터럽트에 응답하여) 신속하게 웨이크 업해야하는 경우, 플래시 메모리에 다시 전원이 공급되는 동안 지연이 없습니다.

Atmel SAM 제품군과 같은 일부 부품에는 이러한 용도로 사용할 수있는 특수한 저전력 RAM이 있습니다. 이를 통해 소량의 코드를 특수 RAM에로드 할 수 있으며, 사용 가능한 RAM 및 기타 모든 메모리의 전원이 꺼지고 마이크로 컨트롤러가 딥 슬립 모드로 전환됩니다.


7

RAM 코드는 다른 사람들이 언급 한 잠재적 인 속도 이점 이외에도 동적이며 필요에 따라 FLASH의 일부 맞춤 코드를 사용하여 즉시 수정할 수 있습니다.

이는 몇 가지 매개 변수를 변경하는 것만 큼 간단하거나 전체 핸들러 루틴이 원격으로 업로드 될 수 있습니다.


또는 RAM의 코드는 디스크 (예 : SD) 또는 네트워크에서로드 할 수 있습니다
teambob

4

RAM에서 코드를 실행하면 플래시 메모리에서 코드를 실행하는 것보다 훨씬 빠릅니다. 대부분의 CPU는 가장 빠른 RAM 액세스를 위해 매우 최적화되어 있으며 가장 빠른 플래시 메모리조차도 RAM 속도의 일부에 불과합니다.

그러나 코드를 플래시에서 RAM으로 옮기는 데에도 시간이 걸린다는 점을 명심하십시오. 코드가 한 번만 실행되면 한 번만 읽어야하므로 실제로 직접 실행하는 대신 RAM에 먼저 복사하는 시간이 느려집니다. 코드가 가끔 실행되므로 (두 번째 코드를 RAM에 복사하면 두 번째로 호출 될 때 실행이 증가하지만) 시스템이 일반적으로 유휴 상태이면 코드를 RAM에 복사하여 해당 코드를 더 빠르게 실행하지만 아무도 신경 쓰지 않습니다. 시간이 충분합니다.

따라서 코드를 자주 실행하고 시스템의 질식 지점으로 측정 한 경우 그러한 최적화는 노력의 가치가 있습니다.

반면에 RAM은 데이터를 적극적으로 저장해야하지만 플래시 메모리는 그렇지 않으므로 RAM을 활성으로 유지해야하는 경우 총 전력 소비가 증가합니다. 그러나 RAM이 전혀 사용되지 않으면 대부분의 최신 시스템은 사용 가능한 RAM을 이미 사용하므로 이미 활성 상태를 유지합니다.


4

RAM에서 코드를 실행하는 데는 두 가지 일반적인 이유가 있습니다.

  1. 플래시 프로그래밍 중에는 일부 마이크로 프로세서가 플래시에서 실행될 수 없지만 코드가 작성되는 플래시와 다른 블록에있는 한 많은 마이크로 프로세서가이를 수행 할 수 있습니다. 플래시 쓰기는 응용 프로그램을 다시 프로그래밍하거나 (부트 로더 사례) 플래시를 사용하여 비 휘발성 프로그램 정보 (구성, 교정 등)를 저장하는 경우

  2. 많은 마이크로 프로세서에서 RAM은 플래시보다 훨씬 빠릅니다. 이러한 장치의 경우 RAM에서 작은 속도로 중요한 루틴을 실행할 수 있지만 일반적으로 RAM은 플래시보다 공급이 훨씬 짧습니다.


2

임의 비트 충돌에 대한 RAM 전용 실행 보안의 또 다른 사용 사례. 메인 컴퓨터 보드에는 방사선으로 인한 비트 플립을 견딜 수있는 ECC 램이 있으므로이 모델을 작은 큐브에서 사용합니다. 시작시 램 디스크가 ECC 환경에서 완전히 실행될 때 전체 OS가 램에로드됩니다.

플래시는 ECC로 보호되지는 않지만 (선반 마이크로 SD 카드 표준) 우리는 손상을 확인하는 다른 방법 (여러 이미지, 체크섬 등)이 있습니다


나는 EEPROM이나 플래시와 같은 것이 복사에 의해 비트 플립하기에 훨씬 더 "힘들다", 즉 더 많은 에너지를 필요로한다고 가정했을 것이다.
파이프

실제로는 그렇습니다. 그러나 특별한 ECC 기능없이 표준 플래시를 사용하기 때문에 램을 사용하는 것이이 목적에 훨씬 좋습니다.
Tejas Kale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.