1、寄存器操作
(1)ARM是內存與IO統一編址的,ARM中有很多內部外設,SoC中CPU通過向這些了內部
外設的寄存器寫入一些特定的值來操控這個內部外設,進而操控硬件動作。所以讀寫寄存器
就是操控硬件。
(2)寄存器的特點是按位進行規劃和使用。但是寄存器的讀寫是整體進行的,只想修改其中
的幾位是不可以的,必須整體寫入。
(3)寄存器操作的要求:在設定特定位的時候不能影響其他位。
(4)寄存器的操作過程:讀-改-寫。當需要改變一個寄存器中某些特定位時,先讀出寄存器
中原來的值,在這個基礎上修改特定位,再將修改後的值整體寫入寄存器。
2、特定位清零用位與
如果要將寄存器的某些特定位變爲0,則需要構造一個由1和0組成的數和這個寄存器原來的
值進行位與操作。
3、特定位置1用位或
如果要將寄存器的某些特定位變爲1,則需要構造這樣一個數:要置1的特定位爲1,其他位
爲0,讓後將這個數與原來的數進行位或即可。
4、特定位取反
需要構造這樣一個數:要取反的特定位爲1,其他位爲0,讓後將這個數與原來的數進行
位異或即可。
5、獲取特定位爲1的二進制數
(1)用移位來操作,例如我們需要構建一個bit3~bit7爲1的二進制數(其他位爲0),
我們只需要將5個1左移三位,(0x1f<<3)
(2)構建一個bit3~bit7爲1,同時bit23~bit25爲1爲1,其餘位爲0的數:((0x1f<<3)|(0x7<<23))
6、獲取特定位爲0的二進制數
(1)獲取bit4~bit10爲0,其餘位爲1的二進制數:(0xf<<0)|(0x1fffff<<11)
(2)當特定位比較少的情況(如上所示),不適合用連讀左移1來構造,可以先構造出
這個數的相反數,再取反得到這個數。還是(1)中的例子:~(0x7f<<4)
綜上:
如果要構造的數中爲1的位比較少,大部分爲0,則可以通過連續多個1左移得到。
如果要構造的數中爲0的位比較少,大部分爲1,則可以通過先構造相反數,再取反得到。