資料介紹
一、系統(tǒng)相關(guān)
波特率
1)定義:
波特率表示每秒鐘傳送的碼元符號的個數(shù),是衡量數(shù)據(jù)傳送速率的指標(biāo),它用單位時間內(nèi)載波調(diào)制狀態(tài)改變的次數(shù)來表示。
在信息傳輸通道中,攜帶數(shù)據(jù)信息的信號單元叫碼元,每秒鐘通過信道傳輸?shù)拇a元數(shù)稱為碼元傳輸速率,簡稱波特率。波特率是傳輸通道頻寬的指標(biāo)。
2)計算:
波特率115200 = 115200 (位/秒)
以最普通的串口(起始位+8位數(shù)據(jù)+停止位)為例:
除以10,得到的是每秒字節(jié)數(shù):
波特率115200 = 115200 (位/秒) = 11520 (字節(jié)/秒)
再除以 1024,就是每秒 KB 數(shù):
波特率115200 = 115200 (位/秒) = 11.25 (KB/秒)
如果有一位奇偶校驗位,就應(yīng)該除以 11,得到的是每秒字節(jié)數(shù)。
最后:
波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)
備注:
二進(jìn)制環(huán)境下,波特率 = 比特率。
哈佛結(jié)構(gòu)
哈佛結(jié)構(gòu)是一種將程序指令存儲和數(shù)據(jù)存儲分開的存儲器結(jié)構(gòu),它的主要特點是將程序和數(shù)據(jù)存儲在不同的存儲空間中,即程序存儲器和數(shù)據(jù)存儲器是兩個獨立的存儲器,每個存儲器獨立編址、獨立訪問,目的是為了減輕程序運行時的訪存瓶頸。
程序指令儲存和數(shù)據(jù)儲存分開,數(shù)據(jù)和指令的儲存可以同時進(jìn)行,可以使指令和數(shù)據(jù)有不同的數(shù)據(jù)寬度,如Microchip公司的PIC16芯片的程序指令是14位寬度,而數(shù)據(jù)是8位寬度。
其中,51單片機(jī)和stm32都為哈佛結(jié)構(gòu)。
馮諾依曼結(jié)構(gòu)
馮·諾依曼結(jié)構(gòu),又稱為普林斯頓體系結(jié)構(gòu),是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的存儲器結(jié)構(gòu)。取指令和取操作數(shù)都在同一總線上,通過分時復(fù)用的方式進(jìn)行;缺點是在高速運行時,不能達(dá)到同時取指令和取操作數(shù),從而形成了傳輸過程的瓶頸。由于程序指令存儲地址和數(shù)據(jù)存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同。
其中,msp430、ARM7、freescale等單片機(jī)為馮諾依曼結(jié)構(gòu)。
改進(jìn)型哈佛結(jié)構(gòu)
改進(jìn)型哈佛結(jié)構(gòu)雖然也使用兩個不同的存儲器:程序存儲器和數(shù)據(jù)存儲器,但它把兩個存儲器的地址總線合并了,數(shù)據(jù)總線也進(jìn)行了合并,即原來的哈佛結(jié)構(gòu)需要4條不同的總線,改進(jìn)后需要兩條總線。
ARM處理器的工作模式
一個程序運行在不同的模式下面的時候,能夠運行的ARM處理器的指令是不一樣的,能夠訪問的ARM處理器的寄存器都是不一樣的。這些模式為:
特權(quán)模式
除用戶模式外,其它模式均為特權(quán)模式(Privileged ModesARM內(nèi)部寄存器和一些片內(nèi)外設(shè)在硬件設(shè)計上只允許(或者可選為只允許)特權(quán)模式下訪問。此外,特權(quán)模式可以自由的切換處理器模式,而用戶模式不能直接切換到別的模式。
異常模式
特權(quán)模式中除系統(tǒng)(system)模式之外的其他5種模式又統(tǒng)稱為異常模式。它們除了可以通過在特權(quán)下的程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。比如硬件產(chǎn)生中斷信號進(jìn)入中斷異常模式,讀取沒有權(quán)限數(shù)據(jù)進(jìn)入中止異常模式,執(zhí)行未定義指令時進(jìn)入未定義指令中止異常模式。其中管理模式也稱為超級用戶模式,是為操作系統(tǒng)提供軟中斷的特有模式,正是由于有了軟中斷,用戶程序才可以通過系統(tǒng)調(diào)用切換到管理模式。
硬件權(quán)限級別:系統(tǒng)模式 > 異常模式 > 用戶模式
對于Linux而言,一般的應(yīng)用程序運行在User模式,而Linux內(nèi)核運行在SVC模式,即Supervisor模式
(1)用戶模式:
用戶模式是用戶程序的工作模式,它運行在操作系統(tǒng)的用戶態(tài),它沒有權(quán)限去操作其它硬件資源,只能執(zhí)行處理自己的數(shù)據(jù),也不能切換到其它模式下,要想訪問硬件資源或切換到其它模式只能通過軟中斷或產(chǎn)生異常。
(2)系統(tǒng)模式:
系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。用戶模式和系統(tǒng)模式共用一套寄存器,操作系統(tǒng)在該模式下可以方便的訪問用戶模式的寄存器,而且操作系統(tǒng)的一些特權(quán)任務(wù)可以使用這個模式訪問一些受控的資源。
說明:用戶模式與系統(tǒng)模式兩者使用相同的寄存器,都沒有SPSR(Saved Program Statement Register,已保存程序狀態(tài)寄存器),但系統(tǒng)模式比用戶模式有更高的權(quán)限,可以訪問所有系統(tǒng)資源。
(3)一般中斷模式:
一般中斷模式也叫普通中斷模式,用于處理一般的中斷請求,通常在硬件產(chǎn)生中斷信號之后自動進(jìn)入該模式,該模式為特權(quán)模式,可以自由訪問系統(tǒng)硬件資源。
(4)快速中斷模式:
快速中斷模式是相對一般中斷模式而言的,它是用來處理對時間要求比較緊急的中斷請求,主要用于高速數(shù)據(jù)傳輸及通道處理中。
(5)管理模式(Supervisor,SVC):
管理模式是CPU上電后默認(rèn)模式,因此在該模式下主要用來做系統(tǒng)的初始化,軟中斷處理也在該模式下。當(dāng)用戶模式下的用戶程序請求使用硬件資源時,通過軟件中斷進(jìn)入該模式。
說明:系統(tǒng)復(fù)位或開機(jī)、軟中斷時進(jìn)入到SVC模式下。
(6)終止模式:
中止模式用于支持虛擬內(nèi)存或存儲器保護(hù),當(dāng)用戶程序訪問非法地址,沒有權(quán)限讀取的內(nèi)存地址時,會進(jìn)入該模式,linux下編程時經(jīng)常出現(xiàn)的segment fault通常都是在該模式下拋出返回的。
(7)未定義模式:
未定義模式用于支持硬件協(xié)處理器的軟件仿真,CPU在指令的譯碼階段不能識別該指令操作時,會進(jìn)入未定義模式。
流水線機(jī)制
傳統(tǒng)的單片機(jī)(如8051)中,處理器只有完成一條指令的讀取和執(zhí)行后,才會開始下一條指令的處理,所以PC(程序計數(shù)器)總是指向正在執(zhí)行的指令。而ARM體系架構(gòu)中則引入了流水線的概念。
到ARM7為止的ARM處理器使用了簡單的三級流水線。三級流水線使用三個工位,將指令的處理分為三個階段,分別為取指、譯碼和執(zhí)行。取指:從存儲器中裝載;譯碼:識別將要被執(zhí)行的指令;執(zhí)行:處理指令并將結(jié)果寫回寄存器。
Cortex-A9架構(gòu)基于先進(jìn)的推測型八級流水線
同步通信和異步通信
(1)同步通信要求接收端時鐘頻率和發(fā)送端時鐘頻率一致,發(fā)送端發(fā)送連續(xù)的比特流;異步通信時不要求接收端時鐘和發(fā)送端時鐘同步,發(fā)送端發(fā)送完一個字節(jié)后,可經(jīng)過任意長的時間間隔再發(fā)送下一個字節(jié)。
(2)同步通信效率高;異步通信效率較低。
(3)同步通信較復(fù)雜,雙方時鐘的允許誤差較??;異步通信簡單,雙方時鐘可允許一定誤差。
(4)同步通信可用于點對多點;異步通信只適用于點對點。同步是阻塞模式,異步是非阻塞模式。
異步通信:異步通信中的接收方并不知道數(shù)據(jù)什么時候會到達(dá),收發(fā)雙方可以有各自自己的時鐘。發(fā)送方發(fā)送的時間間隔可以不均,接收方是在數(shù)據(jù)的起始位和停止位的幫助下實現(xiàn)信息同步的。這種傳輸通常是很小的分組,比如一個字符為一組,為這個組配備起始位和結(jié)束位。所以這種傳輸方式的效率是比較低的,畢竟額外加入了很多的輔助位作為負(fù)載,常用在低速的傳輸中。典型通信為串口通信。
同步通信:同步通信中雙方使用頻率一致的時鐘,它的分組相比異步則大得多,稱為一個數(shù)據(jù)幀,通過獨特的bit串作為啟停標(biāo)識。發(fā)送方要以固定的節(jié)奏去發(fā)送數(shù)據(jù),而接收方要時刻做好接收數(shù)據(jù)的準(zhǔn)備,識別到前導(dǎo)碼后馬上要開始接收數(shù)據(jù)了。同步這種方式中因為分組很大,很長一段數(shù)據(jù)才會有額外的輔助位負(fù)載,所以效率更高,更加適合對速度要求高的傳輸,當(dāng)然這種通信對時序的要求也更高。典型通信為:SPI和IIC。
軟實時和硬實時
硬實時與軟實時之間最關(guān)鍵的差別在于,軟實時只能提供統(tǒng)計意義上的實時。例如,有的應(yīng)用要求系統(tǒng)在95%的情況下都會確保在規(guī)定的時間內(nèi)完成某個動作,而不一定要求100%。在許多情況下,這樣的“軟性”正確率已經(jīng)可以達(dá)到用戶期望的水平。比如,用戶在操作DVD播放機(jī)時,只要98%的情況都能正常播放,用戶可能就滿意了;而發(fā)射衛(wèi)星、控制核反應(yīng)堆的應(yīng)用系統(tǒng),這些系統(tǒng)的實時性必須達(dá)到100%,是絕對不允許出現(xiàn)意外。
ARM體系的CPU兩種工作狀態(tài)
ARM狀態(tài):arm處理器工作于32位指令的狀態(tài),所有指令均為32位。
THumb狀態(tài):arm執(zhí)行16位指令的狀態(tài),即16位狀態(tài)。
THumb指令集是arm指令集的一個子集,是針對代碼密度問題而提出的,它具有16位的代碼寬度。與等價的32位代碼相比較,THumb指令集在保留32位代碼優(yōu)勢的同時,大大的節(jié)省了系統(tǒng)的存儲空間。
另外:ARM的M系列主要用Thumb指令,ARM9和A系列主要用ARM指令。
Linux文件權(quán)限
權(quán)限數(shù)字對應(yīng)權(quán)限組說明:
總共分為4部分
【文件或文件夾】【owner權(quán)限】【group權(quán)限】【others權(quán)限】
【文件是-,文件夾是d】【r/w/x相加】【r/w/x相加】【r/w/x相加】
如 chmod 777 xxx.xxx 就是說xxx文件的權(quán)限為可讀可寫可執(zhí)行且對所有用戶有效。
ls -l a 查看a文件的權(quán)限
二、軟件相關(guān)
各種變量類型所占內(nèi)存
大端小端問題
所謂的大端模式,就是高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。(ARM)
所謂的小端模式,就是低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。(x86平臺、c51)
小端模式 :強制轉(zhuǎn)換數(shù)據(jù)不需要調(diào)整字節(jié)內(nèi)容,1、2、4字節(jié)的存儲方式一樣。
大端模式 :符號位的判定固定為第一個字節(jié),容易判斷正負(fù)。
判斷大小端:
#include#include typedef union{ short a; //定義一個short變量,因為它所占字節(jié)數(shù)為2,便于與長度為2的char數(shù)組內(nèi)存對齊 char b[2];//定義一個char數(shù)組,因為char變量所占字節(jié)數(shù)為1,char[2]就是長度為2了 }test; int main(int argc, char *argv[]) { test ut; ut.a = 0x1234; printf("ut.b[0]:%02x/r/n",ut.b[0]);//若打印0x12即為小端,打印出0x34則為大端 printf("ut.b[1]:%02x/r/n",ut.b[1]); printf("ut:%d/r/n",sizeof(ut)); return 0; }
大小端轉(zhuǎn)換實例:
//16位 #define BSWAP_16(x) / (uint_16)((((uint_16)(x) & 0x00ff) <<8) | / (((uint_16)(x) & 0xff00) >> 8) / )
volatile關(guān)鍵詞
volatile是一個類型修飾符(type specifier),就像我們熟悉的const一樣,它是被設(shè)計用來修飾被不同線程訪問和修改的變量;volatile的作用是作為指令關(guān)鍵字,確保本條指令不會因編譯器的優(yōu)化而省略,且要求每次直接讀值。
簡單地說就是防止編譯器對代碼進(jìn)行優(yōu)化。
例如,在多線程,或者是存在中斷的場景下:
buff[0]=0x01; buff[0]=0x02; buff[0]=0x03; buff[0]=0x04;
編譯器可能會將上面4行代碼優(yōu)化為1行 buff[0]=0x04;
但是,可能我們想要的結(jié)果就是需要連續(xù)運行著四段代碼,因為有可能在另外的線程或中斷訪問buff[0]時,我們需要得到一個實時的結(jié)果,可能是0x01,也可能是0x03,但如果不加volatile關(guān)鍵詞,可能得到的值永遠(yuǎn)都是0x04。
do{}while(0)的技巧用法
(1)在后面要加分號,使調(diào)用如同函數(shù)
在定義宏后,使用do{}while(0)如果不加分號會直接報錯
(2)避免括號等使用因素對實際運行造成影響
例如,定義一個宏:
#define foo(x) bar(x); baz(x)
然后你可能這樣調(diào)用:
foo(wolf);
這將被宏擴(kuò)展為:
bar(wolf); baz(wolf);
這的確是我們期望的正確輸出。下面看看如果我們這樣調(diào)用:
if (!feral) foo(wolf);
那么擴(kuò)展后可能就不是你所期望的結(jié)果。上面語句將擴(kuò)展為:
if (!feral) bar(wolf); baz(wolf);
顯而易見,這是錯誤的。如果使用do while寫法即可避免這個問題:
if (!feral) do { bar(wolf); baz(wolf); } while (0);
等價于:
if (!feral) { bar(wolf); baz(wolf); }
(3)避免空宏引起的warning
內(nèi)核中由于不同架構(gòu)的限制,很多時候會用到空宏,在編譯的時候,空宏會給出warning,為了避免這樣的warning,就可以使用do{}while(0)來定義空宏:
#define EMPTYMICRO do{}while(0)
(4)避免使用goto對程序流進(jìn)行統(tǒng)一的控制
有些函數(shù)中,在函數(shù)return之前我們經(jīng)常會進(jìn)行一些收尾的工作,比如free掉一塊函數(shù)開始malloc的內(nèi)存,goto一直都是一個比較簡便的方法:
int foo() { somestruct* ptr = malloc(...); dosomething...; if(error) { goto END; } dosomething...; if(error) { goto END; } dosomething...; END: free(ptr); return 0; }
由于goto不符合軟件工程的結(jié)構(gòu)化,而且有可能使得代碼難懂,所以很多人都不倡導(dǎo)使用,那這個時候就可以用do{}while(0)來進(jìn)行統(tǒng)一的管理:
int foo() { somestruct* ptr = malloc(...); do{ dosomething...; if(error) { break; } dosomething...; if(error) { break; } dosomething...; }while(0); free(ptr); return 0; }
這里將函數(shù)主體使用do()while(0)包含起來,使用break來代替goto,后續(xù)的處理工作在while之后,就能夠達(dá)到同樣的效果。
(5)定義一個單獨的函數(shù)塊來實現(xiàn)復(fù)雜的操作:
當(dāng)你的功能很復(fù)雜,變量很多你又不愿意增加一個函數(shù)的時候,使用do{}while(0);,將你的代碼寫在里面,里面可以定義變量而不用考慮變量名會同函數(shù)之前或者之后的重復(fù)。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/sinat_30146065/article/details/105428988
- 嵌入式常見經(jīng)典筆試題
- 嵌入式常見面試題
- 嵌入式試題庫
- 嵌入式系統(tǒng)與嵌入式PLC
- FPGA的筆試題和答案資料合集免費下載 28次下載
- HTML和JavaScript編程筆試題資料免費下載 7次下載
- 嵌入式軟件工程師筆試題資料免費下載 27次下載
- 軟件工程師筆試題目(嵌入式方向)資料下載 32次下載
- 46家著名公司的筆試題目 0次下載
- 嵌入式軟件工程師經(jīng)典筆試試題分享 65次下載
- 2014全志數(shù)字IC筆試題目 20次下載
- 大唐硬件筆試題_基帶設(shè)計 5次下載
- 自動化嵌入式研發(fā)筆試題 0次下載
- 硬件類筆試題(超齊全的筆試題) 48次下載
- 嵌入式C開發(fā)人員最好筆試題 65次下載
- 嵌入式fpga是什么意思 992次閱讀
- fpga是嵌入式嗎 1767次閱讀
- 什么是嵌入式系統(tǒng)?嵌入式系統(tǒng)的具體應(yīng)用 2096次閱讀
- 幾種常見嵌入式設(shè)備通信協(xié)議 1412次閱讀
- 嵌入式軟件的設(shè)計模式(上) 1119次閱讀
- 嵌入式軟件常見筆試面試題匯總 4995次閱讀
- 嵌入式系統(tǒng)的這11個特點你知道嗎 6451次閱讀
- 嵌入式系統(tǒng)的40道測試題和答案及詳細(xì)解析 9143次閱讀
- 關(guān)于嵌入式系統(tǒng)以及嵌入式平臺下的學(xué)科分工詳解 1855次閱讀
- 嵌入式行業(yè)發(fā)展?fàn)顩r_嵌入式行業(yè)人才需求_嵌入式系統(tǒng)就業(yè)前景分析 2.3w次閱讀
- 什么是嵌入式操作系統(tǒng) 常見的嵌入式系統(tǒng)有哪些 4w次閱讀
- 資料下載:嵌入式系統(tǒng)設(shè)計師考試筆記(非常全面) 1.5w次閱讀
- 嵌入式處理器匯總_常見的嵌入式處理器對比分析 1.4w次閱讀
- 學(xué)習(xí)嵌入式要什么基礎(chǔ) 4060次閱讀
- 典型的嵌入式系統(tǒng)設(shè)計 2650次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關(guān)電源基礎(chǔ)知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計與實現(xiàn)
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計
- 0.70 MB | 2次下載 | 免費
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多