1、 嵌入式系統的主要組成部分
1)硬件設備;2)嵌入式操作系統;3)應用軟件;
2、一條語句實現“判斷一個數X爲2的 n 次冪”
if(x&(x-1)==0)
{
}
3、linux系統的設備分類
1)字符設備;2)塊設備;3)網絡設備;
http://hi.baidu.com/%C4%A7%B7%BD%D0%A1%D5%F2/blog/item/67d9ef18f334924f42a9adec.html
4、C語言運算符優先級
同一優先級的運算符,運算次序由結合方向所決定。
http://www.slyar.com/blog/c-operator-priority.html
優先級
運算符
名稱或含義
使用形式
結合方向
說明
1
[]
數組下標
數組名[常量表達式]
左到右
()
圓括號
(表達式)/函數名(形參表)
.
成員選擇(對象)
對象.成員名
->
成員選擇(指針)
對象指針->成員名
2
-
負號運算符
-表達式
右到左
單目運算符
(類型)
強制類型轉換
(數據類型)表達式
++
自增運算符
++變量名/變量名++
單目運算符
--
自減運算符
--變量名/變量名--
單目運算符
*
取值運算符
*指針變量
單目運算符
&
取地址運算符
&變量名
單目運算符
!
邏輯非運算符
!表達式
單目運算符
~
按位取反運算符
~表達式
單目運算符
sizeof
長度運算符
sizeof(表達式)
3
/
除
表達式/表達式
左到右
雙目運算符
*
乘
表達式*表達式
雙目運算符
%
餘數(取模)
整型表達式/整型表達式
雙目運算符
4
+
加
表達式+表達式
左到右
雙目運算符
-
減
表達式-表達式
雙目運算符
5
<<
左移
變量<<表達式
左到右
雙目運算符
>>
右移
變量>>表達式
雙目運算符
6
>
大於
表達式>表達式
左到右
雙目運算符
>=
大於等於
表達式>=表達式
雙目運算符
<
小於
表達式<表達式
雙目運算符
<=
小於等於
表達式<=表達式
雙目運算符
7
==
等於
表達式==表達式
左到右
雙目運算符
!=
不等於
表達式!= 表達式
雙目運算符
8
&
按位與
表達式&表達式
左到右
雙目運算符
9
^
按位異或
表達式^表達式
左到右
雙目運算符
10
|
按位或
表達式|表達式
左到右
雙目運算符
11
&&
邏輯與
表達式&&表達式
左到右
雙目運算符
12
||
邏輯或
表達式||表達式
左到右
雙目運算符
13
?:
條件運算符
表達式1? 表達式2: 表達式3
右到左
三目運算符
14
=
賦值運算符
變量=表達式
右到左
/=
除後賦值
變量/=表達式
*=
乘後賦值
變量*=表達式
%=
取模後賦值
變量%=表達式
+=
加後賦值
變量+=表達式
-=
減後賦值
變量-=表達式
<<=
左移後賦值
變量<<=表達式
>>=
右移後賦值
變量>>=表達式
&=
按位與後賦值
變量&=表達式
^=
按位異或後賦值
變量^=表達式
|=
按位或後賦值
變量|=表達式
15
,
逗號運算符
表達式,表達式,…
左到右
從左向右順序運算
5、strcpy(s1,s2)字符串處理函數
http://tech.163.com/06/0628/09/2KMP8QP60009159Q.html
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}GetMemory( char *p )函數的形參爲字符串指針,在函數內部修改形參並不能真正的改變傳入形參的值,執行完
char *str = NULL;
GetMemory( str );
後的str仍然爲NULL;
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
傳入GetMemory的參數爲字符串指針的指針,但是在GetMemory中執行申請內存及賦值語句
*p = (char *) malloc( num );
後未判斷內存是否申請成功,應加上:if ( *p == NULL )
{
...//進行申請內存失敗處理
}
6、sizeof與strlen
http://www.cnblogs.com/carekee/articles/1630789.html
1)、sizeof
sizeof(...)是運算符,在頭文件中typedef爲unsigned int,其值在編譯時即計算好了,參數可以是數組、指針、類型、對象、函數等。
它的功能是:獲得保證能容納實現所建立的最大對象的字節大小。
由於在編譯時計算,因此sizeof不能用來返回動態分配的內存空間的大小。實際上,用sizeof來返回類型以及靜態分配的對象、結構或數組所佔的空間,返回值跟對象、結構、數組所存儲的內容沒有關係。
具體而言,當參數分別如下時,sizeof返回的值表示的含義如下:
數組——編譯時分配的數組空間大小;
指針——存儲該指針所用的空間大小(存儲該指針的地址的長度,是長整型,應該爲4);
類型——該類型所佔的空間大小;
對象——對象的實際佔用空間大小;
函數——函數的返回類型所佔的空間大小。函數的返回類型不能是void。
**************
2)、strlen
strlen(...)是函數,要在運行時才能計算。參數必須是字符型指針(char*)。當數組名作爲參數傳入時,實際上數組就退化成指針了。
它的功能是:返回字符串的長度。該字符串可能是自己定義的,也可能是內存中隨機的,該函數實際完成的功能是從代表該字符串的第一個地址開始遍歷,直到遇到結束符NULL。返回的長度大小不包括NULL。
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;short (array[5])[2][3];
cout<<sizeof(array)<<" ";
cout<<sizeof(array[0])<<" ";
cout<<sizeof(array[0][0])<<" ";
cout<<sizeof(array[0][0][0])<<endl;
結果爲:60 12 6 2
7、linux內核中的鏈表與普通的鏈表有什麼區別
http://www.linuxidc.com/Linux/2011-09/43483.htm
內核鏈表是一個雙向鏈表,但是與普通的雙向鏈表又有所區別。內核鏈表中的鏈表元素不與特定類型相關,具有通用性。
kernel list展示的是內核鏈表的結構,normallist展示的是普通鏈表的結構。head是鏈表頭,p1,p2,p3是鏈表節點。從圖中可以看出普通鏈表的p1的next指針是指向的結構體p2的地址,p2的pre指針指向p1結構體的地址。而內核鏈表的p1的next指向的是p2結構體中包含pre和next部分的地址,的p2的pre指向的是p1結構體中包含pre和next部分的地址。依此類推,這就是區別。內核結構元素不與特定類型結構相關,任何結構體都可通過內核的添加成爲鏈表中的節點。
8、ARM指令集中的除法運算
http://www.xbgk.com/ComWeb/WebTpOne/Tech_Show.asp?Uid=Xb88888888&id=3071
在嵌入式軟件編程中,爲了節省CPU運行時間,應儘可能避免使用除法。對環形緩衝區的處理可以不用除法。如果不能避免除法運算,那麼應儘可能使用除法程序同時產生商n/d和餘數n%d的好處。對於重複對一除數d的除法.預先計算好s=(2k一1)/d,用乘以s的2k位乘法來代替除以d的k位無符號整數除法,可大大減少由於直接使用除法操作引入的指令週期數