これは、PSoC Advent Calendar 2017の3日目に突っ込まれた記事です。
##前回のあらすじ
前回の記事では、ふたつのCPUが互いにセマフォを取り合って待ち時間を作ることで、Lチカを実現しました。しかし、Cortex-M4とCortex-M0+でセマフォの取りやすさに違いがあることから、Cortex-M4が連続してセマフォを独占する現象が観測されました。
これを解決するために、セマフォを解放したあと相手にセマフォを取らせるための時間を確保する方法をとっています。「セマフォを取らせるための時間」は適当に3μ秒と定義したのですが、条件が異なると時間が足りなくなる可能性もあるので、決して確実な方法とは言えません。
今回は、相手方がセマフォを獲得したことを検出して、より確実なLチカを行います。
##ちょっとだけ変更
コンセプトは、相手方がセマフォを獲得した事を知ることです。そこで、セマフォ関連関数のCy_IPC_Sema_Status()
で状態を確認します。Cortex-M0+とCortex-M4のそれぞれのプログラムで、セマフォを解放した後の処理を変更します。
/* セマフォを開放する */
while (
Cy_IPC_Sema_Clear(SEMAPHORE_LED, false) != CY_IPC_SEMA_SUCCESS
) ;
/* セマフォが引き渡されるまで待つ */
while (
Cy_IPC_Sema_Status(SEMAPHORE_LED) != CY_IPC_SEMA_STATUS_LOCKED
) ;
/* セマフォを開放する */
while (
Cy_IPC_Sema_Clear(SEMAPHORE_LED, false) != CY_IPC_SEMA_SUCCESS
) ;
/* セマフォが引き渡されるまで待つ */
while (
Cy_IPC_Sema_Status(SEMAPHORE_LED) != CY_IPC_SEMA_STATUS_LOCKED
) ;
どちらのCPUでも、同じ記述です。
この方法にも、もちろん問題点があります。
- セマフォを渡した相手方の処理が短時間で済んでしまいすぐにセマフォを解放した場合、"CY_IPC_SEMA_STATUS_LOCKED"を検出できなくなるので、デッドロック状態が発生します。今回の場合、セマフォを獲得する時間が500m秒と大幅に長いので、この心配はありません。
- セマフォが引き渡されるまでのあいだ、CPUは遊んでいます。セマフォが他人に獲得されるのを待つようなプログラムは、そもそも書くべきではないでしょう。
次回に向けての課題が出てきたところで、本日はここまで。
##関連文献
AN215656 – PSoC 6 MCU Dual-Core CPU System Design
CE216795 - PSoC(R) 6 MCU Dual-Core Basics