久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

嵌入式高手修煉之路,看完感覺要瘋了

 冬城溪酒之秦文 2017-09-27

第一部分:Linux平臺搭建與環(huán)境熟悉  


了解linux系統(tǒng),;區(qū)分各種版本的Linux系統(tǒng),,以便于拓展 Linux視野。
1,、Linux 簡介,;
2、Linux 系統(tǒng)的主要特點,;
3、Linux 的組成,;
4,、主要的 Linux 版本;
5,、嵌入式 Linux簡介與發(fā)展


第二部分虛擬機安裝和LINUX系統(tǒng)安裝  


1,、虛擬機安裝;
2,、Linux系統(tǒng)的安裝,;
3、Linux系統(tǒng)的常用軟件的安裝;
4,、Linux快速入門
5,、 熟悉運用 Linux環(huán)境下,常用命令的操作與系統(tǒng)設置,,如常用的 Shell,;掌握基本的 Shell 應用


第三部分:嵌入式LINUX環(huán)境搭建  


1、  建立嵌入式 Linux開發(fā)環(huán)境
2,、  熟悉嵌入式開發(fā)平臺
3,、  嵌入式 Linux開發(fā)工具
4、   Linux下的調試技巧
5,、  MAKE工程管理器
6,、  硬件環(huán)境的搭建;arm-linux-gcc與 gcc安裝配置


第四部分: U-Boot: 了解 U-Boot 的作用及工作流程,;了解Bootloader 的代碼結構,、編譯過程;移植U-Boot,;掌握常用的U-Boot命令。  


1,、  Bootloader介紹
2,、  u-boot工程介紹
3、  u-boot的編譯使用
4,、  u-boot源碼分析
5,、  u-boot資源分配
6、  配置編譯u-boot
7,、  u-boot移植過程
8,、  u-boot常用命令操作
9、  添加u-boot新命令
10,、設置u-boot環(huán)境變量
11,、 u-boot驅動添加如網卡:DM9000


第五部分:LINUX內核移植:熟悉內核的原碼結構和kbuild Makefile語法;掌握和內核,、驅動模塊編譯相關的原理及方法,。


1、Linux內核介紹
2,、Linux內核特點

3,、Linux內核源代碼結構
4、Linux內核選項解析
5,、Linux內核編譯鏈接
6,、內核模塊編譯、使用方法


第六部分:LINUX根文件系統(tǒng)


1,、busybox 包移植,、編譯
2,、Linux跟文件系統(tǒng)制作過程
3、根文件系統(tǒng)介紹
4. nfs文件服務器系統(tǒng)搭建


第七部分:LINUX驅動開發(fā)


驅動開發(fā)是嵌入式Linux開發(fā)難度最高的內容,,也是目前嵌入式行業(yè)最緊缺的人才之一,。本課程介紹嵌入式Linux驅動開發(fā)相關概念及開發(fā)流程,了解驅動開發(fā)的關鍵技術點,,重點講解嵌入式Linux下常用接口驅動的編寫方法,,包括
1、字符型LED驅動開發(fā)(GPIO口驅動)
2,、按鍵驅動開發(fā)(中斷驅動,,在驅動中中斷程序的編寫,消息隊列的應用
3,、ADC驅動開發(fā)
4,、網卡驅動開發(fā)
5、串口驅動開發(fā)
6,、液晶屏(TFT彩屏驅動開發(fā)
7,、觸摸屏驅動+tslib(中間插件移植與設置),
8,、USB驅動開發(fā)+USB無線網卡移植
9,、IIS驅動開發(fā)+maplay移植與應用(mp3播放)+mplayer移植與應用(視頻播放Mp4/廣告機等播放)
10、SD驅動開發(fā)
11,、RTC驅動開發(fā)
12,、電源管理方法


第八部分:LINUX應用學習


嵌入式Linux應用開發(fā)和系統(tǒng)開發(fā)是嵌入式Linux中最重要的一部分,也是企業(yè)人才需求最廣的一部分,。主要目標是精通嵌入式Linux下的程序設計,,熟練掌握嵌入式Linux的開發(fā)環(huán)境、系統(tǒng)編程以及網絡編程,,熟悉C++,、QT編程并且深刻體會整個嵌入式Linux項目開發(fā)流程,強化學員對Linux應用開發(fā)的能力.


1,、Linux系統(tǒng)中的進程的概念,,在應用程序中線程與父子進程的創(chuàng)建與應用
2、線程之間,、進程之間的通信
3,、進程間通信基本概念
4、管道(PIPE)
5,、信號(SIGNAL)
6,、內存映射(MAPPED MEMORY)
7、消息隊列(MESSAGE QUEUE)
8、信號量(SEMAPHORE)
9,、共享內存(SHARE MEMORY)@
10,、tcPip協(xié)議在應用程序中的編程開發(fā)(SOCKET套接字編程開發(fā))
10.1. ISO/OSI七層協(xié)議模型與IP網絡四層模式
10.2.TCP/IP協(xié)議簇
10.3. 基于嵌入式Linux的TCP/IP網絡結構
10.4. 基于嵌入式Linux的SOCKET編程
10..5.UDP與TCP的區(qū)別
10.6. UDP SERVER-CLIENT關系程
11、文件讀寫與存儲


第九部分:QT移植與開發(fā)


了解嵌入式Linux下的幾種常見GUI及其特點,,重點能掌握QT的有關內容,,具備QT程序設計能力。了解嵌入式數據庫的配置與開發(fā)

1 ,、嵌入式Linux GUI介紹
2,、嵌入式QT開發(fā)包移植
3、QT介紹及其信號插槽機制
4,、 QT圖形界面編程技術
5,、QT應用程序與Linux驅動的銜接
6、 QT在實際項目中具體應用


第十部分:無線通訊應用


1,、無線wifi模塊應用
2,、3G模塊應用


第十一部分:嵌入式系統(tǒng)應用程序,驅動程序調試


1,、Linux基本工具調試使用,。GDB,insight調試等
2,、Linux應用程序的編程
3,、嵌入式產品程序打包與發(fā)布


第十二部分:嵌入式項目綜合調試,產品發(fā)布


了解真實項目的開發(fā)流程,,掌握如何將所學知識應用到項目開發(fā)中,。將模擬真實項目的管理過程,,培養(yǎng)學員項目團隊協(xié)同開發(fā)能力,,項目文檔編寫能力和新知識的學習能力,為下一步就業(yè)做好知識上和心理上的充分準備,。




嵌入式LININX開發(fā) 3 階段


1,、嵌入式LININX開發(fā)第一學習階段,主要打好基礎,,學好C編程,,Linux系統(tǒng)編程。


1,、C語言編程基礎
2,、嵌入式開發(fā)基礎:Linux概述安裝,shell命令,,vim編輯器,,GCC,GDB,Makefile,交叉開發(fā)環(huán)境構建
3、嵌入式Linux系統(tǒng)編程:shell編程,,文件編程,,串口編程,進程編程,,線程編程,,網絡編程
4、嵌入式項目開發(fā):數據采集控制系統(tǒng),,串口服務器


2,、嵌入式LININX開發(fā)第二學習階段,掌握ARM匯編程序設計,,驅動程序設計,。


1、ARM體系結構:ARM體系,,ARM指令,,Thumb指令,匯編程序設計,,邏輯程序開發(fā)

2,、Linux內核移植:bootloader,內核配置,,文件系統(tǒng)

3,、驅動程序開發(fā):驅動架構模型,字符設備驅動,,塊設備驅動,,網絡驅動

4、嵌入式項目開發(fā):智能家居系統(tǒng),,視頻監(jiān)控系統(tǒng)


3,、嵌入式LININX開發(fā)第三學習階段,掌握C++面向對象程序設計,,Qt編程,。


1、C++語言編程基礎

2,、QT編程開發(fā):QT開發(fā)基礎,,QT布局與控件,QT繪圖,,QT事件,,QT網絡通信,QT數據庫,,QT移植

3,、嵌入式項目開發(fā):車載監(jiān)控管理系統(tǒng),,工業(yè)能源管理系統(tǒng)


嵌入式設計應具備的基本技能


1、Linux 基礎

安裝Linux操作系統(tǒng) Linux文件系統(tǒng) Linux常用命令 Linux啟動過程詳解 熟悉Linux服務能夠獨立安裝Linux操作系統(tǒng) 能夠熟練使用Linux系統(tǒng)的基本命令 認識Linux系統(tǒng)的常用服務安裝Linux操作系統(tǒng) Linux基本命令實踐 設置Linux環(huán)境變量 定制Linux的服務 Shell 編程基礎使用vi編輯文件 使用Emacs編輯文件 使用其他編輯器


2,、Shell 編程基礎

Shell簡介 認識后臺程序Bash編程熟悉Linux系統(tǒng)下的編輯環(huán)境 熟悉Linux下的各種Shell 熟練進行shell編程熟悉vi基本操作 熟悉Emacs的基本操作 比較不同shell的區(qū)別 編寫一個測試服務器是否連通的shell腳本程序 編寫一個查看進程是否存在的shell腳本程序 編寫一個帶有循環(huán)語句的shell腳本程序


3,、Linux 下的 C 編程基礎

linux c語言環(huán)境概述 Gcc使用方法 Gdb調試技術 AutoconfAutomake Makefile 代碼優(yōu)化 熟悉Linux系統(tǒng)下的開發(fā)環(huán)境 熟悉Gcc編譯器 熟悉Makefile規(guī)則編寫Hello,World程序 使用 make命令編譯程序 編寫帶有一個循環(huán)的程序 調試一個有問題的程序


4、嵌入式系統(tǒng)開發(fā)基礎

嵌入式系統(tǒng)概述 交叉編譯 配置TFTP服務 配置NFS服務 下載Bootloader和內核 嵌入式Linux應用軟件開發(fā)流程熟悉嵌入式系統(tǒng)概念以及開發(fā)流程 建立嵌入式系統(tǒng)開發(fā)環(huán)境制作cross_gcc工具鏈 編譯并下載U-boot 編譯并下載Linux內核 編譯并下載Linux應用程序


5,、嵌入式系統(tǒng)移植

Linux內核代碼 平臺相關代碼分析 ARM平臺介紹 平臺移植的關鍵技術 移植Linux內核到 ARM平臺 了解移植的概念 能夠移植Linux內核移植Linux2.6內核到 ARM9開發(fā)板


6,、嵌入式 Linux 下串口通信

串行I/O的基本概念 嵌入式Linux應用軟件開發(fā)流程 Linux系統(tǒng)的文件和設備 與文件相關的系統(tǒng)調用 配置超級終端和MiniCOM 能夠熟悉進行串口通信 熟悉文件I/O 編寫串口通信程序 編寫多串口通信程序


7、嵌入式系統(tǒng)中多進程程序設計

Linux系統(tǒng)進程概述 嵌入式系統(tǒng)的進程特點 進程操作 守護進程 相關的系統(tǒng)調用了解Linux系統(tǒng)中進程的概念 能夠編寫多進程程序編寫多進程程序 編寫一個守護進程程序 sleep系統(tǒng)調用任務管理,、同步與通信Linux任務概述任務調度 管道 信號 共享內存 任務管理 API 了解Linux系統(tǒng)任務管理機制 熟悉進程間通信的幾種方式 熟悉嵌入式Linux中的任務間同步與通信編寫一個簡單的管道程序實現文件傳輸 編寫一個使用共享內存的程序


8,、嵌入式系統(tǒng)中多線程程序設計

線程的基礎知識 多線程編程方法 線程應用中的同步問題了解線程的概念 能夠編寫簡單的多線程程序編寫一個多線程程序


9、嵌入式 Linux 網絡編程

網絡基礎知識 嵌入式Linux中TCP/IP網絡結構 socket 編程 常用 API函數 分析Ping命令的實現 基本UDP套接口編程 許可證管理 PPP協(xié)議 GPRS 了解嵌入式Linux網絡體系結構 能夠進行嵌入式Linux環(huán)境下的socket 編程 熟悉UDP協(xié)議,、PPP協(xié)議 熟悉GPRS 使用socket 編寫代理服務器 使用socket 編寫路由器編寫許可證服務器 指出TCP和UDP的優(yōu)缺點 編寫一個web服務器 編寫一個運行在 ARM平臺的網絡播放器


10,、GUI 程序開發(fā)

GUI基礎 嵌入式系統(tǒng)GUI類型 編譯QT 進行QT開發(fā)熟悉嵌入式系統(tǒng)常用的GUI 能夠進行QT編程使用QT編寫“Hello,World”程序 調試一個加入信號/槽的實例 通過重載QWidget 類方法處理事件


11,、Linux 字符設備驅動程序

設備驅動程序基礎知識 Linux系統(tǒng)的模塊 字符設備驅動分析 fs_operation結構 加載驅動程序了解設備驅動程序的概念 了解Linux字符設備驅動程序結構 能夠編寫字符設備驅動程序編寫Skull驅動 編寫鍵盤驅動編寫I/O驅動 分析一個看門狗驅動程序 對比Linux2.6內核與2.4內核中字符設備驅動的不同Linux 塊設備驅動程序塊設備驅動程序工作原理 典型的塊設備驅動程序分析 塊設備的讀寫請求隊列了解Linux塊設備驅動程序結構 能夠編寫簡單的塊設備驅動程序比較字符設備與塊設備的異同 編寫MMC卡驅動程序 分析一個文件系統(tǒng) 對比Linux2.6內核與2.4內核中塊設備驅動的不同


12,、文件系統(tǒng)

虛擬文件系統(tǒng) 文件系統(tǒng)的建立 ramfs內存文件系統(tǒng) proc文件系統(tǒng) devfs 文件系統(tǒng) MTD技術簡介 MTD塊設備初始化 MTD塊設備的讀寫操作了解Linux系統(tǒng)的文件系統(tǒng) 了解嵌入式Linux的文件系統(tǒng) 了解MTD技術 能夠編寫簡單的文件系統(tǒng)為 ARM9開發(fā)板添加 MTD支持 移植JFFS2文件系統(tǒng) 通過proc文件系統(tǒng)修改操作系統(tǒng)參數 分析romfs 文件系統(tǒng)源代碼 創(chuàng)建一個cramfs 文件系統(tǒng)


資深大牛有話說:嵌入式編程的復雜性


能從PC機器編程去看嵌入式問題,那是第一步;學會用嵌入式編程思想,,那是第二步;用PC的思想和嵌入式的思想結合在一起,,應用于實際的項目,那是第三步,。很多朋友都是從PC編程轉向嵌入式編程的,。在中國,嵌入式編程的朋友很少是正兒八經從計算機專業(yè)畢業(yè)的,,都是從自動控制啊,,電子相關的專業(yè)畢業(yè)的。這些童鞋們,,實踐經驗雄厚,,但是理論知識缺乏;計算機專業(yè)畢業(yè)的童鞋很大一部分去弄網游、網頁這些獨立于操作系統(tǒng)的更高層的應用了,。也不太愿意從事嵌入式行業(yè),,畢竟這條路不好走,。他們理論知識雄厚,,但缺乏電路等相關的知識,在嵌入式里學習需要再學習一些具體的知識,,比較難走,。

雖然沒有做過產業(yè)調查,但從我所見和所招聘人員,,從事嵌入式行業(yè)的工程師,,要么缺乏理論知識,,要么缺乏實踐經驗。很少兩者兼?zhèn)涞?。究其原因,,還是中國的大學教育的問題。這里不探討這個問題,,避免口水戰(zhàn),。我想列出我實踐中的幾個例子。引起大家在嵌入式中做項目時對一些問題的關注,。


第一個問題


同事在uC/OS-II下開發(fā)一個串口的驅動程序,,驅動和接口在測試中均為發(fā)現問題。應用中開發(fā)了個通訊程序,,串口驅動提供了一個查詢驅動緩沖區(qū)字符的函數:GetRxBuffCharNum(),。 高層需要接受一定數量的字符以后才能對包做解析。一個同事撰寫的代碼,,用偽代碼表示如下:


bExit = FALSE;
do {
if (GetRxBuffCharNum() >= 30)
bExit = ReadRxBuff(buff, GetRxBuffCharNum());
} while (!bExit);

這段代碼判斷當前緩沖區(qū)中超過30個字符,,就將緩沖區(qū)中全部字符讀到緩沖區(qū)中,直到讀取成功為止,。邏輯清楚,,思路也清楚。但這段代碼是不能正常工作,。如果是在PC機上,,定然是沒有任何問題,工作的異常正常,。但在嵌入式里真的是不得而知了,。同事很郁悶,不知道為什么,。來請我解決問題,,當時我看到代碼,就問了他,,GetRxBuffCharNum()是怎么實現的?打開一看:


unsigned GetRxBuffCharNum(void)
{
cpu_register reg;
unsigned num;
reg = interrupt_disable();
num = gRxBuffCharNum;
interrupt_enable(reg);
return (num);
}


很明顯,,由于在循環(huán)中,interruput_disable()和interrupt_enable()之間是個全局臨界區(qū)域,,保證gRxBufCharNum的完整性,。但是,由于在外層的do { } while() 循環(huán)中,,CPU頻繁的關閉中斷,,打開中斷,這個時間非常的短,。實際上CPU可能不能正常的響應UART的中斷,。當然這和uart的波特率,、硬件緩沖區(qū)的大小還有CPU的速度都有關系。我們使用的波特率非常高,,大約有3Mbps,。uart起始信號和停止信號占一個比特位。一個字節(jié)需要消耗10個周期,。3Mbps的波特率大約需要3.3us傳輸一個字節(jié),。3.3us能執(zhí)行多少個CPU指令呢?100MHz的ARM,大約能執(zhí)行150條指令左右,。結果關閉中斷的時間是多長呢?一般ARM關閉中斷都需要4條以上的指令,,打開又有4條以上的指令。接收uart中斷的代碼實際上是不止20條指令的,。所以,,這樣下來,就有可能出現丟失通信數據的Bug,,體現在系統(tǒng)層面上,,就是通信不穩(wěn)定。

修改這段代碼其實很簡單,,最簡單的辦法是從高層修改,。即:


bExit = FALSE;
do {
DelayUs(20); //延時 20us,一般采用空循環(huán)指令實現
num = GetRxBuffCharNum();
if (num >= 30)
bExit = ReadRxBuff(buff, num);
} while (!bExit);


這樣,,讓CPU有時間去執(zhí)行中斷的代碼,,從而避免了頻繁關閉中斷造成的中斷代碼執(zhí)行不及時,產生的信息丟失,。在嵌入式系統(tǒng)里,,大部分的RTOS應用都是不帶串口驅動。自己設計代碼時,,沒有充分考慮代碼與內核的結合,。造成代碼深層次的問題。RTOS之所以稱為RTOS,,就是因為對事件的快速響應;事件快速的響應依賴于CPU對中斷的響應速度,。驅動在Linux這種系統(tǒng)中都是與內核高度整合,一起運行在內核態(tài),。RTOS雖然不能抄襲linux這種結構,,但有一定的借鑒意義。


從上面的例子可以看清楚,,嵌入式需要開發(fā)人員對代碼的各個環(huán)節(jié)需要了解清楚,。


第二個例子


同事驅動一個14094串轉并的芯片,。串行信號是采用IO模擬的,,因為沒有專用的硬件,。同事就隨手寫了個驅動,結果調試了3,、4天,,仍舊是有問題。我實在看不下去了,,就去看了看,,控制的并行信號有時候正常有時候不正常。我看了看代碼,,用偽代碼大概是:


for (i = 0; i < 8; i++)
{
SetData((data >> i) & 0x1);
SetClockHigh();
for (j = 0; j < 5; j++);
SetClockLow();
}


將數據的8個bit在每個高電平從bit0到bit7依次發(fā)送出去,。應該是正常的啊??床怀鰡栴}在哪啊?我仔細想了想,,有看了14094的datasheet,明白了,。原來,,14094要求clock的高電平持續(xù)10個ns,低電平也要持續(xù)10個ns,。這段代碼之做了高電平時間的延時,,沒有做低電平的延時。如果中斷插在低電平之間工作,,那么這段代碼是可以的,。但是如果CPU沒有中斷插在低電平時執(zhí)行,則是不能正常工作的,。所以就時好時壞,。

修改也比較簡單:


for (i = 0; i < 8; i++)
{
SetData((data >> i) & 0x1);
SetClockHigh();
for (j = 0; j < 5; j++);
SetClockLow();
for (j = 0; j < 5; j++);
}


這樣就完全正常了。但是這個還是不能很好移植的一個代碼,,因為編譯器一優(yōu)化,,就有可能造成這兩個延時循環(huán)的丟失。丟失了,,就不能保證高電平低電平持續(xù)10ns的要求,,也就不能正常工作了。所以,,真正的可以移植的代碼,,應該把這個循環(huán)做成一個納秒級的 DelayNs(10);


像Linux一樣,上電時,,先測量一下,,nop指令執(zhí)行需要多長時間執(zhí)行,多少個nop指令執(zhí)行10ns,。執(zhí)行一定的nop指令就可以了,。利用編譯器防止優(yōu)化的編譯指令或者特殊的關鍵字,,防止延時循環(huán)被編譯器優(yōu)化掉。如GCC中的

__volatile__ __asm__('nop;\n');


從這個例子中可以清楚的看到,,寫好一段好代碼,,是需要很多知識支撐的。

簡單地總結一下硬件開發(fā)的基本過程:


1,、明確硬件總體需求情況,,如CPU處理能力、存儲容量及速度,、I/O端口的分配,、接口要求、電平要求,、特殊電路要求等等,。


2、根據需求分析制定硬件總體方案,,尋求關鍵器件及相關技術資料,、技術途徑和技術支持,充分考慮技術可行性,、可靠性和成本控制,,并對開發(fā)調試工具提出明確要求。關鍵器件可試著去索取樣品,。


3,、總體方案確定后,,做硬件和軟件的詳細設計,,包括繪制硬件原理圖、軟件功能框圖,、PCB設計,、同時完成開發(fā)元器件清單,。


4、做好PCB板后,,對原理設計中的各個功能單元進行焊接調試,,必要時修改原理圖并作記錄。


5,、軟硬件系統(tǒng)聯調,。一般情況下,經過調試后原理及PCB設計上有所調整,,需要二次投板,。


6、可靠性測試、穩(wěn)定性測試,,通過驗收,,項目完成!


硬件工程師應具備的基本技能:
   (1)由需求分析至總體方案,、詳細設計的規(guī)劃創(chuàng)造能力,;
   (2)熟練運用設計工具,,設計原理圖,、PCB板的能力;
   (3)熟練運用單片機,、DSP,、PLD、FPGA等進行軟硬件開發(fā)調試的能力,;
   (4)熟練運用仿真工具,、示波器、信號發(fā)生器,、邏輯分析儀等調測硬件的能力,;
   (5)掌握常用的標準電路的設計能力,如復位電路,、常用濾波器電路,、功放電路、高速信號傳輸線的匹配電路等,;
   (6)故障定位,、解決問題的能力;
   (7)設計文檔的組織編寫技能,。


來源 網絡

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內容中的聯系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現有害或侵權內容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多