簡體   English   中英

尋址指針C / C ++的不同方法

[英]Different ways of addressing pointers C/C++

我對使用c樣式指針訪問特定地址有些困惑。

我有32位芯片,正在嘗試編程。 我需要在ram中翻轉一些東西。 以下解決方案工作正常。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;


ram[(strbase+0x48)/4] = 0x10000000; 
ram[(strbase+0x4c)/4] = 0x10000000; 
ram[(strbase+0x50)/4] = 0x10000000; 
ram[(strbase+0x54)/4] = 0x10000000; 
ram[(strbase+0x58)/4] = 0x10000000; 
ram[(strbase+0x5c)/4] = 0x10000000; 
ram += (strbase+0x60)/4;

但是,我有點困惑。 我嘗試編寫一些我認為等效但無法正常工作的子例程。 這種以下方法只能起作用。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;

*(uint32*)(0x03000000 + 0x001683c8) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683CC) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D0) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D4) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D8) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683DC) = 0x10000000; 
ram += (strbase+0x60)/4; 

下面的方法根本不起作用。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;

 ram += strbase+0x48; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 

我一直在為此糾纏了一段時間。 我認為可能是編譯器進行了某種優化。 希望你們中的一個可以向我解釋什么地方出了問題,或者向我指出可以解決這一問題的資源。

在第二個解決方案中,您將類型定義為

(uint32*)

代替

(volatile uint32*)

這使編譯器可以優化內存訪問並重新排序寫操作。 如果此代碼是較大例程的一部分,並且硬件希望您按順序編寫,則可能是問題所在。

在第三個解決方案中,正如Doc Brown已經說過的那樣,您必須除以四以獲得:

ram += (strbase+0x48)/4;

請注意,通常來說,應該始終使用sizeof(uint32)代替文字常量。 它有助於提高可讀性,並且C標准不能為您提供整數類型的確切大小。

暫無
暫無

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

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