2014-02-11 12 views
0

我試圖保留一些字節的sram地址必須在加載時知道,以便它可以適合PROGSPACE。直到如今我測試我的代碼確定與Arduino的納米板一個棘手的分配由地址設置爲(0x1F6)和後上節目我做在加載時分配/保留avr sram與加載時的已知地址以適合progspace

volatile byte shifty_data[3]; 

,以確保其在堆不自動覆蓋... 代碼工作正常,但我對此並不滿意,因爲它與其他內核不兼容,並且可能與環境更改相兼容。 直到現在我已經考慮malloc __heap_start(沒有成功,因爲它不是常量和地址不知道在加載時,我認爲)的變化,我也看過avr/io.h,特別是在iom328p.h通過RAMSTART定義,這可能會起作用,但是...它在systemn上似乎太低了,因爲我想使用它的硬件SPI ...並且它可能是在較高級別(最好是在arduino文件中)更好的方法。 有什麼想法?

回答

1

我不太清楚你在這裏問什麼,但是有兩個關鍵的東西,我相信你是誤會。程序空間與SRAM分開。他們在兩個不同的地址總線。 AVR實際上提供了一個指令,將數據從程序空間複製到RAM中,因爲這種分離[使其成爲修改後的哈佛架構]。然後,還有一件事是,任何全局聲明的變量將駐留在SRAM的.bss段或.data段[這實際上是C標準的一部分]。最終可執行文件的__do_copy_data__do_clear_bss部分處理[它們會自動添加到.init4節]。您可以使用編譯器標誌覆蓋此機制,但每個全局變量的地址在程序開始執行時[從閃存中發生,而不是從SRAM發出]是已知的。

現在,把東西放入SRAM中,我建議你看看this page on the avr-libc manual。它涉及內存部分,以及如何調整它們。乾杯。

+0

是的,謝謝你,我最終使用了一個全局變量,它的地址可以放入progspace女巫是單獨的(因此我的困惑),因爲它們在BSS上,加載時知道地址 –