韋東山嵌入式第一期14課第004節_und異常模示程序示例_P筆記

本節課的第一個程序韋老師是想讓大家見識一下未定義異常,而第二個程序是對第一個程序進行改進,防止在某些條件下執行不了,下面就來講一下第2個程序改進了哪些地方并且有什么用。

程序在此路徑中:源碼文檔圖片\源碼\源碼_20180321_添加傳感器\014_und_exception_014_004

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 第一個程序中uart0_init所在地址為300001e4

?

假設我們為NAND啟動,在清除了BSS段之后,我們的程序完全拷貝到SDRAM里了,如果我們的程序很大,那么uart0_init就有可能在4K之后,那么采用b1相對跳轉必定會出錯,所以我們必須使用絕對地址來跳轉到SDRAM上,修改代碼如下:

使用ldr偽指令實現絕對跳轉把程序跳轉到SDRAM上去,不過其實這種做法也有可能有“危險”,下面我們結合反匯編來看一下

第58行把地址為0X300000dc的內存的值300000b0賦給了pc,也就是使程序跳轉到了sdram:處的bl 300001f0,然后再跳轉到uart0_init。ldr偽指令的執行機制是這樣的:把sdram這個地址放到內存中,內存的地址由編譯器幫我們做好,一般放在.S匯編文件的最后,然后再把這個內存的值賦給pc實現絕對跳轉,倘若我們的.S文件大過4K,那豈不是也會出錯,其實我們可以人為地來修改這個內存的地址,我們可以這樣做(下面以未定義異常來舉例說明):

當我們程序出現未定義異常時,會自動跳轉到第7行的ldr pc, und_addr,該語句把und_addr(30000008)這個地址里的值(3000000c)賦給了pc,從而實現了絕對跳轉,可以看到,我們人為地加入了und_addr:就是把存放要賦給pc的值的內存放到前面來(僅僅在_start:之后,_start:段存放的信息很少,所以不會出現上面用ldr偽指令存在的問題)

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384546.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于NOR FLASH地址左右移的問題

問題引入:不知道你會不會有這樣的疑問:為什么在發送解鎖命令時,我們不用右移一位,而發送扇區地址時卻要右移一位(nor_cmd函數內部已經左移一位),這里先補充說明一下說明是cpu角度和nor角度&…

在linux下利用ls命令進行模糊查找

如上圖,我們當前路徑下有三個文件,分別為helloworld.c以及helloworld和1.c,直接輸入命令ls則顯示所有文件,我們可以利用ls 加*的方向進行模糊查找。 輸入ls 目錄名 形式的命令行,則是對該目錄名下的文件全部進行顯示&a…

Makefile常見符號意思

Makefile里有許許多多的符號,對于新手而言如果沒有經常使用,就很容易忘記,所以我把常見符號的意義寫下,方便日后忘記查詢。本文章會持續更新... 1.$:代表目標;$^代表所有依賴,$^代表第一個依賴。…

Linux下串口通信詳解

https://blog.csdn.net/u010783226/article/details/73369097

fstat、stat和lstat 區別

nt fstat(int filedes, struct stat *buf); int stat(const char *path, struct stat *buf); int lstat(const char *path, struct stat *buf); 一眼就能看出來fstat的第一個參數是和另外兩個不一樣的,fstat區別于另外兩個系統調用的地方在于,fstat系…

Linux的幀緩沖設備

Linux的幀緩沖設備 幀緩沖(framebuffer)是 Linux 為顯示設備提供的一個接口,把顯存抽象后的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行讀寫操作。這種操作是抽象的,統一的。用戶不必關心物理顯存的…

Linux下沒有包含頭文件(不知是哪個)導致編譯無法通過的解決心得

最近寫程序的時候編譯出錯了,提示信息為:invalid use of undefined type fb_var_screeninfo。顯示根據英文知道是沒有定義 fb_var_screeninfo這個類型,明顯是缺少了某個頭文件,但是缺少哪個頭文件以及有什么又快又好的解決方法呢&…

gcc編譯缺少數學庫

Linux下編譯出現以下提示可以在編譯的后面加上-lm,例如,arm-none-linux-gnueabi-gcc -o example1 example1.c -lm,意思就是添加數學庫的意思,編譯就能通過了 example1.c:(.text0x3e8): undefined reference to cos example1.c:(.…

Linux編譯程序時加-I指定頭文件位置

Linux下編譯出現以下錯誤,錯誤的原因是在/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/usr/include/freetype/config/下找不到ftheader.h,而我到該目錄下看,發現路徑是這樣的rootubuntu:/usr/local/arm/arm-2009q3/arm-non…

樹莓派遠程監控的實現

原文:https://blog.csdn.net/ayz123456/article/details/79252923 http://shumeipai.nxez.com/2016/09/01/raspberry-pi-motion-cameras-for-remote-monitoring.html https://blog.csdn.net/wto882dim/article/details/82195001 https://blog.csdn.net/qq_3950082…

公網訪問樹莓派

公網訪問樹莓派控制小車 上篇已經介紹了小車在局域網中的控制方法,比較簡單,既然是遠程遙控那就要能夠進行公網訪問,使得你的小車可以在任何有網絡的地方都能訪問到,并且后續還會加上攝像頭,進行實時監控,想…

關于對象的引用作為參數,可以直接訪問私有成員的問題

#include using namespace std; class CPoint { public:CPoint(int xx, int yy){x xx;y yy;}CPoint(const CPoint &p){x p.x;y p.y;} private:int x, y; };首先,我們來看一個例子,在CPoint這個類中定義了兩個構造函數,第一個為普通的…

僵死進程的產生以及解決辦法

本文參考自:https://baike.baidu.com/item/%E5%83%B5%E5%B0%B8%E8%BF%9B%E7%A8%8B/1036577?fraladdin 一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數據…

樹莓派第一次開機自動連接WIFI(不用顯示屏方法)

當我們把樹莓派系統鏡像燒錄到SD卡之后,我們在windows看到的TF卡變成了空間很小的名為boot的盤,我們在此目錄下新建一個名為wpa_supplicant.conf空白文件,并在其中加入以下代碼: countryGB ctrl_interfaceDIR/var/run/wpa_supplicant GROUPn…

樹莓派設置靜態IP的好處與壞處

網上后很多資源教初學者如何設置靜態IP,但我覺得設置靜態IP也有不好的地方: 首先,好處就是樹莓派的IP不會變,例如你設置了無線連接方式的靜態IP為192.168.1.110,那么無論你連接哪個路由器,或者連接同一個路…

關于源文件用不同的編碼方式編寫,會導致執行結果不一樣的現象及解決方法

如果我們編寫以下程序,并分別另存為ANSI和UTF-8兩種不同的編碼方式保存,放到Linux下編譯并運行如下圖,兩端相同的程序以不同的編碼方式保存編譯后的運行結果不一樣,./ansi采用ANSI編碼方式,會自動采用GBK方式來保存中文…

引入寬字符error: converting to execution character set: Invalid or incomplete multibyte or wide character

版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/qq_26093511/article/details/60593240 交叉編譯.c文件,遇到如下問題 arm-linux-gcc -o…

linux交叉編譯時報錯:file not recognized: File format not recognized

版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/u011113596/article/details/80325081 今天交叉編譯sqlite3,make的時候報錯:…