2012-11-17 18 views
0

C18編譯器允許程序存儲器中的變量與ROM限定符一起使用,但Hi-Tech C似乎不太願意最大限度地利用Havard體系結構。那麼有沒有辦法用Hi-Tech C編譯器在程序存儲器中創建數據緩衝區(我已準備好降低訪問速度)。程序存儲器中的Hitech C數據緩衝區

我已經看到psect的可能性的跡象,但沒有任何工作實現。

回答

2

默認情況下,HI-TECH PICC18編譯器將聲明爲const的對象放置到程序空間中。像C18的RAM/ROM沒有特別的限定詞,需要:

3.5.3對象的程序空間

const對象通常都放在程序空間。在PIC18器件上,程序空間爲 字節寬,編譯器在每個字節位置存儲一個字符,並使用表 讀取指令讀取值。所有const -quali fi ed數據對象和字符串文字被放置在const psect。 const psect位於RAM上限以上的地址,因爲RAM和const指令使用該地址來確定是否需要訪問ROM或RAM。

請注意,將頻繁更新的數據放入微控制器的閃存中可能不是一個好主意,因爲閃存的編程/擦除週期數量有限。

far指針可以用來取消引用程序存儲器:

3.4.12.2 CONST和遠指針

constfar指針可以是16個或24位寬。它們的大小可以通過--CP=24--CP=16命令行選項進行切換。用於取消引用的代碼也隨其大小而變化。 必須爲項目中的所有模塊使用相同的指針大小。 指向far的指針與指向const的指針完全相同,只是可以使用指向far的指針來寫入到它們所保存的地址的 。指向const對象的指針不能用於寫入,因爲合格者強制該對象是隻讀的。 constfar這16位寬的指針可以訪問所有的RAM區域和大部分程序空間 。在解除引用的運行時,檢查指針的內容。對於 以上的地址,使用表讀或表寫指令訪問程序空間的RAM的上限。 地址低於RAM的上限訪問數據空間。即使指針 至const所保存的地址位於RAM中,RAM位置也不能改變。 默認鏈接器選項始終將const數據放置在數據上限以上的地址處,以便在使用指針取消引用時訪問正確的內存空間。 如果選擇的目標器件具有多於64k字節的程序空間內存,則只能使用16位寬的指針訪問較低的64k字節。假設需要取消引用的所有程序空間對象 都在較低的64k字節中,則仍然可以使用指向constfar對象 的16位指針。較小的指針尺寸導致所需的RAM較少,生成的代碼較少,因此應儘可能使用這些代碼。 constfar 24位寬的指針可以訪問所有的RAM區域和所有的程序空間。在解除引用的運行時,檢查指針的內容。如果地址中的位編號爲21 ,則該地址被假定爲RAM地址。地址的第21位是 ,然後被忽略。如果位號21清零,則假定地址是程序 空間中的對象,並且使用表格讀取或表格寫入指令來執行訪問。同樣,不允許使用指向const的指針寫入 對象。 請注意,當取消引用24位指針時,可能會覆蓋TBLPTRU寄存器中最重要的實現位(位號 21)。該位可以用於訪問PIC18器件的配置區域 。如果從手寫的 彙編代碼中加載表指針寄存器,則在執行表讀取 或寫入指令之前,不要假設位編號爲21的狀態。

引用來自HI-TECH PICC18 v9.51手冊。

+0

Microchip實際上似乎是在提升程序存儲器中的數據。你有沒有看過他們的應用筆記AN 548和AN 556.那麼引導加載程序和USB緩衝區呢? – Vishnu

+0

這對於上電覆位後需要仍然存在的任何數據都很有用。我正在使用這些原則來存儲程序存儲器中的配置數據。正如你所提到的,另一個應用是引導程序。對於USB緩衝區,我一直使用數據存儲器(RAM)。 – mizo

+0

我非常感謝您的耐心和真正有幫助的答案。 C18的ram&ram選項讓我感到困惑,但堅持標準(就像Hitech一樣),並在必要時(明智地)使用ASM TABLWT和TABLRD。另外,它提到我的程序存儲器的100,000次寫入/擦除週期對於緩衝區來說有點太低。 – Vishnu