簡體   English   中英

如何在8位AVR上進行內聯匯編?

[英]How is inline assembly possible on AVR 8-bit?

我知道這很接近“愚蠢的問題”類別,但是我一直在研究如何在AVR 8位引導加載后執行機器代碼,並且已經了解到AVR 8使用的哈佛架構位MCU使得無法從閃存以外的任何地方執行代碼。 那么如何使用內聯asm在運行時引入新的可執行代碼?

您正在混淆三件事:

  1. 內聯組裝

    內聯匯編用於將匯編程序指令傳遞給C(或任何語言)編譯器。 編譯器會將該匯編程序指令添加到其生成的代碼中。 最后,內聯匯編程序指令的存儲方式與編譯器生成的指令相同 如果將程序寫入閃存,則內聯指令也將位於閃存中。

  2. 引導加載程序

    引導加載程序通常將從一些輸入(例如USB接口)讀取數據,並將數據寫入閃存。 因此,發送給AVR的程序將稍后從閃存而不是RAM中執行。

  3. 從RAM執行代碼

    許多處理器都支持。 同樣,許多引導加載程序(用於其他微控制器)允許將代碼加載到RAM中而不是閃存中並從那里執行代碼。 您是對的:至少大多數(也許是全部?)AVR 8位微控制器不支持此功能!

...在AVR 8位MCU上使用的哈佛架構使得無法從閃存以外的任何位置執行代碼。

您的理解是正確的,只能從閃存中執行代碼。

那么如何使用內聯asm在運行時引入新的可執行代碼?

可以編寫以純數據形式寫入/讀取閃存的代碼。 實際上,這正是任何引導程序所完成的。 即使沒有顯式的“引導加載程序部分”(例如attiny系列), 可以通過這種方式訪問​​閃存。 您的零件的數據表 (在本示例中為第263頁)包含該主題的一章,建議您詳細閱讀它。

也就是說,我還沒有看到利用此功能運行其他代碼的代碼。 額外的復雜性可能使其對於像AVR這樣的小型低功耗微控制器不可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM