ARM體系結構
1、 請簡述ARM處理器的特點,至少說出5個以上的特點。(5分)
:低功耗;低成本,高性能,RISC結構;指令定長;支持Thumb(16位)/ARM(32位)雙指令集;體積小;
2、 請寫出ARM內核和ARM SoC處理器的異同,并舉例進行說明。(5分)
:ARM內核是ARM SoC處理器中的核心部分,所有ARM SoC都采用ARM的體系結構和指令集,ARM SoC主要是在ARM 內核基礎上繼承了Memory Controller,Interrtupt Controller,Timer,DMA Controller 以及像 GPIO,USB,IIC,LCD 等外設控制器。
3、 ARM內核有多少種工作模式?請寫出這些工作模式的英文縮寫。(7分)
:ARM有7種工作模式,usr、sys、svc、irq,abt,und、fiq。
4、 ARM內核有多少個寄存器,請列舉出這些寄存器的名字和數量。(5分)
:ARM有37個寄存器,(1)未分組寄存器:R0-R7,共8個;(2)分組寄存器R8-R14,其中FIQ模式下有單獨的一組R8-R12共5個,另外6種模式共用一組R8-R12,共5個,USR和SYS模式共用一組R13-R14,共2個,另外5種模式下各有獨自的一組R13-R14,共10個;(3)程序計數器PC即R15寄存器,共1個;(4)狀態寄存器CPSR,和5個備份狀態寄存器SPSR,共6個;ARM總計37個寄存器。
5、 ARM通用寄存器中,有3個寄存器有特殊功能和作用,請寫出它們的名字和作用。(6分)
:R13:SP棧指針寄存器,用來保存程序執行時的棧指針位置;R14:LR返回鏈接寄存器,用來保存程序執行BL指令或模式切換時的返回原程序繼續執行的地址;R15:PC程序計數器,保存程序執行的當前地址。
6、 請描述一下CPSR寄存器中相關Bit的情況和作用。(5分)
:條件位(指令進行算術運算后的結果是否有進位,借位等),I位(IRQ異常允許位),F位(FIQ異常允許位),T位(ARM/Thumb工作狀態),模式位(處理器工作模式)
7、 請寫出以下相關ARM指令語句的注釋:(7分)
MOV R0, PC 把PC的值傳送到 R0寄存器,此時PC地址為當前指令位置+8
ADD R0, R1, #1 把R1加上1的結果給R0寄存器
LDR R0, =0x56000010 是偽指令,把0x56000010放到R0寄存器中,采用文字池技術。
LDR PC, [PC, #4] 把當前PC值加4位置的內容賦值給PC,實現絕對跳轉
MRS R0, CPSR 把CPSR的值傳送給R0
BL LOOP 帶返回地址的跳轉指令,把下一條指令給LR后,跳轉到Loop 地址
STMFD R13!,{R0-R12} 壓棧指令,把R0到R12寄存器的值通過R13棧指針進行壓棧保存,同時這個棧是滿遞減方式的棧。
8、 什么是立即數?請簡要描述立即數在使用時有什么注意要點。(2分)
立即數,主要是指尋址時直接在指令中出現的數,在使用時注意(1)立即數前需要加#(2)ARM指令只有32位長,立即數在指令中占12位存儲空間,ARM用這12位空間8位表示有效數字-基數B,4位表示譯為的數M,按照把B循環右移M*2位,構造成一個新的32位的數,其它位補0,所以在使用立即數時,要注意其是否合法。
9、 請問BL指令跳轉時LR寄存器保存的是什么內容?并請簡述原因。(3分)
BL跳轉時,LR中保存的是執行BL跳轉指令的下一條指令的地址,考慮流水線的情況,即當前的PC-4。LR用來在需要返回程序時從LR中還原程序執行的位置繼續執行。
10、 請描述一下什么是處理器現場,如何進行保存現場?(5分)
每種工作模式下都包含R0-R15,CPSR這17個寄存器,程序的執行當前狀態就保存在這些寄存器中,稱為處理器現場。當發生模式切換時,由于其中的一些寄存器是多種模式下共用的寄存器,為了防止共用處理器寄存器中的值被破壞,所以需要保存原模式下的處理器現場,利用STM批量存儲指令,把處理器現場對應的寄存器保存到棧上,待還原時再出棧恢復(模式和返回地址)。其中保存現場的工作,硬件完成了CPSR模式的保存和PC返回地址的保存,其他寄存器的保存工作主要依靠軟件壓棧完成,其中LR因為可能被異常處理程序中的BL跳轉指令修改,所以一般都需要軟件壓棧再保存。
11、 請描述一下什么是小尾端Littler-Endian存儲格式,如何編程確定處理器的存儲格式?(2分)
小尾端:低地址存低字節,高地址存高字節。測試:按字節打印int型的0x12345678,如是小尾端,則先打78.(通過 union 的方式也可以實現測試是否是小尾端)
12、 請寫出一條完整的ARM軟件中斷指令,并簡要描述其作用。(2分)
SWI 0x1。SWI指令觸發軟中斷異常,使程序的執行流跳轉到異常向量表地址0x8,0x1是軟中斷的中斷號,軟中斷處理程序可根據不同的中斷號調用對應的處理子程序。一般SWI軟中斷都用于操作系統的系統調用。
13、 請描述一下ARM體系中異常向量表的概念。(7分)
異常向量表是從0x0地址開始,一共32個字節,包含8個表項,其中有1個保留不用,其他7個表項對應7種異常發生后的跳轉位置,這7種異常發生后分別對應到5種異常模式。每個表項里面放的一般都是一條跳轉指令,用來跳轉到真正的異常處理程序入口,通過B指令,或者LDR PC,[PC, #?] 的方式都可以實現此類跳轉。
14、 產生軟中斷和硬中斷異常時,程序計數器跳轉到的地址是哪里?(2分)
軟中斷:0x8,硬中斷:0x18。
15、 請寫出發生異常后,在進行異常響應時,硬件完成了哪些工作?(5分)
異常響應時:(1)硬件自動保存程序的返回地址到要切換的工作模式下的LR中;(2)硬件自動保存CPSR到要切換的工作模式下的SPSR中;(3)修改CPSR的模式位;(4)映射相應模式下的寄存器;(5)設置PC跳轉到要進入的異常向量表的入口地址。
ARM SOC編程開發
16、 請寫出一個ARM程序生成的bin文件映像中包含哪些內容?(3分)
ARM生成的bin文件包含:RO,RW 兩個段,注意 ZI 段一般都不在 bin 文件中占用存儲空間。
17、 請寫出完整編譯生成bin文件的命令行:使用文件為 start.s main.c (5分)
armasm start.s –o start.o
armcc –c main.c –o main.o
armlink start.o main.o –first start.o –o main.axf
fromelf –bin main.axf –o main.bin
18、 請寫出armlink時經常使用的參數選項及其作用,不少于3個。(3分)
-first 指定目標二進制文件哪個鏈接時放在存儲的最前面;-entry 指定程序的入口地址,即程序從哪里開始首先執行;-ro-base 指定程序鏈接時RO段采用的內部加載基址;-rw-base 指定RW段加載時的加載地址。
19、 請舉例說明在ARM處理器上進行一次中斷處理和中斷異常處理的差異。(3分)
中斷處理相比異常處理,主要是中斷需要初始化中斷源和中斷控制器,中斷發生后在ISR中要清除相應Pending位,而且要在進入中斷處理程序一開始就清除。
20、 請寫出從中斷異常進行返回時,軟件編程要處理的事項和注意要點。(2分)
(1)返回地址LR的調整。(2)在恢復PC的同時,恢復CPSR(恢復原來的模式,返回被打斷的地址。)
21、 請詳細描述我們在S3C2440開發板實驗過程中進行串口初始化的流程和要點。(5分)
時鐘頻率設置(MPLL,PCLK的設置),串口數據位8位,停止位1位,奇偶校驗無,波特率設置需要根據PCLK代入公式進行計算等
22、 請詳細描述我們在S3C2440開發板實驗過程中進行按鍵中斷觸發的流程和要點。(8分)
SVC和IRQ模式下的SP棧指針設置,IO管腳復用設置,設置按鈕的觸發模式(下降沿觸發),管腳的中斷模式使能,中斷掩碼寄存器屏蔽位打開,清除PND寄存器中的pending位,打開CPSR-I位;
23、 請說明S3C2440處理器,關于 memory map 的情況。(5分)
2440的memory分為8個bank,每個bank的固定大小為128M,每個bank均可以產生一個片選信號,共1G的地址空間,8個片選信號,bank0-bank5用來存放SROM器件,bank6和bank7用來存放SDRAM器件。
24、 請詳細描述 bootloader 啟動代碼的設計流程,并說明你目前所實現的bootloader已經完成的功能有哪些,實現中遇到了哪些困難和bug問題? (5分)
bootloader的設計流程:硬件的初始化(1)初始化看門狗(2)關中斷(3)設置處理器時鐘(4)初始化SDRAM器件(5)初始化串口(6)實現shell命令解釋器功能,(7) 提供通過串口的下載功能download和執行功能Go。要求能夠講的出你自己實現bootloader過程中遇到的實際問題和解決辦法,這個很重要。
25、 請說明以下代碼中可能存在的3個bug,并給出解決辦法。(3分)
#define UART_BASE 0x50000000
#define UTRSTAT0 *(volatile unsigned int *) UART_BASE+0x10
#define UTXH0 *(volatile unsigned int *) UART_BASE+0x20
int main(void)
{
if( UTRSTAT0 & 0x4 == 0x4 )
UTXH0 = 'a';
return 0;
}
(1) UART_BASE+0x10應該加上括號(2)& 的優先級比 == 要低,所以要加括號。(3) if應該改為while( !(UTRSTAT0 & 0x4) )
附加題:
請說明SRAM, SDRAM, Nor Flash 和Nand Flash的異同,并詳細描述各自編程上的注意要點。
異同見教材,編程上要注意說明 SRAM和NorFlash無須初始化就可以使用,SDRAM和NandFlash都需要初始化驅動代碼才可以工作,NorFlash的寫需要靠芯片手冊規定的時序來做,STR指令不能夠直接寫入NorFlash和NandFlash,但可以直接寫入SRAM和SDRAM。 NandFlash器件是屬于IO方式進行讀,和其他3種器件的總線讀方式不一樣,因此讀寫NandFlash需要相應的驅動。
Linux體系
答:ARM技術的設計者將ARM處理器在應用中可能產生的狀態進行了分類,并針對同一類型的異常狀態設定了一個固定的入口點,當異常產生時,程序會自動跳轉到對應異常入口處進行異常服務。
1.用戶模式:非特權模式,也就是正常程序執行的模式,大部分任務在這種模式下 執行。在用戶模式下,如果沒異常發生,不允許應用程序自行改變處理器的工作模式,如果有異常發生,處理器會自動切換工作模式
2.FIQ模式:也稱為快速中斷模式,支持高速數據傳輸和通道處理,當一個高優先級(fast)中斷產生時將會進入這種模式。
3.IRQ模式:也稱為普通中斷模式,:當一個低優先級(normal)中斷產生時將會進入 這種模式。在這模式下按中斷的處理器方式又分為向量中斷和非向量中斷兩種。通常的中斷處理都在IRQ模式下進行。
4.SVC模式:稱之為管理模式,它是一種操作系統保護模式。當復位或軟中斷指 令執行時處理器將進入這種模式。
5.中止模式:當存取異常時將會進入這種模式,用來處理存儲器故障、實現虛擬存儲或存儲保護。
6.未定義指令異常模式:當執行未定義指令時會進入這種模式,主要是用來處理未 定義的指令陷阱,支持硬件協處理器的軟件仿真,因為未定義指令多發生在對協處理器的操作上。
7.系統模式:使用和User模式相同寄存器組的特權模式,用來運行特權級的操作系統任務。
在這7種工作模式中,除了用戶模式以外,其他6種處理器模式可以稱為特權模式, 在這些模式下,程序可以訪問所有的系統資源,也可以任意地進行處理器模式的切 換。
在這6種特權模式中,除了系統模式外的其他5種特權模式又稱為異常模式,每種 異常都對應有自己的異常處理入口點
1.解釋命令ls -a | more具體含義.
ls -a命令顯示當前目錄下的所有文件包括隱藏文件,并將ls -a命令的執行結果通過管道傳送給more命令分
屏顯示。
2.LINUX中的管道指什么重定向又指什么
Linux中管道用 “|”表示,將一個命令的輸出,作為你一個命令的輸入。
重定向
3.GCC -g -o test.elf test.c的具體含義.
將源代碼test.c文件編譯連接成目標文件test.elf文件,同時對test.elf設置gdb調試開關
4.淺述GCC編譯器在編譯時都有哪幾個過程
gcc編譯c源碼有四個步驟:預處理,編譯,匯編,鏈接。
5,在題3的基礎上編寫一MAKEFILE文件,要求能自動完成編譯和清除功能
SRCS = $(wildcard *.c) -->定義變量SRCS,其職為當前文件夾下所有.c文件
OBJS = $(SRCS:.c = .o) -->建SRCS中所有.c文件編譯成.o文件
CC = gcc --> 編譯器gcc
INCLUDES = -I/ --定義額外引用的頭文件路徑
LIBS = -I/ --定義額外使用的庫路徑名
CCFLAGS = -g -Wall -00 --CCFLAGS存放編譯選項
test.elf : $(OBJS) --test.elf是編譯的最終目標文件,依賴于所有.o文件
$(CC) $^ -O $@ $(INCLUDES) $(LIBS) --$^代表$(OBJS),$@代表test.elf
%.o : %.c
$(CC) -c $< $CCFLAGS --將所有的.c文件編譯成.o目標文件, $<代表所有的.c文件
clean:
rm *.o --清除所有的.o文件
. Linux中的用戶模式和內核模式是什么含意?
MS-DOS等操作系統在單一的CPU模式下運行,但是一些類Unix的操作系統則使用了雙模式,可以有效地實現時間共享。在Linux機器上,CPU要么處于受信任的內核模式,要么處于受限制的用戶模式。除了內核本身處于內核模式以外,所有的用戶進程都運行在用戶模式之中。
內核模式的代碼可以無限制地訪問所有處理器指令集以及全部內存和I/O空間。如果用戶模式的進程要享有此特權,它必須通過系統調用向設備驅動程序或其他內核模式的代碼發出請求。另外,用戶模式的代碼允許發生缺頁,而內核模式的代碼則不允許。
在2.4和更早的內核中,僅僅用戶模式的進程可以被上下文切換出局,由其他進程搶占。除非發生以下兩種情況,否則內核模式代碼可以一直獨占CPU:
(1)它自愿放棄CPU;
(2)發生中斷或異常。
2.6內核引入了內核搶占,大多數內核模式的代碼也可以被搶占。
1) Linux中主要有哪幾種內核鎖?
2) Linux中的用戶模式和內核模式是什么含意?
3) 怎樣申請大塊內核內存?
4) 用戶進程間通信主要哪幾種方式?
5) 通過伙伴系統申請內核內存的函數有哪些?
6) 通過slab分配器申請內核內存的函數有?
7) Linux的內核空間和用戶空間是如何劃分的(以32位系統為例)?
8) vmalloc()申請的內存有什么特點?
9) 用戶程序使用malloc()申請到的內存空間在什么范圍?
10) 在支持并使能MMU的系統中,Linux內核和用戶程序分別運行在物理地址模式還是虛擬地址模式?
11) ARM處理器是通過幾級也表進行存儲空間映射的?
12) Linux是通過什么組件來實現支持多種文件系通的?
13) Linux虛擬文件系統的關鍵數據結構有哪些?(至少寫出四個)
14) 對文件或設備的操作函數保存在那個數據結構中?
15) Linux中的文件包括哪些?
16) 創建進程的系統調用有那些?
17) 調用schedule()進行進程切換的方式有幾種?
18) Linux調度程序是根據進程的動態優先級還是靜態優先級來調度進程的?
19) 進程調度的核心數據結構是哪個?
20) 如何加載、卸載一個模塊?
21) 模塊和應用程序分別運行在什么空間?
22) Linux中的浮點運算由應用程序實現還是內核實現?《》
23) 模塊程序能否使用可鏈接的庫函數?
24) TLB中緩存的是什么內容?
25) Linux中有哪幾種設備?
26) 字符設備驅動程序的關鍵數據結構是哪個?
27) 設備驅動程序包括哪些功能函數?
28) 如何唯一標識一個設備?
29) Linux通過什么方式實現系統調用?
30) Linux軟中斷和工作隊列的作用是什么?
7. 如何使用gdb調試多進程
答:最常用的是attach方法,首先寫程序時在子進程中調用sleep函數休眠30-60秒,
將程序編譯成可執行文件,后臺運行可執行文件,ps -fu root查看進程號,gdb,
attach進程號,再使用stop暫停子進程,設置一些斷點和一些watch,break設置斷點
,list命令察看源代碼,step單步運行,next運行下一步,continue繼續運行,
print打印變量信息。
3.GCC -g -o test.elf test.c的具體含義 將test.c 文件編譯輸出為test.elf
帶上調試信息,可以用GDB調試用
4.淺述GCC編譯器在編譯時都有哪幾個過程 要經歷四個相互關聯的步驟:預處理(也
稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接
(Linking)。 預處理(Preprocessing):命令gcc首先調用cpp進行預處理,在預處理
過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進
行分析。 編譯(Compilation):接著調用cc進行編譯,這個階段根據輸入文件生成以
.o為后綴的目標文件。 匯編(Assembly):匯編過程是針對匯編語言的步驟,調用as
進行工作,一般來講,.s為后綴的匯編語言源代碼文件和匯編.s為后綴的匯編語言文
件經過預編譯和匯編之后都生成以.o為后綴的目標文件。 連接(Linking):當所有的
目標文件都生成之后,gcc就調用ld來完成最后的關鍵性工作,這個階段就是連接。在
連接階段,所有的目標文件被安排在可執行程序中的恰當位置,同時,該程序所調用
到的庫函數也從各自所在的檔案庫中連到合適的地方
13.淺談bootloader,kelnel,filesystem三者之間的關系. 嵌入式是linux啟動過
程如下。 bootloader->kernel->filesystem->application 先是bootloader,
它是linux-kernel移植的基石,Bootloader是在系統啟動之后、Kernel運行之前所
執行的第一段代碼,其任務是為調用Kernel準備必要的軟硬件環境。完成bootlaoder
的移植后,就是kernel的移植。主要包括添加特定模塊的驅動,針對具體要求對內核
進行配置。這里有兩點要注意:一是有些參數要與所用的bootloader向對應,如nand
的分區參數。二是bootlaoder對特定模塊的驅動在進入kernel后便會有kernel接管
,并有kernel重新驅動文件系統主要是建立根文件和一些系統功能的實現,如bash。
用busybox很容易搞定。 3. Linux系統下.ko文件是什么文件?.so文件是什么文
件? Linux下面文件名不代表什么。但是從常識上講,.ko代碼是驅動編譯成的格
式, .so文件一般是動態庫文件
2、查看驅動模塊中打印信息應該使用什么命令?如何查看內核中已有的字符設備的信息?如何查看正在使用的有哪些中斷號?
答:1) 查看驅動模塊中打印信息的命令:dmesg
2) 查看字符設備信息可以用lsmod 和modprobe,lsmod可以查看模塊的依賴關系,modprobe在加載模塊時會加載其他依賴的模塊。
3)顯示當前使用的中斷號cat /proc/interrupt
這幾天面試幾個想做安卓Linux驅動的,總體感覺上驅動基礎還是比較薄弱,大部分情況是雖然做過驅動,但是基本上都是采用內核現成的,或者是開發板上已經有的,單獨寫過模塊驅動很少,驅動機制理解不是很透徹.以下是幾個隨口問過的基礎問題,供參考.
1、字符型驅動設備你是怎么創建設備文件的,就是/dev/下面的設備文件,供上層應用程序打開使用的文件?
2、寫一個中斷服務需要注意哪些?如果中斷產生之后要做比較多的事情你是怎么做的?
3、自旋鎖和信號量在互斥使用時需要注意哪些?在中斷服務程序里面的互斥是使用自旋鎖還是信號量?還是兩者都能用?為什么?
4、原子操作你怎么理解?為了實現一個互斥,自己定義一個變量作為標記來作為一個資源只有一個使用者行不行?
5、insmod 一個驅動模塊,會執行模塊中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過卸載驅動出現異常沒?是什么問題引起的?
6、在驅動調試過程中遇到過oops沒?你是怎么處理的?
7、ioctl和unlock_ioctl有什么區別?
8、驅動中操作物理絕對地址為什么要先ioremap?
9、設備驅動模型三個重要成員是?platfoem總線的匹配規則是?在具體應用上要不要先注冊驅動再注冊設備?有先后順序沒?
1、字符型驅動設備你是怎么創建設備文件的,就是/dev/下面的設備文件,供上層應用程序打開使用的文件?
答:mknod命令結合設備的主設備號和次設備號,可創建一個設備文件。
評:這只是其中一種方式,也叫手動創建設備文件。還有UDEV/MDEV自動創建設備文件的方式,UDEV/MDEV是運行在用戶態的程序,可以動態管理設備文件,包括創建和刪除設備文件,運行在用戶態意味著系統要運行之后。那么在系統啟動期間還有devfs創建了設備文件。一共有三種方式可以創建設備文件。
2、寫一個中斷服務需要注意哪些?如果中斷產生之后要做比較多的事情你是怎么做的?
答:中斷處理例程應該盡量短,把能放在后半段(tasklet,等待隊列等)的任務盡量放在后半段。
評:寫一個中斷服務程序要注意快進快出,在中斷服務程序里面盡量快速采集信息,包括硬件信息,然后推出中斷,要做其它事情可以使用工作隊列或者tasklet方式。也就是中斷上半部和下半部。
第二:中斷服務程序中不能有阻塞操作。為什么?大家可以討論。
第三:中斷服務程序注意返回值,要用操作系統定義的宏做為返回值,而不是自己定義的OK,FAIL之類的。
3、自旋鎖和信號量在互斥使用時需要注意哪些?在中斷服務程序里面的互斥是使用自旋鎖還是信號量?還是兩者都能用?為什么?
答:使用自旋鎖的進程不能睡眠,使用信號量的進程可以睡眠。中斷服務例程中的互斥使用的是自旋鎖,原因是在中斷處理例程中,硬中斷是關閉的,這樣會丟失可能到來的中斷。
評:回答的還可以。
4、原子操作你怎么理解?為了實現一個互斥,自己定義一個變量作為標記來作為一個資源只有一個使用者行不行?
答:原子操作指的是無法被打斷的操作。我沒懂第二句是什么意思,自己定義一個變量怎么可能標記資源的使用情況?其他進程又看不見這個變量
評:第二句話的意思是:
定義一個變量,比如 int flag =0;
if(flag == 0)
{
flag = 1;
操作臨界區;
flag = 0;
}這樣可否?
5、insmod 一個驅動模塊,會執行模塊中的哪個函數?rmmod呢?這兩個函數在設計上要注意哪些?遇到過卸載驅動出現異常沒?是什么問題引起的?
答:insmod調用init函數,rmmod調用exit函數。這兩個函數在設計時要注意什么?卸載模塊時曾出現卸載失敗的情形,原因是存在進程正在使用模塊,檢查代碼后發現產生了死鎖的問題。
評:要注意在init函數中申請的資源在exit函數中要釋放,包括存儲,ioremap,定時器,工作隊列等等。也就是一個模塊注冊進內核,退出內核時要清理所帶來的影響,帶走一切不留下一點痕跡。
6、在驅動調試過程中遇到過oops沒?你是怎么處理的?
沒有。。
評:其他人可以接著說。
7、ioctl和unlock_ioctl有什么區別?
沒用過unlock_ioctl。。
評:其他人可以接著說。
8、驅動中操作物理絕對地址為什么要先ioremap?
答:因為內核沒有辦法直接訪問物理內存地址,必須先通過ioremap獲得對應的虛擬地址。
評:其他人可以接著說。
9、設備驅動模型三個重要成員是?platfoem總線的匹配規則是?在具體應用上要不要先注冊驅動再注冊設備?有先后順序沒?
這個真不知道。。
1
#define GPBCON (*(volatile unsigned long *)0x56000010)的理解
A:volatile
當計算機需要一個數值的時候,會先把內存中(ARM處理寄存器地址)的值讀取到寄存器(這
里指的是r0-r1....r15),然后下次在使用該值的時候就直接讀取寄存器(r0-r1....r15)中的值
了。加上volatile之后,程序就會在每次需要該值的時候都讀取一次內存。這是為了防止某些原
因硬件會改變其值。
B:
(volatile unsigned long *)即為強制類型轉換;(volatile unsigned long *)0x56000010
的意思就是把0x56000010強制轉換為unsigned long類型的指針。這時(volatile unsigned long
*)0x56000010就可以看做是一個指針p了。*(volatile unsigned long*)0x56000010等價于*p 。
|