嵌入式軟件開發 必須掌握的知識點(二)

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位無符號整數除法,可大大減少由於直接使用除法操作引入的指令週期數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章