こんにちはチーム、
これは、LPC55S69のハードフォールトの問題に関するものです。
私はC ++プロジェクトを作成し、プロジェクトの変更を実装しました。その一環として、C++ STLライブラリの機能を利用しています。
以下はコードスニペットです。
I have an enum defined with few CMD codes,
typedef enum
{
CMD_INVALID = 0x9999,
CMD_0 = 0x0000,
CMD_1 = 0x0001,
CMD_2 = 0x0002,
CMD_3 = 0x0003,
CMD_4 = 0x0004,
CMD_5 = 0x0005,
CMD_6 = 0x0006,
CMD_7 = 0x0007,
CMD_8 = 0x0008,
CMD_9 = 0x0009,
}CMD_CODES;
I have initialized the map container
std::map<:string> Protocol::commands_map;
In an initialization routine, inserting the elements
commands_map.emplace( std::string( "CMD1" ), CMD_1);
commands_map.emplace( std::string( "CMD2" ), CMD_2 );
commands_map.emplace( std::string( "CMD3" ), CMD_3 );
commands_map.emplace( std::string( "CMD4" ), CMD_4 );
commands_map.emplace( std::string( "CMD5" ), CMD_5 );
commands_map.emplace( std::string( "CMD6" ), CMD_6 );
commands_map.emplace( std::string( "CMD7" ), CMD_7 );
commands_map.emplace( std::string( "CMD8" ), CMD_8 );
commands_map.emplace( std::string( "CMD9" ), CMD_9 );この初期化後、他のタスクを実行します。
しかし、要素の挿入中に初期化ルーチンでハードフォールトエラーが発生しています。私はここで何が起こっているのか疑問に思っています。
誰かが私に知らせてもらえますか、問題は何ですか?
よろしくお願いします。
San
説明をありがとう@ErichStyger、@Harry_Zhang、それは非常に役に立ちます。
さらに、FreeRTOS の各タスクのスタックサイズは、xTaskCreate() API コールのパラメータとして割り当てられます。
Hi @sushmasan ,
ヒープとスタック(MSP)の両方のサイズは、MCUXpresso IDEのリンカ設定で簡単に変更できます(リンカファイルの変更は必要ありません)。MPSスタックがマークされた設定は次のとおりです。
PSP(プロセススタックポインタ)については、これはスレッドのスタックに使用されます。設定は、使用するRTOSによって異なります。たとえば、FreeRTOSの場合は、次のように定義する設定です。
#define configTOTAL_HEAP_SIZE (32*1024)お役に立てば幸いです。
Erich
Hi @sushmasan
MCUXpresso プロジェクトでメイン スタック ポインター (MSP) とプロセス スタック ポインター (PSP) のスタック サイズを増やすには、通常、プロジェクトのリンカー スクリプトまたは関連する構成設定を変更する必要があります。これを行う方法は次のとおりです。
1. ヒープ サイズの定義を確認する
ヒープ・サイズも変更する必要がある場合は、ヒープの同様の定義を探します。
__HeapBase = ____;
__HeapLimit = __StackLimit;
The heap size is usually defined by the difference between __HeapBase と __HeapLimit になります。必要に応じて、これらの定義を適宜調整します。
2. MSPおよびPSPスタックサイズの調整
MSPはデフォルトで使用され、通常はRAMの上部から割り当てられます。FreeRTOS などのリアルタイムオペレーティングシステム (RTOS) を使用している場合、PSP はタスクに使用され、そのサイズは RTOS 設定によって管理されます。ベアメタル アプリケーションの場合、通常はリンカ スクリプトの MSP 調整で十分です。
RTOS ベースのアプリケーションの場合:
• MSP スタック サイズ: リンカ スクリプトによって制御されます (上記のとおり)。
• PSP スタックサイズ: RTOS 設定 (多くの場合、FreeRTOSConfig.h で定義) によって調整されます。または同様の設定ファイル。
BR
掛ける
コードのデバッグ中に気付いたのは、ヒープサイズが100%に非常に近い増加していることで、これはハードフォールトがトリガーされるときです。割り当てられたスタックとヒープサイズを確認したとき、それは4KBであり、それが失敗の原因でした。ヒープサイズを 8KB に構成した後、コードは問題なく動作しました。使用したヒープサイズは約6.2KBでした。
あなたが言ったように、MSP、PSPスタックのためにもっとスペースを試してみてください。どうすればいいですか?
私にはスタックオーバーフローの可能性があります。MSPおよびPSPスタック用により多くのスペースを予約してみてください。
それ以外:これは私が使用しているハードフォールトハンドラです:
https://github.com/ErichStyger/McuOnEclipseLibrary/blob/master/lib/src/McuHardFault.c
お役に立てば幸いです。
Erich