記事の主なリファレンス:https://blog.csdn.net/killercode11/article/details/104290949、これは
rt_hw_console_getchar()
定義を参照しています。
この記事では、RT-Threadのシリアルポート構成については紹介していません。必要に応じて、以下を参照してください。シリアルポートをrt_kprintf関数に再マップする
FinSHソースコードをプロジェクトに追加します
FinSHソースコードは、RT-Threadソースコードcomponents\finsh\
ディレクトリにあります。
プロジェクトにインポートします。特定の操作はここでは紹介されません。ヘッダーファイルをインクルードすることを忘れないでください。
FinSHを有効にする
変更rtconfig.h
、開くfinsh config
、以下はConfiguration Wizard
ウィザード、
実際には、finsh_fonfig.h
ヘッダーます。このヘッダーファイルには、FisSHの基本的なパラメーター構成が含まれています。
端末読み取り機能を定義する
FinSHソースコードを移植した後、通常、最初のコンパイルでエラーが報告され、弱められた関数の#error行rt_hw_console_getchar()
をあります(最初にファイルの読み取り専用属性をオフにすることを忘れないでください)。
board.c
次にrt_hw_console_getchar()
、ファイル内の関数を手動で再定義します。関数の内容は次のとおりです。これは標準ライブラリバージョンです。HALライブラリバージョンが必要な場合は、記事の冒頭にあるリンクを参照してください。
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
if(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) != RESET)
{
//USART_ClearITPendingBit(USART_DEBUG, USART_FLAG_RXNE);
ch = USART_ReceiveData(DEBUG_USARTx) & 0xFF;
}
else
{
if(USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_ORE) != RESET)
{
USART_ClearITPendingBit(DEBUG_USARTx, USART_FLAG_ORE);
}
rt_thread_mdelay(10);
}
return ch;
}
FinSHを体験する
SSCOMを端末として使用していますが、効果は悪くありません。コマンドは表示ウィンドウに直接入力されます。
PuTTyやXShellなどの一般的な端末ソフトを使わない理由を聞かれる方もいらっしゃるかもしれませんが、使いたいのですが、端末ソフトを接続すると開発ボードが動作しなくなります。
発生した問題
1.セグメンテーション違反
このエラーには、RT_MAIN_THREAD_STACK_SIZE
小さすぎるます。デフォルト値の21よりRT_THREAD_PRIORITY_MAX
も小さい小さすぎる(8に設定のみ)ように設定したため、解決策は、スレッドの優先度(値)を変更することです。 FINSHを小さい値にFINSH_THREAD_PRIORITY
変更するか、システム優先順位の最大値(値の範囲)を大きい値に変更します。
2.ターミナルツールは印刷できません
PuTTy、XShellを使用すると、端末が応答せず、ボードがスタックします。予備分析の理由は、「パンクチュアアトミックワンキーダウンロード回路とターミナルツールの競合」(インターネット上の他の結論)であるため、シリアルデバッグアシスタントはFinshの操作にのみ使用できます。
3.プログラムが実行されない
この問題にはさまざまな理由が考えられますが、FinSHを使用する場合は、シリアルポート割り込みを開くことができないことに注意してください。理由については、まだ理解していません。