問題タブ [cmsis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - STM32 CMSIS FreeRTOS: ISR から BinrarySemaphore を解放するときに configASSERT がトリガーされる
UART のアクティビティが終了したことをタスクに通知することになっている UART アイドル割り込みがあります。
このために、BinarySemaphore を使用しています。この場合は、最大カウントが 1 のセマフォです。
セマフォ解放関数を呼び出すとosSemaphoreRelease(semaphore_id_uart4_rx);
次のアサートがトリガーされるため、アプリケーションが停止します。
マクロは次のconfigASSERTように展開されます
現在、pxQueue->pcHead の値は 0 であり、pxQueue->pcTail の値は 0 ではありません。したがって、アサートがトリガーされます。
このアサートの上のコメントは、これが ISR からの MUTEX の使用をキャッチするためのものであることを示しています。ただし、私は MUTEX を使用しておらず、 BinarySemaphore を使用しています! FreeRTOS FAQ 自体は、ISR とタスク間の同期にセマフォまたは BinarySemaphores を使用することを推奨しています。それが私がやっていることです。しかし、バイナリ セマフォが MUTEX として検出され、この問題が発生します。STM32CubeMX RTOS 構成から MUTEX を無効にしてみましたが、それでも MUTEX として検出されてクラッシュします。
FreeRTOS リアルタイム組み込みソフトウェア アプリケーションのバイナリ セマフォ
バイナリ セマフォとミューテックスは非常に似ていますが、いくつかの微妙な違いがあります。ミューテックスには優先順位の継承メカニズムが含まれていますが、バイナリ セマフォには含まれていません。これにより、同期 (タスク間またはタスクと割り込みの間) の実装にはバイナリ セマフォが適し、単純な相互排除の実装にはミューテックスが適しています。
STM32F429ZIT6 を搭載した NUCLEO-F429ZI ボードを使用しています。CubeMX バージョン: 4.27.0、ファームウェア パッケージ名とバージョン: STM32Cube FW_F4 V1.21.0
コード:
主な機能:
ISR:
ISR から呼び出される関数: