一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

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

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

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


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


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


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


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


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


第四部分: U-Boot: 了解 U-Boot 的作用及工作流程;了解Bootloader 的代碼結(jié)構(gòu)、編譯過程;移植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、設(shè)置u-boot環(huán)境變量
11、 u-boot驅(qū)動(dòng)添加如網(wǎng)卡:DM9000


第五部分:LINUX內(nèi)核移植:熟悉內(nèi)核的原碼結(jié)構(gòu)和kbuild Makefile語(yǔ)法;掌握和內(nèi)核、驅(qū)動(dòng)模塊編譯相關(guān)的原理及方法。


1、Linux內(nèi)核介紹
2、Linux內(nèi)核特點(diǎn)

3、Linux內(nèi)核源代碼結(jié)構(gòu)
4、Linux內(nèi)核選項(xiàng)解析
5、Linux內(nèi)核編譯鏈接
6、內(nèi)核模塊編譯、使用方法


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


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


第七部分:LINUX驅(qū)動(dòng)開發(fā)


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


第八部分:LINUX應(yīng)用學(xué)習(xí)


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


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


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


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

1 、嵌入式Linux GUI介紹
2、嵌入式QT開發(fā)包移植
3、QT介紹及其信號(hào)插槽機(jī)制
4、 QT圖形界面編程技術(shù)
5、QT應(yīng)用程序與Linux驅(qū)動(dòng)的銜接
6、 QT在實(shí)際項(xiàng)目中具體應(yīng)用


第十部分:無(wú)線通訊應(yīng)用


1、無(wú)線wifi模塊應(yīng)用
2、3G模塊應(yīng)用


第十一部分:嵌入式系統(tǒng)應(yīng)用程序,驅(qū)動(dòng)程序調(diào)試


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


第十二部分:嵌入式項(xiàng)目綜合調(diào)試,產(chǎn)品發(fā)布


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




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


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


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


2、嵌入式LININX開發(fā)第二學(xué)習(xí)階段,掌握ARM匯編程序設(shè)計(jì),驅(qū)動(dòng)程序設(shè)計(jì)。


1、ARM體系結(jié)構(gòu):ARM體系,ARM指令,Thumb指令,匯編程序設(shè)計(jì),邏輯程序開發(fā)

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

3、驅(qū)動(dòng)程序開發(fā):驅(qū)動(dòng)架構(gòu)模型,字符設(shè)備驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng),網(wǎng)絡(luò)驅(qū)動(dòng)

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


3、嵌入式LININX開發(fā)第三學(xué)習(xí)階段,掌握C++面向?qū)ο蟪绦蛟O(shè)計(jì),Qt編程。


1、C++語(yǔ)言編程基礎(chǔ)

2、QT編程開發(fā):QT開發(fā)基礎(chǔ),QT布局與控件,QT繪圖,QT事件,QT網(wǎng)絡(luò)通信,QT數(shù)據(jù)庫(kù),QT移植

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


嵌入式設(shè)計(jì)應(yīng)具備的基本技能


1、Linux 基礎(chǔ)

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


2、Shell 編程基礎(chǔ)

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


3、Linux 下的 C 編程基礎(chǔ)

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


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

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


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

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


6、嵌入式 Linux 下串口通信

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


7、嵌入式系統(tǒng)中多進(jìn)程程序設(shè)計(jì)

Linux系統(tǒng)進(jìn)程概述 嵌入式系統(tǒng)的進(jìn)程特點(diǎn) 進(jìn)程操作 守護(hù)進(jìn)程 相關(guān)的系統(tǒng)調(diào)用了解Linux系統(tǒng)中進(jìn)程的概念 能夠編寫多進(jìn)程程序編寫多進(jìn)程程序 編寫一個(gè)守護(hù)進(jìn)程程序 sleep系統(tǒng)調(diào)用任務(wù)管理、同步與通信Linux任務(wù)概述任務(wù)調(diào)度 管道 信號(hào) 共享內(nèi)存 任務(wù)管理 API 了解Linux系統(tǒng)任務(wù)管理機(jī)制 熟悉進(jìn)程間通信的幾種方式 熟悉嵌入式Linux中的任務(wù)間同步與通信編寫一個(gè)簡(jiǎn)單的管道程序?qū)崿F(xiàn)文件傳輸 編寫一個(gè)使用共享內(nèi)存的程序


8、嵌入式系統(tǒng)中多線程程序設(shè)計(jì)

線程的基礎(chǔ)知識(shí) 多線程編程方法 線程應(yīng)用中的同步問題了解線程的概念 能夠編寫簡(jiǎn)單的多線程程序編寫一個(gè)多線程程序


9、嵌入式 Linux 網(wǎng)絡(luò)編程

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


10、GUI 程序開發(fā)

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


11、Linux 字符設(shè)備驅(qū)動(dòng)程序

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


12、文件系統(tǒng)

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


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


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

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


第一個(gè)問題


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


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

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


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


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

修改這段代碼其實(shí)很簡(jiǎn)單,最簡(jiǎn)單的辦法是從高層修改。即:


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


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


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


第二個(gè)例子


同事驅(qū)動(dòng)一個(gè)14094串轉(zhuǎn)并的芯片。串行信號(hào)是采用IO模擬的,因?yàn)闆]有專用的硬件。同事就隨手寫了個(gè)驅(qū)動(dòng),結(jié)果調(diào)試了3、4天,仍舊是有問題。我實(shí)在看不下去了,就去看了看,控制的并行信號(hào)有時(shí)候正常有時(shí)候不正常。我看了看代碼,用偽代碼大概是:


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


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

修改也比較簡(jiǎn)單:


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


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


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

__volatile__ __asm__('nop;\n');


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

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


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


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


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


4、做好PCB板后,對(duì)原理設(shè)計(jì)中的各個(gè)功能單元進(jìn)行焊接調(diào)試,必要時(shí)修改原理圖并作記錄。


5、軟硬件系統(tǒng)聯(lián)調(diào)。一般情況下,經(jīng)過調(diào)試后原理及PCB設(shè)計(jì)上有所調(diào)整,需要二次投板。


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


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


來源 網(wǎng)絡(luò)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品一区二区成人在线| 色婷婷在线精品国自产拍| 亚洲国产色婷婷久久精品| 精品推荐久久久国产av| 亚洲天堂精品一区二区| 国内尹人香蕉综合在线| 免费一区二区三区少妇| 亚洲中文字幕视频一区二区| 六月丁香六月综合缴情| 亚洲天堂一区在线播放| 内射精品欧美一区二区三区久久久| 亚洲熟女少妇精品一区二区三区| 国产精品午夜性色视频| 日韩中文高清在线专区| 国产爆操白丝美女在线观看 | 永久福利盒子日韩日韩| 国产日本欧美韩国在线| 中文字幕在线五月婷婷| 大香蕉网国产在线观看av| 日本精品中文字幕人妻| 亚洲熟妇av一区二区三区色堂| 亚洲品质一区二区三区| 欧洲一区二区三区自拍天堂| 日韩精品视频香蕉视频| 高中女厕偷拍一区二区三区| 91插插插外国一区二区婷婷| 一区二区三区日韩中文| 97人妻精品免费一区二区| 日韩aa一区二区三区| 搡老妇女老熟女一区二区| 国产精品福利一二三区| 国产精品99一区二区三区| 中文字幕禁断介一区二区| 久久精品国产99国产免费| 91久久精品在这里色伊人| 十八禁日本一区二区三区| 一区二区不卡免费观看免费| 噜噜中文字幕一区二区| 欧美午夜不卡在线观看| 中文字幕无线码一区欧美| 亚洲伦理中文字幕在线观看|