[ 例 ]
char xdata* data pagePointer = 0x1000;
拆開來看, 把 KEIL 擴充的先拿掉;
char * pagePointer; // 指向字元的指標
加入 xdata, 描述指標形式, char xdata * pagePointer; // 被指向字元位於外部記憶體
加入 data, 描述 pagePointer 本體所在位置, char xdata * data pagePointer; // 被指向字元位於外部記憶體, pagePointer 本體配置於晶片內記憶體.
加入初值 char xdata* data pagePointer = 0x1000; // pagePointer 指向外部記憶體位址 0x1000 的字元.
有關於KEIL C裡面一些東西,如果你不太清楚的話,你可以去找一下KEIL C COMPILER的使用說明,裡面有很詳盡的解說,比市面上一般書籍介紹的還要多,看完後你就會很瞭解的。
[ 轉錄 ]
http://www.haifeng.idv.tw/leo/cgi-bin/topic.cgi?forum=53&topic=167&show=20...
Read more
2007年2月26日 星期一
[+/-] : xdata and data
[+/-] : volatile
volatile宣告 在C裡面有volatile這個宣告,通常是說這個變數會被外在routine改變, 在kernel裡面通常是指會被interrupt handler(有時就是硬體中斷的routine) 改變值,也就是被非同步的改變的變數。例如 unsigned long vloatile jiffies; jiffies在kernel是時間每次hardware的中斷會來改這個值 在asm裡面是說這個東西compiler時,gcc不要雞婆作optimized,因為 最佳化的結果,compiler會把code按照他想的方法放到記憶體裡, 但是有的code我們需要特定指定他一定要在某個記憶體上, 在kernel裡常有這樣情形發生,我們可以用 __asm__ __volatile__宣告一段assembly的code是不要做最佳化的。 例如cli sti #define disable() __asm__ __volatile__ ("cli"); #define enable() __asm__ __volatile__ ("sti");
[ 例1 ]
Volatile這玩意兒用在單晶片的C語言較多
例如:
Volatile char wait;
void xxx(void)
{
wait=1;
while (wait!=0);
.....
.....
}
void timer0(void) interrupt 1
{
wait=0;
.......
}
xxx()中就是等一個timer中斷才執底下工作.
如果不寫Volatile會被編譯器省略掉.
因為wait=1;何來wait會等於0
[ 例2 ]
volatile sig_atomic_t read_flag = 1;
volatile是一個關鍵字(keyword),用來修飾詞資料型態,與const有對應的關係。
是語言關鍵字的話,就不會出現在標頭檔內的定義。
volatile sig_atomic_t read_flag = 1;
read_flag是一個為sig_atomic_t的資料型態,透過volatile的修飾,說明sig_atomic_t在程式中,可以在任何的時間下被修改 ,
也就是說,你的程式可能同一時間不止一個程序在使用。
可能主程式main在使用的同時,I/O Device或另一個thread也在利用或指定這個read_flag
來透過溝通的作用。
[ 例3 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
[ 參考 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060329085552QSX&fumcde=FUM20050124191259IGD&rplcnt=5...
Read more
[ 例1 ]
Volatile這玩意兒用在單晶片的C語言較多
例如:
Volatile char wait;
void xxx(void)
{
wait=1;
while (wait!=0);
.....
.....
}
void timer0(void) interrupt 1
{
wait=0;
.......
}
xxx()中就是等一個timer中斷才執底下工作.
如果不寫Volatile會被編譯器省略掉.
因為wait=1;何來wait會等於0
[ 例2 ]
volatile sig_atomic_t read_flag = 1;
volatile是一個關鍵字(keyword),用來修飾詞資料型態,與const有對應的關係。
是語言關鍵字的話,就不會出現在標頭檔內的定義。
volatile sig_atomic_t read_flag = 1;
read_flag是一個為sig_atomic_t的資料型態,透過volatile的修飾,說明sig_atomic_t在程式中,可以在任何的時間下被修改 ,
也就是說,你的程式可能同一時間不止一個程序在使用。
可能主程式main在使用的同時,I/O Device或另一個thread也在利用或指定這個read_flag
來透過溝通的作用。
[ 例3 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
[ 參考 ]
http://www.programmersheaven.com/articles/pathak/article1.htm
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060329085552QSX&fumcde=FUM20050124191259IGD&rplcnt=5...
Read more
2007年2月25日 星期日
[+/-] : 結構中的冒號; 位域
位域
有些信息在存儲時,並不需要佔用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個字節中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共佔兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對於位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a佔第一字節的4位,後4位填0表示不使用,b從第二字節開始,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個字節,因此位域的長度不能大於一個字節的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*PBit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
PBit=&bit;
PBit->a=0;
PBit->b&=3;
PBit->c=1;
printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c);
}
上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可以使用指標的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"=", 相當於: PBit->c=PBit->c1其結果為15。程序第17行用指針方式輸出了這三個域的值。
[ 參考 ]
http://big5.yesky.com/b5/dev.yesky.com/374/2645874.shtml...
Read more
有些信息在存儲時,並不需要佔用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個字節中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。一、位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結構變量說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變量,共佔兩個字節。其中位域a占8位,位域b占2位,位域c占6位。對於位域的定義尚有以下幾點說明:
1. 一個位域必須存儲在同一個字節中,不能跨兩個字節。如一個字節所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a佔第一字節的4位,後4位填0表示不使用,b從第二字節開始,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個字節,因此位域的長度不能大於一個字節的長度,也就是說不能超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。
二、位域的使用
位域的使用和結構成員的使用相同,其一般形式為: 位域變量名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*PBit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
PBit=&bit;
PBit->a=0;
PBit->b&=3;
PBit->c=1;
printf("%d,%d,%d\n",PBit->a,PBit->b,PBit->c);
}
上例程序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可以使用指標的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"=", 相當於: PBit->c=PBit->c1其結果為15。程序第17行用指針方式輸出了這三個域的值。
[ 參考 ]
http://big5.yesky.com/b5/dev.yesky.com/374/2645874.shtml...
Read more
[+/-] : pc camera 架構
[+/-] : 50個數碼相機名詞解釋(上)
[ Q ]
使用AE鎖有幾點需要注意:1、手動方式或自拍時不能使用自動曝光(AE)鎖。 2、按下自動曝光(AE)鎖之後不要再調節光圈大小。 3、用閃光燈攝影時不要使用(AE)鎖。
[ 參考 ]
50個數碼相機名詞解釋(上)
...
Read more
使用AE鎖有幾點需要注意:1、手動方式或自拍時不能使用自動曝光(AE)鎖。 2、按下自動曝光(AE)鎖之後不要再調節光圈大小。 3、用閃光燈攝影時不要使用(AE)鎖。
[ 參考 ]
50個數碼相機名詞解釋(上)
...
Read more
2007年2月5日 星期一
[+/-] : YUY2
YUV 格式通常有兩大類:打包(packed)格式和平面(planar)格式。
前者將 YUV 份量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而後者使用三個數組分開存放 YUV 三個份量,就像是一個三維平面一樣。
YUY2屬於packed格式:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/yuvvideosubtypes.asp ...
Read more
前者將 YUV 份量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而後者使用三個數組分開存放 YUV 三個份量,就像是一個三維平面一樣。
YUY2屬於packed格式:
[ 參考 ]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/yuvvideosubtypes.asp
Read more
訂閱:
文章 (Atom)
