嵌入式分享合集28
一、什么是眼圖
??眼圖是一系列數字信號在示波器上累積而顯示的圖形,它包含了豐富的信息,從眼圖上可以觀察出碼間串擾和噪聲的影響,體現了數字信號整體的特征,從而估計系統優劣程度,因而眼圖分析是高速互連系統信號完整性分析的核心。
????另外也可以用此圖形對接收濾波器的特性加以調整,以減小碼間串擾,改善系統的傳輸性能。
????用一個示波器跨接在接收濾波器的輸出端,然后調整示波器掃描周期,使示波器水平掃描周期與接收碼元的周期同步,這時示波器屏幕上看到的圖形就稱為眼圖。
????示波器一般測量的信號是一些位或某一段時間的波形,更多的反映的是細節信息,而眼圖則反映的是鏈路上傳輸的所有數字信號的整體特征。
????觀察眼圖的方法是:用一個示波器跨接在接收濾波器的輸出端,然后調整示波器掃描周期,使示波器水平掃描周期與接收碼元的周期同步,這時示波器屏幕上看到的圖形像人的眼睛,故稱為“眼圖”。
????從“眼圖”上可以觀察出碼間串擾和噪聲的影響,從而估計系統優劣程度。另外也可以用此圖形對接收濾波器的特性加以調整,以減小碼間串擾和改善系統的傳輸性能。
眼圖是怎么形成的?
????對于數字信號,其高電平與低電平的變化可以有多種序列組合。以3個bit為例,可以有000-111共8中組合,在時域上將足夠多的上述序列按某一個基準點對齊,然后將其波形疊加起來,就形成了眼圖。
????如下圖。對于測試儀器而言,首先從待測信號中恢復出信號的時鐘信號,然后按照時鐘基準來疊加出眼圖,最終予以顯示。
眼圖中包含的信息有哪些?
????對于一幅真實的眼圖,如下圖,首先我們可以看出數字波形的平均上升時間(RiseTime)、下降時間(FallTime)、上沖(Overshoot)、下沖(Undershoot)、門限電平(Threshold/CrossingPercent)等基本的電平變換的參數。
????上升時間(RiseTime):脈沖信號的上升時間是指脈沖瞬時值最初到達規定下限和規定上限的兩瞬時之間的間隔。除另有規定之外,下限和上限分別定為脈沖峰值幅度的10%和90%。
????下降時間(FallTime):脈沖信號的下降時間是指從脈沖峰值幅度的90%下降到10%所經歷的時間間隔。
????上沖(Overshoot):也叫過沖就是第一個峰值或谷值超過設定電壓,主要表現為一個尖端脈沖,并且能導致電路元器件的失效。
????下沖(Undershoot):是指下一個谷值或峰值。過分的過沖能夠引起保護二極管工作,導致過早地失效。過分的下沖能夠引起假的時鐘或數據錯誤。
????門限電平(Threshold/CrossingPercent):是指在系統傳輸特性劣于某一特定誤碼率的情況下,收信機所能達到的最低接收電平。
如何根據眼圖情況分辨信號質量?
????信號不可能每次高低電平的電壓值都保持完全一致,也不能保證每次高低電平的上升沿、下降沿都在同一時刻。由于多次信號的疊加,眼圖的信號線變粗,出現模糊(Blur)的現象。
????所以眼圖也反映了信號的噪聲和抖動:在縱軸電壓軸上,體現為電壓的噪聲(VoltageNoise);在橫軸時間軸上,體現為時域的抖動(Jitter)。如下圖示。
????當存在噪聲時,噪聲將疊加在信號上,觀察到的眼圖的線跡會變得模糊不清。若同時存在碼間串擾,“眼睛”將張開得更小。一般眼圖的眼睛睜得越大,眼圖眼高越高,代表信號質量越好。whaosoft aiot?http://143ai.com
????做信號仿真可以獲取眼圖情況,然后根據眼圖情況判斷信號的質量,如果眼圖情況不好,可以調整硬件設計或者PCB設計,使眼圖眼高變高,保證生產出的產品信號質量。
二、STM32啟動文件
STM32啟動文件startup_stm32f10x_hd.s的代碼進行講解,此文件的代碼在任何一個STM32F10x工程中都可以找到。
啟動文件使用的ARM匯編指令匯總
?
Stack——棧
???????
Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=Stack_Mem SPACE Stack_Size__initial_sp????開辟棧的大小為 0X00000400(1KB),名字為 STACK, NOINIT 即不初始化,可讀可寫, 8(2^3)字節對齊。
????棧的作用是用于局部變量,函數調用,函數形參等的開銷,棧的大小不能超過內部SRAM 的大小。如果編寫的程序比較大,定義的局部變量很多,那么就需要修改棧的大小。如果某一天,你寫的程序出現了莫名奇怪的錯誤,并進入了硬 fault 的時候,這時你就要考慮下是不是棧不夠大,溢出了。
??? EQU:宏定義的偽指令,相當于等于,類似于C 中的 define。
??? AREA:告訴匯編器匯編一個新的代碼段或者數據段。STACK 表示段名,這個可以任意命名;NOINIT 表示不初始化;READWRITE 表示可讀可寫, ALIGN=3,表示按照 2^3對齊,即 8 字節對齊。
??? SPACE:用于分配一定大小的內存空間,單位為字節。這里指定大小等于 Stack_Size。
????標號__initial_sp 緊挨著 SPACE 語句放置,表示棧的結束地址,即棧頂地址,棧是由高向低生長的。
Heap——堆???????
?
????開辟堆的大小為 0X00000200(512 字節),名字為 HEAP, NOINIT 即不初始化,可讀可寫, 8(2^3)字節對齊。__heap_base 表示對的起始地址, __heap_limit 表示堆的結束地址。堆是由低向高生長的,跟棧的生長方向相反。
????堆主要用來動態內存的分配,像 malloc()函數申請的內存就在堆上面。這個在 STM32里面用的比較少。
???PRESERVE8:指定當前文件的堆棧按照 8 字節對齊。
??? THUMB:表示后面指令兼容 THUMB 指令。THUBM 是 ARM 以前的指令集, 16bit,現在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超集。
向量表
????定義一個數據段,名字為 RESET,可讀。并聲明 __Vectors、 __Vectors_End 和__Vectors_Size 這三個標號具有全局屬性,可供外部的文件調用。
??? EXPORT:聲明一個標號可被外部的文件使用,使標號具有全局屬性。如果是 IAR 編譯器,則使用的是 GLOBAL 這個指令。
????當內核響應了一個發生的異常后,對應的異常服務例程(ESR)就會執行。為了決定 ESR的入口地址, 內核使用了―向量表查表機制‖。這里使用一張向量表。向量表其實是一個WORD(32 位整數)數組,每個下標對應一種異常,該下標元素的值則是該 ESR 的入口地址。向量表在地址空間中的位置是可以設置的,通過 NVIC 中的一個重定位寄存器來指出向量表的地址。在復位后,該寄存器的值為 0。因此,在地址 0 (即 FLASH 地址 0) 處必須包含一張向量表,用于初始時的異常分配。要注意的是這里有個另類:0 號類型并不是什么入口地址,而是給出了復位后 MSP 的初值。下圖是F103的向量表。
????__Vectors 為向量表起始地址, __Vectors_End 為向量表結束地址,兩個相減即可算出向量表大小。
????向量表從 FLASH 的 0 地址開始放置,以 4 個字節為一個單位,地址 0 存放的是棧頂地址, 0X04 存放的是復位程序的地址,以此類推。從代碼上看,向量表中存放的都是中斷服務函數的函數名,可我們知道 C 語言中的函數名就是一個地址。
??? DCD:分配一個或者多個以字為單位的內存,以四字節對齊,并要求初始化這些內存。在向量表中, DCD 分配了一堆內存,并且以 ESR 的入口地址初始化它們。
復位程序
????定義一個名稱為.text 的代碼段,可讀。
?
????復位子程序是系統上電后第一個執行的程序,調用 SystemInit 函數初始化系統時鐘,然后調用 C 庫函數_mian,最終調用 main 函數去到 C 的世界。
??? WEAK:表示弱定義,如果外部文件優先定義了該標號則首先引用該標號,如果外部文件沒有聲明也不會出錯。這里表示復位子程序可以由用戶在其他文件重新實現,這里并不是唯一的。
??? IMPORT:表示該標號來自外部文件,跟 C 語言中的 EXTERN 關鍵字類似。這里表示 SystemInit 和__main 這兩個函數均來自外部的文件。
??? SystemInit()是一個標準的庫函數,在 system_stm32f10x.c 這個庫文件中定義。主要作用是配置系統時鐘,這里調用這個函數之后,單片機的系統時鐘配被配置為 72M。__main 是一個標準的 C 庫函數,主要作用是初始化用戶堆棧,并在函數的最后調用main 函數去到 C 的世界。這就是為什么我們寫的程序都有一個 main 函數的原因。
???? LDR、 BLX、 BX 是 CM4 內核的指令,可在《CM3 權威指南 CnR2》第四章-指令集里面查詢到,具體作用見下表:
?
?中斷服務程序
????在啟動文件里面已經幫我們寫好所有中斷的中斷服務函數,跟我們平時寫的中斷服務函數不一樣的就是這些函數都是空的,真正的中斷服務程序需要我們在外部的 C 文件里面重新實現,這里只是提前占了一個位置而已。
????如果我們在使用某個外設的時候,開啟了某個中斷,但是又忘記編寫配套的中斷服務程序或者函數名寫錯,那當中斷來臨的時,程序就會跳轉到啟動文件預先寫好的空的中斷服務程序中,并且在這個空函數中無線循環,即程序就死在這里。
???B:跳轉到一個標號。這里跳轉到一個‘.’,即表示無線循環
用戶堆棧初始化
??? ALIGN:對指令或者數據存放的地址進行對齊,后面會跟一個立即數。缺省表示 4 字節對齊。
????首先判斷是否定義了__MICROLIB ,如果定義了這個宏則賦予標號__initial_sp(棧頂地址)、 __heap_base(堆起始地址)、 __heap_limit(堆結束地址)全局屬性,可供外部文件調用。有關這個宏我們在 KEIL 里面配置,具體見下圖。然后堆棧的初始化就由 C 庫函數_main 來完成。
?
????如果沒有定義__MICROLIB,則才用雙段存儲器模式,且聲明標號__user_initial_stackheap 具有全局屬性,讓用戶自己來初始化堆棧。延慶川北小區45孫老師 收賣廢品破爛垃圾炒股 廢品孫 再回收
????前文的匯編代碼,需要注意:
-
IF,ELSE,ENDIF:匯編的條件分支語句,跟 C 語言的 if ,else 類似
-
END:文件結束
三、發一發曾經的程序員看看都有誰啊 哈哈一看嚇一跳
王小波
????對于王小波也就讀過一本《一只特立獨行的豬》,讓我對王小波產生興趣的是在讀到《Mac Talk》這本書里寫到王小波除了作家的身份外,還是一名程序員,并且是一名很牛的程序員。在 90 年代初的時候因為國內應用軟件缺乏,愛搗鼓東西的王小波利用閑暇時間學習了匯編和C語言,編了中文編輯器和輸入法。中文編輯器和輸入法任何一個都是大牛級的 GEEK 才會去嘗試的東西。
許嵩
????音樂才子許嵩在醫學、烹飪方面都非常在行,在他15歲的時候就參加了全國中學生網頁設計大賽,成為了安徽省的第一名,而且他最初的夢想是開發一個比windows更牛的操作系統。
馬東
????說到馬東,大家首先想到的可能是他前央視主持人的身份,以及他在《奇葩說》中的搞笑形象。
????身為相聲大師馬季的兒子,馬東曾被父親下了“不許學相聲”的死命令。在他很小的時候,便被家里送往澳大利亞讀書,讀的正是計算機專業。畢業后,馬東進入當地一家大公司工作,成了一名朝九晚五的程序員,一干就是10年。
奧巴馬
????除了娛樂圈名人,在政界也不乏一些編程愛好者。眾所周知,當年奧巴馬在“一小時編程”的項目里,用Java在頁面上畫了一個正方形,讓他成為了史上第一位會編程的美國總統。
李顯龍
????但放眼世界,他可不是唯一一位學習編程的政界名人?,F任新加坡總理李顯龍,1974年畢業于英國劍橋大學,獲得過數學一等榮譽學位及電腦科學優等文憑。
??? 2015年,李顯龍還在Facebook上曬出過一組他幾年前用C++編寫的關于數獨求解器代碼,還附上一個指向Google Drive的鏈接,里面包含了這段代碼及其輸出示例和編譯后的Windows可執行文件。
????很多網友評價他是總理中最能寫程序的,程序員中最能當總理的。
總結
- 上一篇: 大数据基础篇(一):联机分析处理(OLA
- 下一篇: 【转】JMeter学习(十三)分布式部署