女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>嵌入式開發>博文分享 | 嵌入式常見筆試題收集

博文分享 | 嵌入式常見筆試題收集

2021-01-26 | pdf | 139.17KB | 次下載 | 2積分

資料介紹

一、系統相關

波特率

1)定義:

波特率表示每秒鐘傳送的碼元符號的個數,是衡量數據傳送速率的指標,它用單位時間內載波調制狀態改變的次數來表示。

信息傳輸通道中,攜帶數據信息的信號單元叫碼元,每秒鐘通過信道傳輸的碼元數稱為碼元傳輸速率,簡稱波特率。波特率是傳輸通道頻寬的指標。

2)計算:

波特率115200 = 115200 (位/秒)

以最普通的串口(起始位+8位數據+停止位)為例:

除以10,得到的是每秒字節數:
波特率115200 = 115200 (位/秒) = 11520 (字節/秒)

再除以 1024,就是每秒 KB 數:
波特率115200 = 115200 (位/秒) = 11.25 (KB/秒)

如果有一位奇偶校驗位,就應該除以 11,得到的是每秒字節數。

最后:

波特率115200 = 115200 (位/秒) = 10.27 (KB/秒)

備注:

二進制環境下,波特率 = 比特率。

哈佛結構

哈佛結構是一種將程序指令存儲和數據存儲分開的存儲器結構,它的主要特點是將程序和數據存儲在不同的存儲空間中,即程序存儲器和數據存儲器是兩個獨立的存儲器,每個存儲器獨立編址、獨立訪問,目的是為了減輕程序運行時的訪存瓶頸。

程序指令儲存和數據儲存分開,數據和指令的儲存可以同時進行,可以使指令和數據有不同的數據寬度,如Microchip公司PIC16芯片的程序指令是14位寬度,而數據是8位寬度。

其中,51單片機stm32都為哈佛結構。

馮諾依曼結構

馮·諾依曼結構,又稱為普林斯頓體系結構,是一種將程序指令存儲器和數據存儲器合并在一起的存儲器結構。取指令和取操作數都在同一總線上,通過分時復用的方式進行;缺點是在高速運行時,不能達到同時取指令和取操作數,從而形成了傳輸過程的瓶頸。由于程序指令存儲地址和數據存儲地址指向同一個存儲器的不同物理位置,因此程序指令和數據的寬度相同。

其中,msp430ARM7、freescale等單片機為馮諾依曼結構。

改進型哈佛結構

改進型哈佛結構雖然也使用兩個不同的存儲器:程序存儲器和數據存儲器,但它把兩個存儲器的地址總線合并了,數據總線也進行了合并,即原來的哈佛結構需要4條不同的總線,改進后需要兩條總線。

ARM處理器的工作模式

一個程序運行在不同的模式下面的時候,能夠運行的ARM處理器的指令是不一樣的,能夠訪問的ARM處理器的寄存器都是不一樣的。這些模式為:

特權模式

除用戶模式外,其它模式均為特權模式(Privileged ModesARM內部寄存器和一些片內外設在硬件設計上只允許(或者可選為只允許)特權模式下訪問。此外,特權模式可以自由的切換處理器模式,而用戶模式不能直接切換到別的模式。

異常模式

特權模式中除系統(system)模式之外的其他5種模式又統稱為異常模式。它們除了可以通過在特權下的程序切換進入外,也可以由特定的異常進入。比如硬件產生中斷信號進入中斷異常模式,讀取沒有權限數據進入中止異常模式,執行未定義指令時進入未定義指令中止異常模式。其中管理模式也稱為超級用戶模式,是為操作系統提供軟中斷的特有模式,正是由于有了軟中斷,用戶程序才可以通過系統調用切換到管理模式。

硬件權限級別:系統模式 > 異常模式 > 用戶模式

對于Linux而言,一般的應用程序運行在User模式,而Linux內核運行在SVC模式,即Supervisor模式

(1)用戶模式:

用戶模式是用戶程序的工作模式,它運行在操作系統的用戶態,它沒有權限去操作其它硬件資源,只能執行處理自己的數據,也不能切換到其它模式下,要想訪問硬件資源或切換到其它模式只能通過軟中斷或產生異常。

(2)系統模式:

系統模式是特權模式,不受用戶模式的限制。用戶模式和系統模式共用一套寄存器,操作系統在該模式下可以方便的訪問用戶模式的寄存器,而且操作系統的一些特權任務可以使用這個模式訪問一些受控的資源。

說明:用戶模式與系統模式兩者使用相同的寄存器,都沒有SPSR(Saved Program Statement Register,已保存程序狀態寄存器),但系統模式比用戶模式有更高的權限,可以訪問所有系統資源。

(3)一般中斷模式:

一般中斷模式也叫普通中斷模式,用于處理一般的中斷請求,通常在硬件產生中斷信號之后自動進入該模式,該模式為特權模式,可以自由訪問系統硬件資源。

(4)快速中斷模式:

快速中斷模式是相對一般中斷模式而言的,它是用來處理對時間要求比較緊急的中斷請求,主要用于高速數據傳輸及通道處理中。

(5)管理模式(Supervisor,SVC):

管理模式是CPU上電后默認模式,因此在該模式下主要用來做系統的初始化,軟中斷處理也在該模式下。當用戶模式下的用戶程序請求使用硬件資源時,通過軟件中斷進入該模式。

說明:系統復位或開機、軟中斷時進入到SVC模式下。

(6)終止模式:

中止模式用于支持虛擬內存或存儲器保護,當用戶程序訪問非法地址,沒有權限讀取的內存地址時,會進入該模式,linux下編程時經常出現的segment fault通常都是在該模式下拋出返回的。

(7)未定義模式:

未定義模式用于支持硬件協處理器的軟件仿真,CPU在指令的譯碼階段不能識別該指令操作時,會進入未定義模式。

流水線機制

傳統的單片機(如8051)中,處理器只有完成一條指令的讀取和執行后,才會開始下一條指令的處理,所以PC(程序計數器)總是指向正在執行的指令。而ARM體系架構中則引入了流水線的概念。

到ARM7為止的ARM處理器使用了簡單的三級流水線。三級流水線使用三個工位,將指令的處理分為三個階段,分別為取指、譯碼和執行。取指:從存儲器中裝載;譯碼:識別將要被執行的指令;執行:處理指令并將結果寫回寄存器。

Cortex-A9架構基于先進的推測型八級流水線

同步通信和異步通信

(1)同步通信要求接收端時鐘頻率和發送端時鐘頻率一致,發送端發送連續的比特流;異步通信時不要求接收端時鐘和發送端時鐘同步,發送端發送完一個字節后,可經過任意長的時間間隔再發送下一個字節。
(2)同步通信效率高;異步通信效率較低。
(3)同步通信較復雜,雙方時鐘的允許誤差較小;異步通信簡單,雙方時鐘可允許一定誤差。
(4)同步通信可用于點對多點;異步通信只適用于點對點。同步是阻塞模式,異步是非阻塞模式。

異步通信:異步通信中的接收方并不知道數據什么時候會到達,收發雙方可以有各自自己的時鐘。發送方發送的時間間隔可以不均,接收方是在數據的起始位和停止位的幫助下實現信息同步的。這種傳輸通常是很小的分組,比如一個字符為一組,為這個組配備起始位和結束位。所以這種傳輸方式的效率是比較低的,畢竟額外加入了很多的輔助位作為負載,常用在低速的傳輸中。典型通信為串口通信。

同步通信:同步通信中雙方使用頻率一致的時鐘,它的分組相比異步則大得多,稱為一個數據幀,通過獨特的bit串作為啟停標識。發送方要以固定的節奏去發送數據,而接收方要時刻做好接收數據的準備,識別到前導碼后馬上要開始接收數據了。同步這種方式中因為分組很大,很長一段數據才會有額外的輔助位負載,所以效率更高,更加適合對速度要求高的傳輸,當然這種通信對時序的要求也更高。典型通信為:SPI和IIC

軟實時和硬實時

硬實時與軟實時之間最關鍵的差別在于,軟實時只能提供統計意義上的實時。例如,有的應用要求系統在95%的情況下都會確保在規定的時間內完成某個動作,而不一定要求100%。在許多情況下,這樣的“軟性”正確率已經可以達到用戶期望的水平。比如,用戶在操作DVD播放機時,只要98%的情況都能正常播放,用戶可能就滿意了;而發射衛星、控制核反應堆的應用系統,這些系統的實時性必須達到100%,是絕對不允許出現意外。

ARM體系的CPU兩種工作狀態

ARM狀態:arm處理器工作于32位指令的狀態,所有指令均為32位。

THumb狀態:arm執行16位指令的狀態,即16位狀態。

THumb指令集是arm指令集的一個子集,是針對代碼密度問題而提出的,它具有16位的代碼寬度。與等價的32位代碼相比較,THumb指令集在保留32位代碼優勢的同時,大大的節省了系統的存儲空間。

另外:ARM的M系列主要用Thumb指令,ARM9和A系列主要用ARM指令。

Linux文件權限

權限數字對應權限組說明:

總共分為4部分

【文件或文件夾】【owner權限】【group權限】【others權限】

【文件是-,文件夾是d】【r/w/x相加】【r/w/x相加】【r/w/x相加】

如 chmod 777 xxx.xxx 就是說xxx文件的權限為可讀可寫可執行且對所有用戶有效。

ls -l a 查看a文件的權限

二、軟件相關

各種變量類型所占內存

大端小端問題

所謂的大端模式,就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。(ARM)

所謂的小端模式,就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。(x86平臺、c51)

小端模式 :強制轉換數據不需要調整字節內容,1、2、4字節的存儲方式一樣。
大端模式 :符號位的判定固定為第一個字節,容易判斷正負。

判斷大小端:

#include 
#include 
 
typedef union{
	short a; //定義一個short變量,因為它所占字節數為2,便于與長度為2的char數組內存對齊 
	char b[2];//定義一個char數組,因為char變量所占字節數為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;    
}

大小端轉換實例:

//16位
 
#define BSWAP_16(x) /
(uint_16)((((uint_16)(x) & 0x00ff) <<8) | /
 
(((uint_16)(x) & 0xff00) >> 8) /
 
)

volatile關鍵詞

volatile是一個類型修飾符(type specifier),就像我們熟悉的const一樣,它是被設計用來修飾被不同線程訪問和修改的變量;volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。

簡單地說就是防止編譯器對代碼進行優化。

例如,在多線程,或者是存在中斷的場景下:

buff[0]=0x01;
buff[0]=0x02;
buff[0]=0x03;
buff[0]=0x04;

編譯器可能會將上面4行代碼優化為1行 buff[0]=0x04;

但是,可能我們想要的結果就是需要連續運行著四段代碼,因為有可能在另外的線程或中斷訪問buff[0]時,我們需要得到一個實時的結果,可能是0x01,也可能是0x03,但如果不加volatile關鍵詞,可能得到的值永遠都是0x04。

do{}while(0)的技巧用法

(1)在后面要加分號,使調用如同函數

在定義宏后,使用do{}while(0)如果不加分號會直接報錯

(2)避免括號等使用因素對實際運行造成影響

例如,定義一個宏:

#define foo(x) bar(x); baz(x)

然后你可能這樣調用:

foo(wolf);

這將被宏擴展為:

bar(wolf); baz(wolf);

這的確是我們期望的正確輸出。下面看看如果我們這樣調用:

if (!feral)
    foo(wolf);

那么擴展后可能就不是你所期望的結果。上面語句將擴展為:

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

內核中由于不同架構的限制,很多時候會用到空宏,在編譯的時候,空宏會給出warning,為了避免這樣的warning,就可以使用do{}while(0)來定義空宏:

#define EMPTYMICRO do{}while(0)

(4)避免使用goto對程序流進行統一的控制

有些函數中,在函數return之前我們經常會進行一些收尾的工作,比如free掉一塊函數開始malloc的內存,goto一直都是一個比較簡便的方法:

int foo()
{
    somestruct* ptr = malloc(...);
 
    dosomething...;
    if(error)
    {
        goto END;
    }
 
    dosomething...;
    if(error)
    {
        goto END;
    }
    dosomething...;
 
END:
    free(ptr);
    return 0;
 
}

由于goto不符合軟件工程的結構化,而且有可能使得代碼難懂,所以很多人都不倡導使用,那這個時候就可以用do{}while(0)來進行統一的管理:

int foo()
{
 
    somestruct* ptr = malloc(...);
 
    do{
        dosomething...;
        if(error)
        {
            break;
        }
 
        dosomething...;
        if(error)
        {
            break;
        }
        dosomething...;
    }while(0);
 
    free(ptr);
    return 0;
 
}

這里將函數主體使用do()while(0)包含起來,使用break來代替goto,后續的處理工作在while之后,就能夠達到同樣的效果。

(5)定義一個單獨的函數塊來實現復雜的操作:

當你的功能很復雜,變量很多你又不愿意增加一個函數的時候,使用do{}while(0);,將你的代碼寫在里面,里面可以定義變量而不用考慮變量名會同函數之前或者之后的重復。

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/sinat_30146065/article/details/105428988



下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費