[英]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.