RTOS如何保證局部變數被編譯器分配到堆棧里?

rtos是否能運行和編譯器的關係很大,寫rtos的人又是從哪裡了解所用編譯器的一些內部機制的呢?


這個還是我來總結一下,這不應該算編譯器的問題,而是計算機體系結構和彙編指令設置約定俗稱的東西。。。。

1.通用的計算機cpu,都會有一個寄存器sp叫做棧指針。。

2.c語言函數調用被編譯成彙編都會看到sp值的變化,函數內部訪問局部變數,一般是通過sp指針當前地址,"間接"訪問的,所以局部變數剛開始都要初始化就是這個原因,它是用sp間接訪問,而不是保存在內存中運行後固定不變的地址單元,局部變數的實際地址會隨著函數調用而變化。。。

3.rtos系統loader之前,都會有一段boot代碼根據鏈接腳本,設置初始sp的值,不然調用函數可能會出問題。。。

4.rtos多線程管理切換,一般會有一個stack的數據結構,在被switch調度之前一刻,保存sp指針所指的棧地址空間的當前變數值,存放在特定的內存地址,這個東東叫做,context線程被switch回來之後,會根據線程號,找到這個stack結構,再拷貝到sp指針所指的幾個地址,相當於恢復切換前棧內的局部變數的值了。。。

5.總結,一般計算機體系都會設計好了,所以編譯器看到函數調用內的變數,直接就去改sp指針指的值就行了,就這樣。


局部變數一般來說有兩個分配的地方,要麼是寄存器要麼是棧,一般保護現場的時候,都會保護寄存器組和切換棧指針。


局部變數在堆棧中,但是一般會緩存在寄存器中。如何對應的,參考對應的編譯器手冊。

http://www.infineonic.org/techarticle/id-327299?p=1


RTOS的棧實際上還是一塊內存啊。不管編譯器把局部變數分配到哪,只要在切換任務的時候把局部變數複製到棧上不就好了。


每款處理器內核,官方都會公布運行環境和ABI細節文檔的。


trtos 可以實現


一般rtos是把局部產量分配到棧裡面的,你看一下彙編就知道了。不過說rtos分配的應該是錯的吧,局部產量都應該是編譯器分配的,如果rtos有內存管理功能,分配內存塊這些應該是由rtos完成的,而這些內存塊一般是在rtos管理的堆上面分配的。


看不出兩者之間有什麼必然關係。再不濟,如果連objdump反彙編都不會玩的人還搞什麼RTOS。


推薦閱讀:

如何評價中航計算機所研製的天脈操作系統?
FPGA在圖像處理中的哪一步起到重要作用?
是否可以用fpga搭建一個可以用的gpu模型?

TAG:C編程語言 | 彙編語言 | 嵌入式系統 | 單片機 | 實時操作系統 |