我們使用Micrium的uC/OS-III RTOS。 我們試圖在RTOS上返回malloc的值。 當我們在RTOS啓動之前做一個99999的malloc(RAM太多)時,我們得到一個空指針,這正是我們所期望的。Micrium的μC/ OS-III RTOS中的Malloc
當我們在RTOS啓動時和任務中執行相同的malloc時,我們不會收到空指針,這是我們不期望的。 儘管此時系統確實凍結。
有沒有人對此有過解釋?
在此先感謝
編輯:
對於信息:我們使用瑞薩的RX62N微控制器和GNURX編譯
程序實際上不會凍結。該程序'認爲'它得到一個有用的指針(不是NULL指針),並繼續運行。在某一點上,程序將其程序計數器更改爲00000000並停止。所以它沒有進入Exception,因此我們無法捕捉它。
但是,在RTOS啓動和RTOS啓動之前調用malloc時會有所不同。不同之處在於深度彙編代碼爲malloc。
在某點以下的指令當我們試圖分配太多的RAM BGTU.B指令不應分支,然後程序繼續ADD指令執行
CMP R1,R7
BGTU.B 0FFF802C0H
ADD R14,R7
。當在啓動RTOS之前執行malloc,並且在之後執行時失敗時,此功能完好。
These are the values I get in several cases
Outside RTOS (allocable number: 10)
R1: 00008348
R7: 00000014
Outside RTOS (not allocable number: 9999)
R1: 00008348
R7: 00002718
Inside RTOS (allocable number: 10)
R1: FFFFF9D0
R7: 00000014
Inside RTOS (not allocable number: 9999)
R1: FFFFF9D0
R7: 00002718
我希望整個情況是清楚的,我試圖解釋它一樣好,我可以:P提前
感謝
它「凍結」在哪裏?你的調試器告訴你關於位置和調用堆棧的信息?根據您的目標,無效的地址訪問可能會導致異常。默認的異常處理程序通常是空循環 - 實現更有用的東西。請注意,malloc()和free()通常本質上不是線程安全的。一些庫提供鉤子來使用操作系統的互斥體使一些非線程安全的函數成爲線程安全的。檢查你的庫文檔。 – Clifford
查看頂部克利福德的編輯! = D – Davey
該分支取決於CMP操作的結果,因此您不得不問自己爲什麼分支(這是因爲R1> R7),而是爲什麼R1和R7中的值與您預期的不同。 – Clifford