[英]How is inline assembly possible on AVR 8-bit?
我知道這很接近“愚蠢的問題”類別,但是我一直在研究如何在AVR 8位引導加載后執行機器代碼,並且已經了解到AVR 8使用的哈佛架構位MCU使得無法從閃存以外的任何地方執行代碼。 那么如何使用內聯asm在運行時引入新的可執行代碼?
您正在混淆三件事:
內聯組裝
內聯匯編用於將匯編程序指令傳遞給C(或任何語言)編譯器。 編譯器會將該匯編程序指令添加到其生成的代碼中。 最后,內聯匯編程序指令的存儲方式與編譯器生成的指令相同 。 如果將程序寫入閃存,則內聯指令也將位於閃存中。
引導加載程序
引導加載程序通常將從一些輸入(例如USB接口)讀取數據,並將數據寫入閃存。 因此,發送給AVR的程序將稍后從閃存而不是RAM中執行。
從RAM執行代碼
許多處理器都支持。 同樣,許多引導加載程序(用於其他微控制器)允許將代碼加載到RAM中而不是閃存中並從那里執行代碼。 您是對的:至少大多數(也許是全部?)AVR 8位微控制器不支持此功能!
...在AVR 8位MCU上使用的哈佛架構使得無法從閃存以外的任何位置執行代碼。
您的理解是正確的,只能從閃存中執行代碼。
那么如何使用內聯asm在運行時引入新的可執行代碼?
您可以編寫以純數據形式寫入/讀取閃存的代碼。 實際上,這正是任何引導程序所完成的。 即使沒有顯式的“引導加載程序部分”(例如attiny系列), 也可以通過這種方式訪問閃存。 您的零件的數據表 (在本示例中為第263頁)包含該主題的一章,建議您詳細閱讀它。
也就是說,我還沒有看到利用此功能運行其他代碼的代碼。 額外的復雜性可能使其對於像AVR這樣的小型低功耗微控制器不可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.