Flash และ RAM: Code Execution


13

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

ตามสิ่งที่ฉันเข้าใจในปัจจุบันรหัสและข้อมูลทั้งหมดอยู่ในหน่วยความจำแบบไม่ลบเลือนหลังจากที่เรา 'เผา' ไบนารีลงบนหน่วยประมวลผล - RAM ที่มีความผันผวนจะไม่มีอะไรเกิดขึ้นเมื่อรีเซ็ต เมื่อโปรแกรมเริ่ม 'เรียกใช้งาน' โปรแกรมจะทำเช่นนั้นจากที่อยู่ 0x0000 ซึ่งเกือบตลอดเวลา (AFAIK) ที่อยู่ต่ำที่สุดใน Flash ดังนั้นคำแนะนำจะถูกสลักลงบนบัสที่เชื่อมต่อแฟลชกับซีพียูหลักและนั่นคือจุดที่เกิดการดำเนินการจริง อย่างไรก็ตามเมื่อเราพูดถึงการดึงหรือเก็บข้อมูลจากหน่วยความจำของ CPU เรามักจะพูดถึง RAM - ฉันรู้ว่าเราสามารถอ่าน / เขียนข้อมูลจากหน่วยความจำของโปรแกรมได้เช่นกัน (ฉันเคยเห็นสิ่งนี้ทำบน AVR) แต่มันไม่เป็นเรื่องธรรมดาเหรอ? เป็นเพราะแรมเร็วกว่า ROM ที่เราต้องการเก็บข้อมูลหรือไม่

คำตอบที่ได้รับการยอมรับสำหรับคำถามนี้บอกว่าส่วนใหญ่ของรหัสรันออกจาก RAM

นี่หมายความว่ารหัสรันไทม์เริ่มต้น (ซึ่งเรียกใช้จาก Flash) ต้องคัดลอกโปรแกรม opcodes ทั้งหมดจาก Flash ไปยัง RAM และแมปที่อยู่ใด ๆ ใน Flash ให้ชี้ไปที่ RAM เพื่อให้ CPU ดึง opcodes จากที่นั่น มันคล้ายกับกระบวนการที่เราย้ายส่วน. data จาก ROM ไปยัง RAM เมื่อเริ่มต้นหรือไม่

ฉันสามารถจินตนาการว่าสิ่งนี้จะง่ายกว่าในสถาปัตยกรรม von Neumann ที่โปรแกรมและความทรงจำของข้อมูลแชร์รถบัส แต่ในสถาปัตยกรรม Harvard ไม่ได้หมายความว่ารหัสและข้อมูลทั้งหมดจะต้องผ่านการลงทะเบียน CPU ก่อนหรือไม่

อย่างที่คุณคงเดาได้ฉันสับสนกับธุรกิจทั้งหมดนี้เล็กน้อย การตั้งโปรแกรมให้อยู่ในระดับที่สูงกว่านามธรรมฉันมักจะมีความสุขกับรายละเอียดดังกล่าว ความช่วยเหลือใด ๆ ที่ชื่นชม


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

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

คำตอบ:


14

ขึ้นอยู่กับอุปกรณ์

แรมสามารถสร้างได้เร็วกว่าแฟลช สิ่งนี้เริ่มมีความสำคัญในช่วงประมาณ 100MHz

ไมโครคอนโทรลเลอร์ที่เรียบง่าย

ไมโครคอนโทรลเลอร์ขนาดเล็กที่ทำงานช้าจะทำงานโดยตรงจาก Flash ระบบเหล่านี้มักจะมี Flash มากกว่า SRAM ด้วย

ระบบเสียงกลาง

เมื่ออุปกรณ์ของคุณเร็วขึ้นสถานการณ์ก็จะเปลี่ยนไปเล็กน้อย ระบบ Midrange ARM อาจทำเช่นนั้นหรืออาจมี mask ROM booterer ที่ทำงานอย่างชาญฉลาด: อาจดาวน์โหลดรหัสจาก USB หรือ EEPROM ภายนอกลงใน SRAM ภายใน

ระบบขนาดใหญ่

ระบบที่ใหญ่กว่าและเร็วกว่าจะมี DRAM ภายนอกและแฟลชภายนอก นี่เป็นเรื่องปกติของสถาปัตยกรรมโทรศัพท์มือถือ ณ จุดนี้มี RAM มากมายและเร็วกว่าแฟลชดังนั้น bootloader จะคัดลอกและดำเนินการ สิ่งนี้อาจเกี่ยวข้องกับการพรวนดินผ่านการลงทะเบียน CPU หรืออาจเกี่ยวข้องกับการถ่ายโอน DMA หากมีหน่วย DMA

สถาปัตยกรรมฮาร์วาร์ดมักจะมีขนาดเล็กดังนั้นอย่ากังวลกับขั้นตอนการคัดลอก ฉันเคยเห็น ARM ด้วย "hybrid harvard" ซึ่งเป็นพื้นที่ที่อยู่เดียวที่มีความทรงจำต่าง ๆ แต่มีหน่วยเก็บข้อมูลที่แตกต่างกันสองหน่วย สามารถดึงรหัสและข้อมูลแบบขนานตราบเท่าที่ยังไม่ได้มาจากหน่วยความจำเดียวกัน ดังนั้นคุณสามารถดึงรหัสจากแฟลชและข้อมูลจาก SRAM หรือรหัสจาก SRAM และข้อมูลจาก DRAM เป็นต้น


1

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

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

ในสถาปัตยกรรม von Neumann ที่โปรแกรมและความทรงจำของข้อมูลแชร์รถบัส แต่ในสถาปัตยกรรม Harvard จะไม่ได้หมายความว่ารหัสและข้อมูลทั้งหมดจะต้องผ่านการลงทะเบียน CPU ก่อนหรือไม่

ไม่จำเป็น. นี่คือที่มาของการกำหนดที่อยู่เสมือนแทนรหัสโปรแกรมที่อ้างถึงที่อยู่ RAM ฮาร์ดแวร์ดิบจริง ๆ แล้วมันอ้างอิงพื้นที่ที่อยู่เสมือน บล็อกของที่อยู่เสมือนถูกแมปผ่านอุปกรณ์หน่วยความจำกายภาพซึ่งอาจเป็น RAM, ROM, แฟลชหรือแม้กระทั่งบัฟเฟอร์อุปกรณ์

ตัวอย่างเช่นเมื่อคุณอ้างอิงที่อยู่ 0x000f0004 ในไมโครคุณอาจอ่านที่อยู่ 0x0004 จากแฟลช ที่อยู่เสมือนคือ 0x000f0004 แต่ที่อยู่ทางกายภาพนั้นเป็นเพียง 0x0004 - พื้นที่ที่อยู่ 0x000fxxxx ทั้งหมดจะถูกแมปกับอุปกรณ์หน่วยความจำกายภาพ 4KB นี่เป็นเพียงตัวอย่างเท่านั้นและวิธีการจัดการและจัดระเบียบพื้นที่ที่อยู่เสมือนแตกต่างกันอย่างมากในสถาปัตยกรรม

ดังนั้นเมื่อคุณพูดว่า "โปรแกรมเริ่มดำเนินการ [... ] จากที่อยู่ 0x0000 ซึ่งมักจะเป็นที่อยู่ต่ำที่สุดในแฟลช" คุณไม่รับประกันว่าจะถูกต้อง ความจริงแล้วไมโครคอนโทรลเลอร์หลายตัวเริ่มต้นที่ 0x1000


3
ฉันจะบอกว่าความแตกต่างจะมีความเกี่ยวข้องประมาณ 20-40MHz ไม่ใช่ 100Mhz เนื่องจากอุปกรณ์แฟลชส่วนใหญ่ที่ฉันเห็นเริ่มต้องรอสถานะรอบจุดนั้น ในหลายกรณีโค้ดแฟลชจะรวมวงจรเพื่อให้การดึงข้อมูลแต่ละครั้งจะคว้าคำแนะนำหลายคำดังนั้นสำหรับรหัสประเภทต่างๆ "โทษ" สำหรับการเรียกใช้จากแฟลชจะมีเพียงประมาณ 5-10% แต่สำหรับบางประเภทอื่น ๆ รหัส (เช่นมีการกระโดดมาก) การลงโทษอาจรุนแรงกว่านี้มาก
supercat

นั่นไม่ใช่การกำหนดที่อยู่เสมือนนั่นคือ I / O ที่ถูกแมปหน่วยความจำ (ขอบเขตของหน่วยความจำแม็พกับ I / O โดยใช้อุปกรณ์ต่อพ่วงชื่อบน MCUs จำนวนมากคือ "ตัวควบคุมหน่วยความจำแบบคงที่") แน่นอนว่า I / O ยื่นออกไปยังหน่วยความจำอื่นดังนั้นบางครั้งเราไม่คิดว่ามันเป็น I / O แต่แน่นอนว่าไม่ใช่การจับคู่หน่วยความจำเสมือน
Ben Voigt

1

สิ่งที่คุณพูดนั้นไม่สมบูรณ์จริงหรือเท็จ มีสถานการณ์ที่แตกต่างกันสำหรับเรื่องนี้

ขึ้นอยู่กับว่าคุณกำลังเขียนโปรแกรมบนฮาร์ดแวร์ดิบหรือบนฮาร์ดแวร์ที่ติดตั้งระบบปฏิบัติการ

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

ตอนนี้เมื่อคุณกำลังทำงานกับไมโครคอนโทรลเลอร์มันทั้งหมดขึ้นอยู่กับคุณที่คุณค้นหาข้อมูลของคุณบนชิป หากข้อมูลเป็นแบบคงที่คุณอาจต้องการค้นหาในหน่วยความจำรหัสซึ่งจะบันทึก RAM ของคุณซึ่งค่อนข้างเล็กกว่าหน่วยความจำรหัส ในภาษา C เมื่อคุณเริ่มต้นประเภทข้อมูลโดยใช้แบบคงที่หรือในบางคำนำหน้ารวบรวมข้อมูล const จะถูกเก็บไว้ในหน่วยความจำรหัสมิฉะนั้นจะถูกเก็บไว้ใน RAM และในแอสเซมบลีคุณโดยตรงใช้ DB (กำหนดไบต์ในกรณีของพื้นฐาน 8051) เพื่อเตรียมใช้งานข้อมูลบนตำแหน่งที่ตั้งเฉพาะ ในตอนนี้แม้ในคอนโทรลเลอร์บางตัวเช่น PIC ARM คุณสามารถเขียน ROM ในเวลาทำงานได้ แต่การดึงข้อมูลจะใช้เวลานาน

นอกจากนี้ยังมีเครื่องมือโหลดเดอร์ Boot ในระดับกลางและตัวควบคุมที่มีความซับซ้อนซึ่งจะบอกตัวควบคุมหรือตัวประมวลผลว่าจะเรียกใช้โค้ดเริ่มต้นจากที่ใดหรือเป็นรหัสเริ่มต้นซึ่งแบ่งเป็นหน่วยความจำจริง ๆ ฉันอยากจะบอกว่าการไฮบริดความก้าวหน้าในอุตสาหกรรมซึ่งทำให้แนวคิดทั้งหมดของ RAM ROM และความทรงจำธรรมดา ดังนั้นความสับสนของคุณก็ใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.