ทำไมเรียกใช้รหัสจาก 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 สำหรับการรันโค้ดของคุณ
จูลส์

1
@Jules ใช่ฉันคิดว่ามันมีความหมายว่าเป็น "เกร็ดเล็กเกร็ดน้อยที่เป็นประโยชน์" สิ่งที่กองแลกเปลี่ยนถูกออกแบบมาเพื่อป้องกันด้วยเหตุผลที่ดีมาก
ท่อ

1
เพราะคุณไม่มีทะเบียนเพียงพอที่จะดำเนินการจากการลงทะเบียน (ฉันมีชิปตัวนั้น)
โจชัว

นอกเหนือจากทุกอย่าง: การเรียกใช้โค้ดจากไดนามิคแรมโดยเฉพาะอาจเป็นส่วนหนึ่งของการแฮ็กซอฟต์แวร์ที่ซับซ้อนเพื่อเร่งการรีเฟรช DRAM :)
Kaz

คำตอบ:


32

นอกเหนือจากคุณสมบัติความเร็วและอื่น ๆ ที่ผู้อื่นได้กล่าวถึงแล้วการเรียกใช้โค้ดจาก RAM จะเป็นประโยชน์ใน bootloaders ที่คุณต้องการ reprogram แฟลชขนาดเล็กของคุณ - คุณไม่สามารถเรียกใช้โค้ดจากแฟลชที่คุณกำลังลบ & reprogramming


4
ขึ้นอยู่กับว่าคุณมีบล็อกแฟลชจำนวนเท่าใดและอันไหนที่ bootloader ของคุณอนุญาตให้มีการเปลี่ยนแปลง, ram เท่าใดที่คุณเหลือไว้เพื่อจัดเตรียมข้อมูลสำหรับบล็อกถัดไป, ฯลฯ แต่จริง ๆ กับแทรมโพลีนนอกแฟลชเพื่อให้คุณสามารถแก้ไขแฟลชแรมได้ ดีสำหรับสิ่งนั้น ...
old_timer

1
ดูเหมือนว่าจะตอบคำถามครึ่งเดียวเท่านั้น OP ยังถามด้วยว่า "ทำไมฉันจะไม่เรียกใช้งาน RAM เสมอหากประโยชน์นั้นเพิ่มความเร็วเพียงอย่างเดียว" และคำตอบนี้ไม่ได้อธิบายว่าเพราะเหตุใดจึงไม่ต้องการรันจาก RAM
Doktor J

2
จนถึงตอนนี้ดี แต่เกิดอะไรขึ้นถ้าคุณสูญเสียพลังงาน (และดังนั้น RAM) ในระหว่างการเขียนใหม่แฟลช? สิ่งนี้สามารถแก้ไขได้ แต่เช่นเดียวกับการออกแบบอื่น ๆ สำหรับ bootloader จะต้องได้รับการพิจารณา
AaronD

19

ฉันไม่ได้ดูแผ่นข้อมูลสำหรับไมโครนั้น อย่างไรก็ตามบ่อยครั้งในกรณีนี้การดึงข้อมูลจาก RAM เร็วกว่าการดึงข้อมูลจากแฟลชที่หน่วยความจำของโปรแกรมใช้งาน

ข้อดีของการใช้แฟลชก็คือการใช้แฟลชจำนวนมากนั้นค่อนข้างถูก ผู้ผลิตไมโครคอนโทรลเลอร์บางครั้งใส่แฟลชจำนวนมากบนชิปจากนั้นให้พื้นที่ RAM ที่ จำกัด มากขึ้นซึ่งโค้ดสามารถเรียกใช้งานได้ สิ่งนี้อนุญาตให้คัดลอกรูทีนเวลาวิกฤติลงใน RAM จากนั้นเรียกใช้งานจากที่นั่น

สวิตช์คอมไพเลอร์ที่คุณอ้างถึงอาจใช้งานได้กับตัวเชื่อมโยงและแฟล็กที่ส่วนของแฟลชที่จะคัดลอกไปยัง RAM โดยโค้ดรันไทม์ของคอมไพเลอร์ที่รันจากการรีเซ็ต การใช้งานที่แตกต่างกันจะแตกต่างกันในรายละเอียด


17

เมื่อคุณต้องการดำเนินการใน RAM เพราะมันเร็วกว่าปกติเพราะ RAM นั้นอยู่บนชิพ SRAM นี่เป็นทรัพยากรที่หายากซึ่งคุณอาจต้องการข้อมูลที่ต้องการการเข้าถึงแบบอ่าน / เขียน

การใช้รหัสนี้เมื่อคุณมีรหัสใน ROM / แฟลชหมายความว่าคุณต้องการแฟลช X และ RAM อีกจำนวน X

นอกจากนี้ยังต้องใช้ขั้นตอนการคัดลอกเพิ่มเติมตอนบูตหรือเมื่อคุณต้องการเรียกใช้แม้ว่ามันจะไม่สำคัญ

โดยทั่วไปแล้วสิ่งนี้จะถูกแก้ไขด้วยแคชคำสั่ง แต่ในไมโครคอนโทรลเลอร์มันอาจเหมาะสมกว่าที่จะใช้ SRAM ทั่วไปภายในเนื่องจากคุณไม่ได้ใช้ไมโครคอนโทรลเลอร์เพราะคุณต้องการความเร็วในการดำเนินการที่เร็วที่สุด

นอกจากนี้ยังมีปัญหาความน่าเชื่อถือ - รหัสการใช้งานใน ROM จริงเป็นการยากที่จะแก้ไขด้วยรหัส buggy


14

นอกจากคำตอบที่ดีทั้งหมดแล้ว:

เหตุใดฉันจึงไม่เรียกใช้งาน RAM เสมอหากประโยชน์เพิ่มความเร็วเท่านั้น

เพราะในระบบฝังตัวปกติแล้วคุณไม่มี RAM ที่ต้องการ ตัวอย่างเช่น STM32 ที่มี 32kB หรือ RAM และ 512kB ของ EEPROM เพื่อให้สามารถรันโปรแกรมทั้งหมดใน RAM คุณจะต้องมีขนาด RAM ใหญ่กว่า EEPROM


5
"เพราะในระบบฝังตัวมักจะคุณไม่ได้มีจำนวนเงินที่ต้องของแรม." - และเพราะถ้าคุณทำมี RAM มากพอที่จะทำเช่นนี้คุณเกือบจะแน่นอนสามารถลดค่าใช้จ่ายโดยการเปลี่ยนไปใช้ราคาถูก MCU ที่มี RAM น้อย เพราะถ้าคุณถามคำถามที่มีเสมอ MCU ถูกกับ RAM น้อยกว่า (ที่เล็กที่สุดและถูกที่สุดสถาปัตยกรรม MCUs ใช้ฮาร์วาร์จึงไม่สามารถดำเนินการจาก RAM)
จูลส์

13

คำตอบอื่น ๆ ดูเหมือนจะไม่ได้กล่าวถึงการใช้พลังงานมากซึ่งคุณถามโดยเฉพาะเกี่ยวกับ

คำตอบก็คือมันขึ้นอยู่กับไมโครคอนโทรลเลอร์ แต่บ่อยครั้งที่การดำเนินการจาก RAM สามารถลดการใช้พลังงานเนื่องจากต้องใช้พลังงานในการอ่านคำแนะนำจาก RAM น้อยกว่าหน่วยความจำแฟลช

การใช้งานทั่วไปคือการเรียกใช้ฟังก์ชั่น "สลีป" ที่ใช้พลังงานต่ำจาก RAM โดยที่หน่วยความจำแฟลชปิดตัวลง ไม่เพียงลดการใช้พลังงาน แต่หากไมโครคอนโทรลเลอร์จำเป็นต้องตื่นขึ้นมาอย่างรวดเร็ว (เช่นการตอบสนองต่อการขัดจังหวะภายนอก) จะไม่มีการหน่วงเวลาในขณะที่หน่วยความจำแฟลชเปิดขึ้นอีกครั้ง

บางส่วนเช่นช่วง Atmel SAM บางตัวมี RAM พลังงานต่ำพิเศษเป็นพิเศษที่สามารถใช้เพื่อการนี้ได้ วิธีนี้ช่วยให้สามารถโหลดรหัสจำนวนเล็กน้อยไปยัง RAM พิเศษในขณะที่ RAM ขนาดใหญ่ที่มีอยู่และหน่วยความจำอื่น ๆ ทั้งหมดปิดตัวลงและไมโครคอนโทรลเลอร์จะเข้าสู่โหมดสลีปลึก


7

นอกเหนือจากประโยชน์ที่อาจเกิดขึ้นจากความเร็วที่ผู้อื่นกล่าวถึงแล้วรหัส RAM ยังเป็นแบบไดนามิกและสามารถแก้ไขได้ทันทีด้วยรหัสการปรับแต่งบางส่วนใน FLASH ตามที่ต้องการ

สิ่งนี้สามารถทำได้ง่ายเพียงแค่เปลี่ยนพารามิเตอร์ไม่กี่ตัว


หรือรหัสใน RAM สามารถโหลดได้จากดิสก์ (เช่น SD) หรือเครือข่าย
teambob

4

การรันโค้ดจาก RAM นั้นเร็วกว่าการรันจากหน่วยความจำแฟลชอย่างมาก ซีพียูส่วนใหญ่นั้นได้รับการปรับให้เหมาะสมที่สุดสำหรับการเข้าถึง RAM ที่เร็วที่สุดและแม้แต่หน่วยความจำแฟลชที่เร็วที่สุดก็มาถึงเพียงเศษเสี้ยวของ RAM

อย่างไรก็ตามโปรดทราบว่าการย้ายรหัสจากแฟลชไปยัง RAM ก็ใช้เวลาเช่นกัน หากโค้ดถูกเรียกใช้งานเพียงครั้งเดียวคุณจะต้องอ่านเพียงครั้งเดียวดังนั้นคุณจะเสียเวลาในการคัดลอกลงใน RAM ก่อนแทนที่จะทำการประมวลผลโดยตรง หากโค้ดถูกเรียกใช้งานเป็นครั้งคราว (ดังนั้นการคัดลอกลงใน RAM จะเพิ่มการดำเนินการในครั้งที่สองที่เรียกว่า) แต่โดยทั่วไประบบจะไม่ทำงานดังนั้นคุณจะรันโค้ดนั้นเร็วขึ้นโดยการคัดลอกลงใน RAM แต่ไม่มีใครสนใจเพราะระบบ มีเวลาเพียงพอที่จะใช้

ดังนั้นการปรับให้เหมาะสมนั้นคุ้มค่ากับความพยายามหากโค้ดถูกเรียกใช้งานบ่อยครั้งและคุณวัดว่าเป็นจุดที่ทำให้หายใจไม่ออกของระบบ

ในทางกลับกันแรมจำเป็นต้องเก็บข้อมูลไว้อย่างแข็งขันในขณะที่หน่วยความจำแฟลชไม่ได้ดังนั้นการใช้พลังงานโดยรวมจะเพิ่มขึ้นหาก RAM จำเป็นต้องใช้งานอยู่ อย่างไรก็ตามสิ่งนี้มีความเกี่ยวข้องเท่านั้นหากไม่ได้ใช้ RAM เป็นอย่างอื่น แต่ระบบที่ทันสมัยส่วนใหญ่จะใช้วิธีใดวิธีหนึ่งต่อไปนี้ - ใช้ RAM ที่มีอยู่แล้วและใช้งานได้แล้ว


4

มีเหตุผลทั่วไปสองประการในการเรียกใช้รหัสจาก RAM:

  1. ไมโครโปรเซสเซอร์บางตัวไม่สามารถเรียกใช้จากแฟลชในระหว่างการเขียนโปรแกรมแฟลชได้แม้ว่าจะมีหลายตัวที่สามารถทำได้ตราบใดที่โค้ดอยู่ในบล็อกที่แตกต่างจากแฟลชที่กำลังเขียน การเขียน Flash อาจกำลังทำโปรแกรมใหม่ (กรณีบูตโหลดเดอร์) หรือเมื่อใช้แฟลชเพื่อเก็บข้อมูลโปรแกรมที่ไม่ลบเลือน (การกำหนดค่าการปรับเทียบ ฯลฯ )

  2. ในไมโครโปรเซสเซอร์จำนวนมาก RAM เร็วกว่าแฟลชมาก สำหรับอุปกรณ์เหล่านี้รูทีนที่สำคัญความเร็วต่ำอาจถูกเรียกใช้จาก RAM แม้ว่าโดยทั่วไปแล้ว RAM จะสั้นกว่าแฟลชมาก


2

อีก usecase สำหรับการรักษาความปลอดภัยการดำเนินการ RAM เท่านั้นกับบิตแมปแบบสุ่ม เราใช้โมเดลนี้กับคิวบ์ขนาดเล็กของเราเพราะบอร์ดคอมพิวเตอร์หลักมีหน่วยความจำ ECC ที่ทนต่อบิตแฟลลิปเนื่องจากการแผ่รังสี ระบบปฏิบัติการทั้งหมดถูกโหลดลงในหน่วยความจำเนื่องจาก ramdisk เมื่อเริ่มต้นทำงานอย่างสมบูรณ์ในสภาพแวดล้อมของ ECC

แฟลชไม่ได้รับการป้องกันด้วย ECC (มาตรฐานปิดการ์ด micro SD ชั้นวาง) แต่เรามีวิธีอื่นในการตรวจสอบความเสียหาย (หลายภาพเช็คซัม ฯลฯ )


ฉันคิดว่าสิ่งที่คล้าย EEPROM หรือแฟลชน่าจะเป็นเรื่องที่ "ยาก" มากขึ้นในการใช้ bitflip โดยการแผ่รังสีนั่นคือต้องใช้พลังงานมากขึ้น
ท่อ

แน่นอนว่าเป็นเช่นนั้น แต่เนื่องจากเราเพิ่งใช้แฟลชมาตรฐานที่ไม่มีคุณสมบัติ ECC พิเศษการใช้ ram จึงดีกว่ามากสำหรับวัตถุประสงค์นี้
Tejas Kale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.