Micrium の uC/OS-III RTOS を使用しています。RTOS で malloc の戻り値を取得しようとしています。RTOS が開始される前に 99999 の malloc を実行すると (RAM に対して多すぎる)、null ポインターが返されます。これは想定どおりです。
RTOS の開始時およびタスク内でこれと同じ malloc を実行すると、予期しない null ポインターが返されません。ただし、この時点でシステムはフリーズします。
誰もこれについて説明がありますか?
前もって感謝します
編集:
情報については、ルネサスの RX62N マイクロコントローラーと GNURX コンパイラーを使用しています。
プログラムは実際にはフリーズしません。プログラムは、(NULL ポインターではなく) 有用なポインターを取得したと「考え」、実行を続けます。ある時点で、プログラムはそのプログラム カウンターを 00000000 に変更して停止します。そのため、例外に入らないため、キャッチできません。
ただし、RTOS が起動する前にmallocが呼び出される場合と、RTOS が起動される場合とでは、何かが異なります。違いは、 mallocの非常に深いアセンブリ コードにあります。
ある時点で、次の命令が実行されます
CMP R1,R7
BGTU.B 0FFF802C0H
ADD R14,R7
あまりにも多くの RAM を割り当てようとしている場合、BGTU.B命令は分岐せず、プログラムはADD命令を続行します。これは、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
前もって感謝します