當前位置:首頁 » 編程語言 » 創客c語言嵌入式開發舊版筆記
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

創客c語言嵌入式開發舊版筆記

發布時間: 2023-06-05 13:44:14

⑴ 嵌入式c語言重點知識點

嵌入式C語言重點知識點

嵌入式LINUX

嵌入式Linux 是將日益流行的Linux操作系統進行裁剪修改,使之能在嵌入式計算機系統上運行的一種操作系統。Linux做嵌入式的優勢,首先,Linux是開放源代碼;其次,Linux的內核小、效率高,可以定製,其系統內核最小隻有約134KB;第三,Linux是免費的OS,Linux還有著嵌入式操作系統所需要的很多特色,突出的就是Linux適應於多種CPU和多種硬體平台而且性能穩定,裁剪性很好,開發和使用都很容易。同時,Linux內核的結構在網路方面是非常完整的,Linux對網路中最常用的TCP/IP協議有最完備的支持。提供了包括十兆、百兆、千兆的乙太網絡,以及無線網路,Token Ring(令牌環網)、光纖甚至衛星的支持。

移植步驟:

1.Bootloader的移植;

2.嵌入式Linux操作系統內核的移植;

3.嵌入式Linux操作系統根文件系統的創建;

4.電路板上外設Linux驅動程序的編寫。

WinCE

WinCE是微軟公司嵌入式、移動計算平台的基礎,它是一個開放的、可升級的32位嵌入式操作系統,是基於掌上型電腦類的電子設備操作系統,它是精簡的Windows 95,Win CE的圖形用戶界面相當出色。WinCE是從整體上為有限資源的平台設計的多線程、完整優先權、多任務的操作系統。它的模塊化設計允許它對於從掌上電腦到專用的工業控制器的用戶電子設備進行定製。操作系統的基本內核需要至少200K的ROM。

一般來說,一個WinCE系統包括四層結構:應用程序、WinCE內核映像、板級支持包(BSP)、硬體平台。而基本軟體平台則主要由WinCE系統內核映像(OS Image)和板卡支持包(BSP)兩部分組成。因為WinCE系統是一個軟硬體緊密結合的系統,因此即使CPU處理器相同,但是如果開發板上的外圍硬體不相同,這個時候還是需要修改BSP來完成一個新的BSP。因此換句話說,就是WinCE的移植過程主要是改寫BSP的過程。

Android

Android 是一個包括操作系統,中間件以及一些重要應用程序的專門針對移動設備的層次結構的軟體集。Android 作為一個完全開源的.操作系統,是由操作系統Linux、中間件以及核心應用程序組成的軟體棧。通過 android SDK 提供的 API 以及相應的開發工具, 程序員可以很方便的開發android平台上的應用程序。其整個系統由應用程序,應用程序框架,應用程序庫,Android運行庫,Linux內核(Linux Kernel)五個部分組成。Android操作系統內置了一部分應用程序, 包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、通訊錄以及其他的程序,值得一提的是這些所有的程序都是用java編寫的。

移植的主要的工作是驅動,硬體抽象層的移植。為了更好地理解和調試系統,也應該適當地了解上層對硬體抽象層的調用情況。

TinyOS

TinyOS是一個開源的嵌入式操作系統,它是由加州大學的伯利克分校開發出來的,主要應用於無線感測器網路方面。程序採用的是模塊化設計,所以它的程序核心往往都很小,一般來說核心代碼和數據大概在400 Bytes左右,能夠突破感測器存儲資源少的限制。TinyOS提供一系列可重用的組件,一個應用程序可以通過連接配置文件(A Wiring Specification)將各種組件連接起來,以完成它所需要的功能。

嵌入式實時操作系統(RTOS)

在工業控制、 軍事設備、航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。當外界事件或數據產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致運行的嵌入式操作系統。故對嵌入式實時操作系統的理解應該建立在對嵌入式系統的理解之上加入對響應時間的要求。

FreeRTOS

FreeRTOS是一個迷你操作系統內核的小型嵌入式系統。作為一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量、消息隊列、內存管理、記錄功能等,可基本滿足較小系統的需要。FreeRTOS任務可選擇是否共享堆棧,並且沒有任務數限制,多個任務可以分配相同的優先權。相同優先順序任務的輪轉調度,同時可設成可剝奪內核或不可剝奪內核。

FreeRTOS 的移植主要需要改寫如下三個文件。

1.portmacro.h

2.port.c

3. port.asm

μTenux

μTenux基於ARM微控制器平台,對uT最適用於ARM Cortex M0-M4系列的微控制器,代碼開源、免費,是一個功能強大的搶占式實時多任務操作系統。μTenux除具有實時嵌入式操作系統的一般特性:可移植性,可固化,可裁剪等特性以外,它還具有如下優點:

(1)微內核。無MMU, ROM/RAM佔用量小,所佔ROM最大60KB,最小10KB;RAM最大12KB,最小2KB;

(2)開源免費;

(3)支持所有32位ARM7/9和Cortex M系列的微控制器;

(4)可配置多達到256個任務以及140個任務優先順序;

(5)有良好的商業支持, T-Engine論壇進行總的維護。

移植主要包括:晶元系統時鍾移植,外設移植和通用輸出/輸入埠的移植以及看門狗模塊移植。由於考慮到內核代碼的重要性以及其在整個移植中的重要意義,且為了整個系統有更好的實時性,可選用匯編語言編寫操作系統的啟動代碼。

VxWorks

VxWorks系統提供多處理器間和任務間高效的信號燈、消息隊列、管道、網路透明的套接字。實時系統的另一關鍵特性是硬體中斷處理。為了獲得最快速可靠的中斷響應,VxWorks系統的中斷服務程序ISR有自己的上下文。VxWorks實時操作系統由400多個相對獨立的、短小精煉的目標模塊組成,用戶可根據需要選擇適當模塊來裁剪和配置系統,這有效地保證了系統的安全性和可靠性。系統的鏈接器可按應用的需要自動鏈接一些目標模塊。這樣,通過目標模塊之間的按需組合,可得到許多滿足功能需求的應用。

移植過程可以參考網路上一些BSP代碼,BSP的英文全稱為board support package,即板級支持包,它的作用是針對特殊的硬體平台,為VxWorks內核提供操作的介面。

μClinux

嵌入式Linux作為一個開放源代碼的操作系統,以價格低廉、功能強大又易移植的特性正在被廣泛應用,μClinux是專門針對沒有MMU的處理器而設計的嵌入式Linux,非常適合中低端嵌入式系統的需求。 在GNU通用公共許可證的授權下,μClinux操作系統的用戶可以使用幾乎所有Linux的API函數,不會因為沒有內存管理單元MMU而受到影響;而且,μClinux在標準的Linux基礎上進行了適當的裁剪和優化,形成了一個高度優化的、代碼緊湊的嵌入式Linux,體積小了,但是仍然保留了Linux的大多數的優點,比如穩定性好、強大的網路功能、良好的可移植性、完備的文件系統支持功能、以及標准豐富的應用程序介面API等,可以支持類似ARM7TDMI等類型多的小巧玲瓏的中央處理器。

eCos

eCos中文翻譯為嵌入式可配置操作系統或嵌入式可配置實時操作系統。適合於深度嵌入式應用,主要應用對象包括消費電子、電信、車載設備、手持設備以及其他一些低成本和攜帶型應用。eCos是一種開發源代碼軟體,無任何版權費用。 eCos最大的特點是模塊化,內核可配置。如果說嵌入式Linux太龐大了,那麼eCos可能就能夠滿足要求。它是一個針對16位、32位和64位處理器的可移植開放源代碼的嵌入式RTOS。和嵌入式Linux不同,它是由專門設計嵌入式系統的工作組設計的。eCos具有相當豐富的特性和一個配置工具,後者能夠讓你選取你所需要的特性。

eCos的軟體分了若乾的模塊,移植工作主要在他的hal層進行,所謂hal(硬體抽象層)就是把和硬體相關的軟體湊到一起。

μC/OS-II

μC/OS-II是一個完整的、可移植、可固化、可裁剪的佔先式實時多任務內核。μC/OS-II絕大部分的代碼是用ANSI的C語言編寫的,包含一小部分匯編代碼,使之可供不同架構的微處理器使用。其結構小巧簡潔且支持搶占式的多任務調度與管理。此實時操作系統管理任務數多達64個,且提供內部程序存儲器管理、系統運行時間管理、多任務實時調度與管理等功能。由於它的作者佔用和保留了8個任務,所以留給用戶應用程序最多可有56個任務。賦予各個任務的優先順序必須是不相同的。這意味著μC/OS-II不支持時間片輪轉調度法。μC/OS-II為每個任務設置獨立的堆棧空間,可以快速實現任務切換。

將μC/OS-II操作系統移植到目標處理器上,需要從硬體和軟體兩方面來考慮。硬體方面,目標處理器需滿足以下條件:

①處理器的C編譯器能產生可重入代碼;

②用C語言可以開/關中斷;

③處理器支持中斷,並且能夠產生定時中斷(通常在10~1000 Hz之間);

④處理器能夠支持容納一定量數據的硬體堆棧;

⑤處理器有將堆棧指針和其他寄存器讀出和存儲到堆棧或內存中的指令。

軟體方面,主要是一些與處理器相關的代碼移植,其分布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM這3個不同的文件中。


⑵ 嵌入式Linux上的C語言編程實踐的目錄

第一部分 基礎知識
第1章 Linux環境下C語言的開發 2
1.1 Linux下的C語言開發環境 2
1.2 在Linux中使用C語言開發 3
1.2.1 開發流程和開發工具 3
1.2.2 Linux中程序的運行原理 4
第2章 嵌入式環境中的C語言開發 7
2.1 嵌入式C語言的開發環境 7
2.2 嵌入式開發中C語言編程要點 9
第二部分 Linux環境中
C語言的開發環境和工具
第3章 Linux的文本編輯工具VI 12
3.1 VI編輯器概述 12
3.1.1 VI簡介 12
3.1.2 VI的工作模式和使用
3.1.2 之前的准備 12
3.1.3 進入和退出VI 13
3.2 VI的增強版VIM 16
3.3 VI編輯器的基本使用方法 17
3.3.1 在屏幕上移動游標 17
3.3.2 插入文本 20
3.3.3 刪除文本 22
3.3.4 修改文本內容 25
3.3.5 替換文本內容 27
3.3.6 合並文本內容 30
3.3.7 移動文本內容 30
3.4 VI編輯器的命令和高級操作 32
3.4.1 VI常用命令的列表 32
3.4.2 VI的一些高級的操作和
3.1.2 使用技巧 35
第4章 GCC程序開發工具 39
4.1 GNU工具綜述 39
4.2 GCC的編譯和連接 43
4.2.1 工程示例 43
4.2.2 編譯、匯編和連接 46
4.2.3 動態庫 48
4.3 GCC的二進制工具 49
4.3.1 ar(歸檔工具) 49
4.3.2 readelf(讀取ELF格式
3.1.2 文件信息) 51
4.3.3 strings(查看字元串) 54
4.3.4 nm(顯示符號信息) 55
4.3.5 strip(刪除符號) 57
4.3.6 objmp(顯示目標
3.1.2 文件信息) 58
4.3.7 obj(復制目標文件) 63
第5章 make工程管理工具 67
5.1 make和Makefile 67
5.1.1 make機制概述 67
5.1.2 make和Makefile的使用 68
5.2 Makefile使用示例 69
5.2.1 簡單的Makefile 69
5.2.2 Makefile中的依賴關系 71
5.2.3 Makefile中使用隱含規則
3.1.2 來編譯程序 73
5.2.4 Makefile中指定依賴關系的
3.1.2 編譯 76
5.3 自動生成Makefile 78
5.3.1 自動生成Makefile的意義和
3.1.2 相關工具 78
5.3.2 自動生成Makefile的流程 79
第6章 GDB調試工具 85
6.1 GDB簡介 85
6.2 使用GDB調試程序 86
6.2.1 基本操作 88
6.2.2 查看命令 90
6.2.3 高級命令 92
6.2.4 attach命令的使用 94
6.3 遠程GDB調試 95
6.3.1 本地GDB調試和遠程GDB
3.1.2 調試的比較 95
6.3.2 遠程GDB調試流程 97
6.3.3 遠程GDB調試示例 98
第三部分 庫函數
第7章 C語言標准庫函數 106
7.1 ISO的C語言標准庫函數
7.1 分類 106
7.2 標准格式化輸入/輸出類函數 107
7.2.1 scanf函數:格式化輸入
3.1.2 字元串 107
7.2.2 printf函數:格式化輸出
3.1.2 字元串 109
7.2.3 putchar函數:輸出字元到
3.1.2 標准輸出 111
7.2.4 getchar函數:從標准輸入
3.1.2 獲取字元 111
7.2.5 putc函數:向文件輸出字元 112
7.2.6 getc函數:從文件輸入字元 112
7.2.7 gets函數:獲得字元串 112
7.2.8 puts函數:輸出指定字元串 113
7.2.9 ungetc函數:把字元
3.1.2 寫迴流中 113
7.3 字元處理類函數 114
7.4 字元串處理及轉換函數 116
7.4.1 sprintf函數:格式化輸出
3.1.2 字元串到一個緩沖區 116
7.4.2 strcat和strncat函數:
3.1.2 字元串連接 119
7.4.3 strcpy和strncpy函數:
3.1.2 字元串復制 120
7.4.4 strcmp和strncmp函數:
3.1.2 字元串比較 121
7.4.5 strlen函數:獲取字元串
3.1.2 長度 122
7.4.6 strchr和strrchr函數:字元/
3.1.2 字元串定位 122
7.4.7 strstr函數:字元串查找 123
7.4.8 strrev函數:字元串逆序 124
7.4.9 strupr和strlwr函數:字母
3.1.2 形式轉換 125
7.4.10 strp和strnp函數:
3.1.2 字元串復制 125
7.4.11 memset函數:內存設置 126
7.4.12 memmove函數:內存移動 126
7.4.13 memcmp函數:內存比較 127
7.4.14 memcpy函數:內存復制 128
7.5 數學計算類函數 128
7.6 數據結構和演算法類函數 133
7.6.1 bsearch函數:二元搜索 133
7.6.2 lfind函數:線性搜索 134
7.6.3 lsearch函數:線性搜索 135
7.6.4 qsort函數:利用快速排序法
3.1.2 排列數組 136
7.6.5 rand函數:產生隨機數 136
7.6.6 srand函數:設置隨機
3.1.2 數種子 137
7.7 文件I/O操作類相關函數 137
7.7.1 fopen函數:打開文件 138
7.7.2 fclose函數:關閉文件 139
7.7.3 fgetc函數:從文件中讀取
3.1.2 一個字元 139
7.7.4 fputc函數:將一指定字元
3.1.2 寫入文件流中 139
7.7.5 fgets函數:從文件中讀取
3.1.2 一字元串 140
7.7.6 fputs函數:將一指定的
3.1.2 字元串寫入文件內 140
7.7.7 rewind函數:重設文件流的
3.1.2 讀寫位置為文件開頭 141
7.7.8 ftell函數:取得文件流的
3.1.2 讀取位置 141
7.7.9 fseek函數:移動文件流的
3.1.2 讀寫位置 141
7.7.10 fwrite函數:將數據寫至
7.7.10 文件流 142
7.7.11 fread函數:從文件流讀取
7.7.10 數據 142
7.7.12 remove函數:刪除文件 143
7.7.13 rename函數:更改文件
7.7.10 名稱或位置 143
7.7.14 freopen函數:重新打開
7.7.10 文件 144
7.7.15 fflush函數:同步緩沖區 144
7.7.16 fgetpos函數:獲得文件
7.7.10 位置 145
7.7.17 fsetpos函數:設置文件
7.7.10 位置 145
7.7.18 mktemp函數:建立臨時
7.7.10 文件 146
7.7.19 tmpfile函數:臨時文件 146
7.7.20 tmpnam:得到臨時文件名 147
7.8 日期時間類函數 147
7.8.1 clock函數:獲得CPU時間 148
7.8.2 time函數:獲得當前日歷
7.8.2 時間 148
7.8.3 difftime函數:獲得時間
7.8.2 差值 148
7.8.4 gmtime函數:將日歷時間
7.8.2 轉換成UTC時間 149
7.8.5 mktime函數:將UTC時間
7.8.2 轉換成日歷時間 149
7.8.6 asctime函數:將UTC時間
7.8.2 轉換成字元串 149
7.8.7 ctime函數:將日歷時間轉換
7.8.2 成當地時間的字元串 150
7.8.8 localtime函數:將日歷時間
7.8.2 轉換成本地時間 150
7.8.9 strftime函數:轉換日期和
7.8.2 時間格式 151
7.9 國際化和本地化函數 152
7.9.1 setlocale函數:本地化控制
7.8.2 函數 153
7.9.2 localeconv函數:本地化
7.8.2 轉換 154
7.10 錯誤處理類函數 155
7.10.1 clearerr函數:清除流中的
7.10.1 結束指示符和錯誤指示符 155
7.10.2 feof函數:指示文件結束 155
7.10.3 ferror函數:指示文件出錯 156
7.10.4 perror函數:輸出出錯信息 156
7.10.5 errno函數:錯誤編號記錄 156
7.11 其他一些工具函數 157
7.11.1 assert函數:程序診斷 157
7.11.2 長跳轉函數 157
7.11.3 可變長的參數控制函數 160
7.11.4 獲取結構體成員函數
7.10.1 (宏) 161
7.12 一些標准庫中有用的宏 161
第8章 Linux中C語言的擴展庫
函數 163
8.1 文件I/O操作函數 163
8.1.1 open函數:打開文件 163
8.1.2 close函數:關閉文件 164
8.1.3 read函數:讀文件 165
8.1.4 write函數:寫文件 165
8.1.5 lseek函數:文件定位 167
8.1.6 ioctl函數:文件控制 167
8.1.7 flock函數:鎖定文件 167
8.1.8 mmap函數和munmap函數:
8.1.8 內存映射 168
8.1.9 create函數:創建新文件 170
8.1.10 p函數和p2函數:
8.1.10 復制文件描述符 171
8.1.11 fcntl函數:改變已打開的
8.1.10 文件的屬性 171
8.2 文件許可權相關的操作函數 172
8.2.1 access函數:判斷是否
8.2.1 具有存取文件的許可權 172
8.2.2 chown函數和fchown函數:
8.2.1 改變文件的所有者 173
8.2.3 chmod函數和fchmod函數:
8.2.1 改變許可權 173
8.2.4 unlink函數:刪除文件 173
8.2.5 utime函數和utimes函數:
8.2.1 改變文件時間 174
8.2.6 umask函數:設置建立
8.2.1 新文件時的許可權掩碼 175
8.2.7 link函數:建立文件連接 175
8.2.8 stat函數、fstat函數和lstat
8.2.1 函數:獲取文件信息 175
8.3 用戶組操作函數 176
8.3.1 getgid函數和setgid函數:
8.2.1 獲得/設置組識別碼 176
8.3.2 getegid函數和setegid函數:
8.2.1 獲得/設置有效的組識別碼 177
8.3.3 getuid函數和setuid函數:
8.2.1 獲得/設置真實的用戶識別碼 177
8.3.4 geteuid函數和seteuid函數:
8.2.1 獲得/設置有效的用戶識別碼 178
8.3.5 getgroups函數和setgroups
8.2.1 函數:獲得/設置組代碼 178
8.4 信號類函數 179
8.4.1 kill函數:傳送信號給指定的
8.2.1 進程 181
8.4.2 raise函數:信號發送函數 181
8.4.3 alarm函數:設置超時函數 182
8.4.4 signal函數:信號安裝函數 182
8.5 進程處理函數 183
8.5.1 getpid函數和getppid函數:
8.2.1 獲得進程ID和父進程ID 183
8.5.2 fork函數:建立子進程 183
8.5.3 sleep函數和usleep函數:
8.2.1 讓進程暫停執行一段時間 185
8.5.4 exec函數族:找到可執行
8.2.1 文件 185
8.5.5 _ exit函數和_Exit函數:
8.2.1 結束進程執行 188
第四部分 C語言高級編程
第9章 動態內存的堆與棧 190
9.1 程序內存區域的使用 190
9.1.1 靜態內存與動態內存 190
9.1.2 C語言中的動態內存 191
9.2 C程序中棧空間的使用 196
9.2.1 參數使用棧空間 196
9.2.2 自動變數使用棧空間 199
9.2.3 程序中較大的棧 201
9.2.4 棧空間的特性 202
9.3 C程序中的堆空間使用 203
9.3.1 分配和釋放堆內存的庫函數 203
9.3.2 庫函數使用 204
9.3.3 堆內存的特性 218
9.4 堆內存和棧內存使用的比較 222
9.4.1 利用返回值傳遞信息 222
9.4.2 利用參數傳遞信息 226
9.4.3 堆與棧內存管理的區別 231
第10章 函數指針的使用 232
10.1 函數指針的概念 232
10.1.1 C語言函數的本質 232
10.1.2 函數指針在C語言中的
10.1.2 意義 234
10.2 函數指針的使用 237
10.2.1 函數指針使用初步 237
10.2.2 函數指針的類型定義 240
10.2.3 函數指針作為結構體成員 242
10.2.4 函數指針作為函數的參數 243
10.2.5 函數指針作為函數的
10.2.5 返回值 244
10.2.6 函數指針數組 246
10.3 函數指針使用示例 248
第11章 回調函數的使用 252
11.1 回調函數的概念與作用 252
11.1.1 程序調用的方式 252
11.1.2 回調函數的作用 254
11.2 回調函數的語法 254
11.2.1 簡單的回調函數 254
11.2.2 完全形式的回調函數 256
11.3 回調函數的使用 259
11.3.1 qsort中的回調函數 259
11.3.2 atexit和on_exit函數的
10.2.5 注冊退出函數 263
第12章 C語言實現對象編程 268
12.1 C語言實現基於對象編程的
12.1 概念與作用 268
12.2 C語言基於對象編程實現
12.1 封裝 269
12.2.1 簡單的程序示例 269
12.2.2 C語言基於對象編程的
10.2.5 詳解 272
12.2.3 C語言基於對象編程與
10.2.5 C++面向對象編程的對比 275
12.3 C語言基於對象編程實現
12.3 部分繼承功能 278
12.3.1 利用數據結構的包含實現
10.2.5 繼承功能 279
12.3.2 利用私有指針實現繼承
10.2.5 功能 282
12.3.3 C語言實現繼承的總結 287
12.4 C語言基於對象編程實現
12.4 部分多態功能 288
12.4.1 利用操作指針組的包含
10.2.5 實現多態功能 288
12.4.2 C語言實現多態功能的總結 292
12.5 對C語言實現基於對象
12.5 編程的思考 292
12.5.1 C語言基於對象編程的
10.2.5 特性 292
12.5.2 C語言基於對象編程中介面、
10.2.5 實現和調用者的關系 293
第五部分 在嵌入式
環境下的C語言編程
第13章 C語言程序的內存布局 295
13.1 C語言程序的存儲區域 295
13.2 C語言程序的段 297
13.2.1 段的分類 297
13.2.2 程序中段的使用 298
13.3 可執行程序的連接 301
13.3.1 可執行程序的組成 301
13.3.2 各個目標文件的關系 303
13.3.3 連接錯誤示例 304
13.4 C語言程序的運行 309
13.4.1 RAM調試運行 311
13.4.2 固化程序的XIP運行 312
13.4.3 固化程序的載入運行 313
13.4.4 C語言程序的運行總結 315
第14章 嵌入式C語言常用語法 317
14.1 內存指針操作 317
14.1.1 內存操作的意義 317
14.1.2 使用指針操作內存 319
14.1.3 volatile的使用 324
14.1.4 嵌入式系統指針的實際
10.2.5 應用 325
14.2 位操作 327
14.2.1 位操作的意義 327
14.2.2 位操作的語法 328
14.3 大小端與對齊問題 330
14.3.1 大小端問題 331
14.3.2 內存對齊問題 335
14.3.3 結構體成員的對齊問題 338
14.4 程序的跳轉 344
14.4.1 嵌入式系統程序跳轉的
10.2.5 類型 344
14.4.2 C語言中實現程序的跳轉 345
第15章 嵌入式C語言編程的技巧 348
15.1 程序的優化技巧 348
15.1.1 循環緩沖區 348
15.1.2 查表法 350
15.1.3 針對循環執行效率的
10.2.5 優化 353
15.2 關於小數運算 355
15.3 函數參數和返回值的傳遞 357
15.4 變數的初始化技巧 360
15.4.1 數組的初始化 360
15.4.2 結構體的初始化 362
15.4.3 變數的初始化總結 362
15.5 程序的調試和宏使用的技巧 363
15.5.1 列印文件、函數和程序行 363
15.5.2 #:字元串化操作符 364
15.5.3 ##:連接操作符 366
15.5.4 調試宏的第一種定義方式 367
15.5.5 調試宏的第二種定義方式 368
15.5.6 對調試語句進行分級審查 369
15.5.7 條件編譯調試語句 370
15.5.8 使用do…while的宏定義 372
15.6 代碼剖析 373
參考文獻 378

⑶ C語言和嵌入式C語言有什麼區別

嵌入式C語言和C語言是完全一樣的,寫代碼上完全沒有區別。

區別在於嵌入式的C語言是跑在嵌入式的開發板上的,CPU和我們電腦不一樣,所以編譯器也是不一樣的,生成的可執行程序也是不一樣的。

學習嵌入式,該學習什麼基本的知識呢?

首先C語言,這個是毋庸置疑的,不管是做嵌入式軟體還是硬體開發的人員,對C語言的掌握這個是必需的,特別是對於以後致力於嵌入式軟體開發的人,現在絕大部分都是用C語言,你說不掌握它可以嗎?至於如何學習C語言,我想這些基礎的知識每個人都有自己的方法,關鍵要去學習,看書也好,網上找些視頻看也好。很多人會問,C語言要學到怎麼樣,我覺得這沒有標準的答案。我想至少你在明白了一些基礎的概念後,就該寫代碼了,動手才是最重要的,當你動手了,遇到問題了,再反過來學習,反過來查查課本,那時的收獲就不是你死看書能得到的。

其次,應該對操作系統有所了解,這對你對硬體和軟體的理解,絕對有很大的幫助。應該把系統的管理理解一下,比如進程、線程,系統如何來分配資源的,系統如何來管理硬體的,當然,不是看書就能把這些理解透,如果不是一時能理解,沒關系,多看看,結合以後的項目經驗,會有更好的理解的。

還有應該學習嵌入式系統,如linux或者wince下的編程,這些對以後做應用的編程很有幫助,當然,如果做手機的話,那可以學習MTK、塞班、Android等操作系統,Android是以後發展的趨勢,現在很熱門,Android也是基於linux系統封裝的,所以建議先學習下linux。

還有,應該學習下單片機或者ARM或者MIPS,很多人說我沒有單片機的經驗,直接學ARM可以嗎?我覺得那完全沒有問題的,當然如果你學習過單片機,那最好不過了,以後學習ARM就更簡單了。

最後如果你把以上的知識都有所了解後,就該去閱讀閱讀一些優秀的代碼,比如結合arm晶元手冊學習去學習下UBOOT的源代碼,了解下最小的系統開發,那對你整個嵌入式開發的非常有幫助的,可以的話,還可以學習下linux的源代碼,當然如果你直接閱讀2.6的代碼,我想你會很痛苦的,可以先看看linux 代碼早期的版本,比如0.12 的代碼等等,麻雀雖小,五臟俱全,如果你全看完了,那我想你就是一名很成功的嵌入式工程師。

至於上面說的知識如何學習呢?每個人都應該去找自己最好的方法,所謂的最好的方法就是最適合自己的方法。很多人看不進書,那就去看看視頻吧。視頻也應該要選擇,不是隨便看看,應該要有所選擇,有所挑選。我也是這樣一路走過來的,不過我這人比較懶,我看不進書,一看書我就想睡覺,所以這幾年我都是看視頻過來的,現在也算學有所成,但也不敢說是高手吧。

我在網上看到,有人把自己學習嵌入式的視頻總結出來,嵌入式系列實踐和視頻教程,大家可以看看網址 我仔細看了覺得很不錯,我本來也想整理下,可是奈何我自己的電腦硬碟空間才40G,沒有辦法,時間也是不夠,心有餘而力不足,我不是在幫他做廣告,雖然要花錢,我覺得算不錯,至少自己不用去整理和花大量的時間去找資源,當然如果網上有的下,你網速和硬碟都夠的話,我建議大家自己網上下也好。想想我自己該開始學的時候,那時視頻資源少之又少,我買書和買視頻至少花了幾千塊,但是我覺得那很值,至少我現在賺回來了很多知識。

最後,希望這篇文章對熱愛嵌入式,想致力於嵌入式開發的朋友有所幫助。送給大家一句簡單而又樸素的話,堅持就是勝利,貴在堅持,也可以看看如何堅持嵌入式學習

⑷ 嵌入式開發需要學什麼

嵌入式開發要學哪些?在這個技術瞬息萬變的年代,嵌入式技術毫無疑問也得緊跟技術發展,這對於初涉行業的新人而言,擺在面前的問題很明顯,嵌入式開發我得學習哪些技術點才能跟隨企業的腳步呢?我願意談談我接近十年對嵌入式開發的看法。
我的職業生涯起步於嵌入式開發,那時候在日企從事汽車的嵌入式開發,最後也曾當過三年的講師。不過現在依然混跡於嵌入式底層,以及android底層研發。可能還是覺得研發才是我的最愛。那麼針對嵌入式開發要學哪些我簡單的說一下,僅代表當前主流觀點。
嵌入式開發作為新人,第一步C語言,有很多人自認為自己C語言很厲害,但是實際上一個從事嵌入式開發的老人,至少需要3-5年你才敢對C語言說精通,特別涉及到的常用的指針、數組、數據類型、運算符與表達式、控制語句時?你真的都懂么?這些是學習嵌入式最基礎的知識。
第二步,有了這些代碼的基礎你才能能根據需求寫程序,也就是常說的應用層,應用層是相對簡單的。要有理解和編碼調試的能力,如系統編程、標準的I/O,文件I/O,庫的製作等等。一般而言這種應用層開發有1-2個月的時間都能學會。剩下的就是大量的編碼來提升自己的經驗。但只會這些也能找到工作,但我相信你看完下面的發現那絕對不是你的夢想!
第三步,更高級的內容也是最難的內容,前兩步更多是讓你會根據需求編碼,但是如何能讓你的程序能在硬體平台上運行,這才是真正的難題。所以每當再進一步的話,我們會發現我們什麼有很多的東西都運行的是Linux系統,可是他們和我的PC運行的Linux有什麼區別呢,為什麼我電腦要用風扇而手機不用風扇呢,我們打開網頁查找手機的詳細參數的時候,會看到Cortex-A15
、四核
、ARM等等字眼,什麼是ARM,什麼是Cortex-A15,這需要進一步的了解。
了解完ARM之後,就需要利用開發板了。這時操作系統的移植又成了一個比較重要的內容了,什麼是bootloader,什麼是kernel,什麼是rootfs等等……。
花了很長時間系統做好了,發現板子上很多的什麼不能用,怎麼辦呢?這時我們需要寫一些驅動來驅動這些設備,這時我們需要知道,什麼是字元設備驅動、塊設備驅動、網路設備驅動,為了更好的寫驅動我們需要了解更多的硬體相關的東西,我們需要看懂晶元手冊,我們需要看懂原理圖,只有我們懂我們的設備,才能更好的驅動它。等等,這里就列舉更多的內容了,因為還有很多。
所以對於嵌入式開發者來說,他們都經歷了學習的痛苦。有句話說的好,不經歷風雨怎麼見彩虹。對於學習嵌入式我比較不贊成自學,他不同於一般的應用層開發。你會面臨很多問題。問網路?太慢了!來機構學習雖然花了一部分錢,從時間成本和效率上來講,無疑還是比較值得的。

⑸ 嵌入式開發要學哪些課程

嵌入式開發的必學課程:C語言,C++,操作系統,計算機組成原理,linux編程,51單片機,arm,硬體編程語言,模擬電路&數字電路。
嵌入式培訓分幾個階段的學習,從基礎到實戰的練習,一點一點學習和掌握這門技術。學習的課程內容包含:嵌入式高級C語言、嵌入式設備及GUI開發、嵌入式Linux高級程序設計、Linux高級網路程序設計、資料庫開發、面向對象高級語言程序設計、物聯網、CotexA53 Linux平台驅動開發及真實的企業實戰項目。
想要學好嵌入式技術,嵌入式軟體開發工程師,從事領域很寬泛,特別是工業控制、消費電子與通信設備三大領域,因為就業面很大,所以人才需求也大。現在智能硬體也比較火,這方面的發展也會大大拓展嵌入式軟體開發工程師的就業機會。再者,嵌入式硬體工程師,需求沒有嵌入式軟體開發工程師大,但因為做硬體門檻會高些,所以這個方向如果做的比較專業,薪資絕對不會低。

⑹ c語言和嵌入式c語言有什麼區別

嵌入式C語言和C語言是完全一樣的,寫代碼上完全沒有區別。下面由卓躍教育為您介紹它們兩者間的區別。
區別在於嵌入式的C語言是跑在嵌入式的開發板上的,CPU和我們電腦不一樣,所以編譯器也是不一樣的,生成的可執行程序也是不一樣的。
首先C語言,這個是毋庸置疑的,不管是做嵌入式軟體還是硬體開發的人員,對C語言的掌握這個是必需的,特別是對於以後致力於嵌入式
後,就該寫代碼了,動手才是最重要的,當你動手了,遇到問題了,再反過來學習,反過來查查課本,那時的收獲就不是你死看書能得到的。
其次,應該對操作系統有所了解,這對你對硬體和軟體的理解,絕對有很大的幫助。應該把系統的管理理解一下,比如進程、線程,系統
驗,會有更好的理解的。
還有應該學習嵌入式系統,如linux或者wince下的編程,這些對以後做應用的編程很有幫助,當然,如果做手機的話,那可以學習MTK、塞
班、Android等操作系統,Android是以後發展的趨勢,現在很熱門,Android也是基於linux系統封裝的,所以建議先學習下linux。
還有,應該學習下單片機或者ARM或者MIPS,很多人說我沒有單片機的經驗,直接學ARM可以嗎?我覺得那完全沒有問題的,當然如果你學
習過單片機,那最好不過了,以後學習ARM就更簡單了。
最後如果你把以上的知識都有所了解後,就該去閱讀閱讀一些優秀的代碼,比如結合arm晶元手冊學習去學習下UBOOT的源代碼,了解下最
小的系統開發,那對你整個嵌入式開發的非常有幫助的,可以的話,還可以學習下linux的源代碼,當然如果你直接閱讀2.6的代碼,我想你會
很痛苦的,可以先看看linux代碼早期的版本,比如0.12的代碼等等,麻雀雖小,五臟俱全,如果你全看完了,那我想你就是一名很成功的嵌入式工程師。
最後,希望這篇文章對熱愛嵌入式,想致力於嵌入式開發的朋友有所幫助。