嵌入式開發學習(9)<彙編寫啟動代碼之設定棧和調用c語言>

來源:互聯網
上載者:User

標籤:設定   time   部分   嵌入式開發   一段   開發   代碼   c程式   硬體   

C語言運行時需要和棧的意義:

  “C語言運行時(runtime)”需要一定的條件,這些條件由彙編來提供。C語言運行時主要是需要棧
 C語言與棧的關係:C語言中的局部變數都是用棧來實現的。如果我們彙編部分沒有給C部分預先設定合理合法的棧地址,那麼C代碼中定義的局部變數就會落空,整個程式就死掉了。
 我們平時在編寫單片機程式(譬如51單片機)或者編寫應用程式時並沒有去設定棧,但是C程式還是可以啟動並執行。原因是:在單片機中由硬體初始化時提供了一個預設可用的棧,在應用程式中我們編寫的C程式其實並不是全部,編譯器(gcc)在連結的時候會幫我們自動添加一個頭,這個頭就是一段引導我們的C程式能夠執行的一段彙編實現的代碼,這個代碼中就幫我們的C程式設定了棧及其他的運行時需要。

CPU模式和各種模式下的棧:

  在ARM中37個寄存器中,每種模式下都有自己的獨立的SP寄存器(r13),為什麼這麼設計?
 如果各種模式都使用同一個SP,那麼就意味著整個程式(作業系統核心程式、使用者自己編寫的應用程式)都是用一個棧的。你的應用程式如果一旦出錯(譬如棧溢出),就會連累作業系統的棧也損壞,整個作業系統的程式就會崩潰。這樣的作業系統設計是非常脆弱的,不合理的。
 解決方案就是各種模式下用不同的棧。我的作業系統核心使用自己的棧,每個應用程式也使用自己獨立的棧,這樣各是各的,一個損壞不會連累其他人。
 我們現在要設定棧,不可能也懶的而且也沒有必要去設定所有的棧,我們先要找到自己的模式,然後設定自己的模式下的棧到合理合法的位置,即可。
 注意:系統在複位後預設是進入SVC模式的
 我們如何訪問SVC模式下的SP呢?很簡單,先把模式設定為SVC,再直接操作SP。但是因為我們複位後就已經是SVC模式了,所以直接設定SP即可。

S5PV210 的Memory Map 如:

  

嵌入式開發學習(9)<彙編寫啟動代碼之設定棧和調用c語言>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.