天嵌 ARM开发社区

 找回密码
 注册
查看: 3986|回复: 9

1<<(5*2)什么意思?

[复制链接]
yihuan 发表于 2009-12-10 18:53:07 | 显示全部楼层 |阅读模式
我在韦东山的书上GPIO介绍这一章看到如下代码:
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT       (*(volatile unsigned long *)0x56000014)
#define GPB_5out    1<<(5*2)

我知道GPBCON 与GPBDAT寄存器的地址分别是0x56000010  0x56000014,但是我想知道上面的语句(*(volatile unsigned long *)与 1<<(5*2)是什么意思,我没学过汇编,不知道是不是在汇编里面的表示方法,菜鸟问题,还希望能回答的详细些,谢谢。
juweihuang 发表于 2009-12-10 19:54:21 | 显示全部楼层
Volatile 用法

volatile的本意為"易變的"的意思
由於存取暫存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的最佳化。
例如:
static int i=0;
int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
此程式的本意是希望ISR_2中斷產生時,在main當中調用dosomething函式是,
但由於編譯器判斷在main函式裡面沒有修改過i,
因此可能只執行一次對從i到每暫存器的Read操作,
然後每次if判斷都只使用這個暫存器裡面的“i副本”,
導致dosomething永遠不會被引用。如果將變數加上volatile來修飾,
則編譯器保證對此變數的Read/Write操作都不會被最佳化(肯定會被執行)。
此例子中i也應該如此說明。
一般來說,volatile用在以下幾個地方:
1、中斷伺服程式中修改的供其它程式檢測的變量需要加volatile。
2、多任務環境下各任務間共享的標誌應該加volatile。
3、記憶位址對應的硬體暫存器通常也要加volatile,因為每次對它的Read/Write都有可能有不同的意義。
另外,以上幾種情況經常還要同時考慮數據的完整性
(相互關聯的幾個標誌Read一半被打斷了而重新Write),
第1項目中可以通過關中斷方式來實現,
第2項目中可以禁止任務調度,
第3項目中則只能依靠硬體的良好設計。:)
回复

使用道具 举报

juweihuang 发表于 2009-12-10 20:04:56 | 显示全部楼层
#define GPB_5out    1<<(5*2) 應該是將 GPB 的第5隻腳設為輸出組態.
例如 : 此腳若是接按鈕, 則需設為輸入組態,  若是接了一個LED燈, 則需設為輸出組態.

GPBCON 暫存器是設定 GPB 腳的組態. 所以 你應該會看到 :
回复

使用道具 举报

juweihuang 发表于 2009-12-10 20:07:48 | 显示全部楼层
類似 :   GPBCON |  GPB_5out   的運算, 它的目的就是剛才所說的
把GPB 第5隻腳設為輸出(或是輸入) 狀態, 詳情要看 S3c2440 規格書.


若有說錯, 望請先進指教 !!
回复

使用道具 举报

juweihuang 发表于 2009-12-10 20:13:36 | 显示全部楼层
還有, 把 #define GPB_5out    1<<(5*2) 寫成這樣還有一個好處,
就是要改第4隻腳為輸出腳時 就copy 它 , 改 為#define GPB_4out    1<<(4*2)

應該這樣就可以了.....

總而言之, 就是方便, 易讀.....這也是寫程式要注意的地方....
回复

使用道具 举报

 楼主| yihuan 发表于 2009-12-10 22:10:46 | 显示全部楼层
5# juweihuang


非常感谢你的热心帮助,不过1<<(n*2)表示什么意思我现在明白了,但是1和2是什么意思?还有就是<<以及*是汇编的表示方法么?指什么意思?
回复

使用道具 举报

亚瑟王 发表于 2009-12-11 18:00:01 | 显示全部楼层
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT       (*(volatile unsigned long *)0x56000014)
#define GPB_5out    1<<(5*2)
这个一看就是典型的C语言的预定义,1<<(5*2)其中1应该写为0x01,然后5×2应该写为10,把0x01左移10位,恰好是GPBCON寄存器中设置GPB5口为out用途的值。
回复

使用道具 举报

juweihuang 发表于 2009-12-11 20:41:19 | 显示全部楼层
同志(有志一同學嵌入式), 你首先要懂一些 C 語言的運算喔. 如 位移運算子 <<(左移) , >> (右移) ,
&&, &,  ||.  | 運算.....是什麼意思. C語言教學資料網上很多, 可自行參考下載.
回复

使用道具 举报

juweihuang 发表于 2009-12-16 02:31:10 | 显示全部楼层
6# yihuan


懂了嗎 ? 實在看不懂再問我 ......
回复

使用道具 举报

climberyoung 发表于 2009-12-18 18:11:13 | 显示全部楼层
ls热心人!赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-8-4 23:15 , Processed in 2.040813 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表