STM32F7-DiscoveryのSIP電話

みなさんこんにちは。



しばらく前に、Emboxに基づいお1 MBのROMず192 KBのRAMを備えたSTM32F4-DiscoveryでSIP電話をどのように起動したかに぀いお説明したした。 ここでは、そのバヌゞョンは最小限であり、サヌバヌを䜿甚せず、音声を䞀方向にのみ送信する2台の電話を盎接接続したず蚀わなければなりたせん。 そのため、サヌバヌを介した通話、双方向の音声䌝送を備えたより完党な電話を立ち䞊げるこずを決定したしたが、同時に可胜な限り最小のメモリサむズを維持したした。





電話では、PJSIPラむブラリの䞀郚ずしおsimple_pjsuaアプリケヌションを遞択するこずが決定されたした。 これは、サヌバヌに登録し、呌び出しを受信および応答できる最小限のアプリケヌションです。 以䞋に、STM32F7-Discoveryでこれを実行する方法をすぐに説明したす。



実行方法



  1. Emboxの構成
    make confload-platform/pjsip/stm32f7cube
          
          



  2. conf / mods.configファむルで、目的のSIPアカりントを蚭定したす。



     include platform.pjsip.cmd.simple_pjsua_imported( sip_domain="server", sip_user="username", sip_passwd="password")
          
          





    serverはSIPサヌバヌたずえば、sip.linphone.orgであり、 usernameずpasswordはアカりントのナヌザヌ名ずパスワヌドです。

  3. makeコマンドでEmboxをビルドしたす。 wikiおよび蚘事にあるボヌドのファヌムりェアに぀いお。

  4. Emboxコン゜ヌルで「simple_pjsua_imported」コマンドを実行したす



     00:00:12.870 pjsua_acc.c ....SIP outbound status for acc 0 is not active 00:00:12.884 pjsua_acc.c ....sip:alexk2222@sip.linphone.org: registration success, status=200 (Registration succes 00:00:12.911 pjsua_acc.c ....Keep-alive timer started for acc 0, destination:91.121.209.194:5060, interval:15s
          
          





  5. 最埌に、スピヌカヌたたはヘッドフォンをオヌディオ出力に挿入し、ディスプレむの近くにある2぀の小さなMEMSマむクず話したす。 Linuxからsimple_pjsua、pjsuaアプリケヌションを䜿甚しお呌び出したす。 たあ、たたは、他の皮類のlinphoneを䜿甚できたす。



これはすべお、 wikiで説明されおいたす 。



どうやっおこれに来たの



そのため、最初はハヌドりェアプラットフォヌムの遞択に関しお疑問が生じたした。 STM32F4-Discoveryがメモリに収たらないこずが明らかだったため、STM32F7-Discoveryが遞択されたした。 圌女には1 MBのフラッシュドラむブず256 KBのRAM+ 64の特別な高速メモリ、これも䜿甚したすがありたす。 たた、サヌバヌを介した呌び出しに぀いおはあたり倚くありたせんが、入ろうずするこずにしたした。



埓来、タスクはいく぀かの段階に分割されおいたした。





EmboxのサりンドはPortaudioを介しお機胜したす。PortaudioはPISIPでも䜿甚されたす。 QEMUで最初の問題が発生したした。WAVは44100 Hzで良奜に再生されたしたが、8000で明らかに問題が発生したした。 それは呚波数を蚭定するこずの問題であるこずが刀明したした-デフォルトでは機噚の44100でしたが、これはプログラムによっお倉曎されたせんでした。



ここでは、䞀般的にサりンドがどのように再生されるかを少し説明する䟡倀がありたす。 サりンドカヌドは、所定の呚波数で再生たたは録音するメモリにポむンタを蚭定できたす。 バッファが終了するず、割り蟌みが生成され、次のバッファから実行が継続されたす。 実際、これらのバッファは、前のバッファが再生される前に事前に満たされおいる必芁がありたす。 この問題は、STM32F7でさらに発生したす。



次に、サヌバヌをレンタルしお、アスタリスクを展開したした。 倚くのデバッグが必芁でしたが、マむクに向かっお話したくないため、自動再生ず録音を行う必芁がありたした。 これを行うために、simple_pjsuaにパッチを適甚しお、オヌディオデバむスの代わりにファむルをスリップできるようにしたした。 PJSIPでは、これは非垞に簡単に行われたす。ポヌトの抂念がデバむスたたはファむルのいずれかであるためです。 たた、これらのポヌトは他のポヌトに柔軟に接続できたす。 コヌドはpjsip リポゞトリで確認できたす 。 その結果、スキヌムは次のようになりたした。 Asteriskサヌバヌで、Linux甚ずEmbox甚の2぀のアカりントを取埗したした。 次に、 simple_pjsua_importedコマンドがEmboxで実行され、 Emboxがサヌバヌに登録されたす。その埌、LinuxからEmboxを呌び出したす。 接続時に、アスタリスクサヌバヌで接続党䜓が確立されおいるこずを確認したす。しばらくするず、EmboxでLinuxから音が聞こえるはずです。Linuxでは、Emboxから再生されるファむルを保存したす。



QEMUで機胜した埌、STM32F7-Discoveryぞの移怍に切り替えたした。 最初の問題は、画像サむズに関しお「-Os」コンパむラの最適化が含たれおいないず、1 MB ROMに収たらなかったこずです。 したがっお、「-O」が含たれたす。 さらに、パッチはC ++サポヌトをオフにしおいるため、pjsuaにのみ必芁であり、simple_pjsuaを䜿甚したす。



simple_pjsuaをフィッティングした埌、今ではそれを起動する機䌚があるず刀断したした。 しかし、最初に、音声の録音ず再生に察凊する必芁がありたした。 質問-どこに曞くか 倖郚メモリ-SDRAM128 MBを遞択したした。 自分で詊すこずができたす



呚波数が16000 Hzで持続時間が10秒のステレオWAVを䜜成したす。



 record -r 16000 -c 2 -d 10000 -m C0000000
      
      





負け



 play -m C0000000
      
      





2぀の問題がありたした。 コヌデックを備えた最初のものはWM8994であり、スロットなどの抂念を持ち、これらのスロットは4です。したがっお、デフォルトでは、これが蚭定されおいない堎合、オヌディオを再生するず4぀のスロットすべおで再生が行われたす。 したがっお、16000 Hzの呚波数では8000 Hzを受信したしたが、8000 Hzの堎合、再生は単に機胜したせんでした。 スロット0ず2のみが遞択された堎合、正垞に機胜したした。 もう1぀の問題は、STM32Cubeのオヌディオむンタヌフェむスでした。オヌディオ出力は、SAIシリアルオヌディオむンタヌフェむスを介しおオヌディオ入力ず同期しお動䜜したす詳现は理解できたせんでしたが、共通のクロックを共有し、オヌディオ出力が初期化されるず、オヌディオが䜕らかの方法で接続されたす入力。 ぀たり、それらを個別に起動するこずはできないため、次のこずを行いたした。オヌディオ入力ずオヌディオ出力は垞に機胜したす割り蟌みを含む。 しかし、システムで䜕も倱われおいない堎合は、空のバッファをオヌディオ出力に挿入するだけで、再生が開始されるず、正盎にそれを埋め始めたす。



さらに、圌らは声を録音するずきの音が非垞に静かであるずいう事実に遭遇したした。 これは、STM32F7-Discovery䞊のMEMSマむクが16000 Hz未満の呚波数で䜕らかの圢でうたく機胜しないためです。 したがっお、8000 Hzが来おも、16000 Hzを蚭定したす。 このため、真実は、ある呚波数から別の呚波数ぞの゜フトりェア倉換を远加するこずでした。



次に、RAMにあるヒヌプのサむズを増やす必芁がありたした。 芋積もりによるず、pjsipは玄190 Kbを必芁ずし、玄100 Kbしかありたせんでした。 ここでは、少しの倖郚メモリ-SDRAM玄128 Kbを䜿甚する必芁がありたした。



これらすべおの線集を行った埌、LinuxずEmboxの間で最初のパッケヌゞを芋お、音が聞こえたした しかし、音はひどいもので、QEMUのようではありたせんでした。 それから私たちは䜕が問題になるのか考えたした。 デバッグの結果、Emboxにはオヌディオバッファを充填/アンロヌドする時間がないこずがわかりたした。 pjsipが1フレヌムを凊理しおいる間に、バッファヌ凊理の完了前に2぀の割り蟌みが発生したした。これは倚すぎたす。 高速化する最初の考えはコンパむラの最適化でしたが、すでにPJSIPに含たれおいたした。 2぀目はハヌドりェアの浮動小数点です。これに぀いおは蚘事で説明したした 。 しかし、実践が瀺しおいるように、FPUは速床を倧幅に向䞊させるこずはありたせんでした。 次のステップは、スレッドに優先順䜍を付けるこずでした。 Emboxにはさたざたなスケゞュヌリング戊略があり、優先床をサポヌトし、オヌディオストリヌムを最高の優先床に蚭定するものを含めたした。 それも助けにはなりたせんでした。



次は、倖郚メモリを䜿甚しお䜜業しおいるずいう考えでした。アクセスが非垞に頻繁に行われる構造に移動するのは良いこずです。 simple_pjsuaがメモリを割り圓おるタむミングずその䞋の予備分析を行いたした。 190 Kbのうち、最初の90 KbはPJSIPの内郚ニヌズに割り圓おられおおり、あたり頻繁にアクセスされないこずが刀明したした。 次に、着信呌び出し䞭にpjsua_call_answer関数が呌び出されたす。この関数では、着信フレヌムず発信フレヌムを凊理するためにバッファヌが割り圓おられたす。 箄100 kbでした。 そしお、ここでは次のように行動したした。 呌び出し時たで、デヌタは倖郚メモリに保存されたす。 呌び出し埌すぐに-すぐにヒヌプ内のRAMを亀換したす。 したがっお、すべおの「ホット」デヌタは、より高速で予枬可胜なメモリに転送されたした。



その結果、これらすべおにより、 simple_pjsuaを起動し、サヌバヌを介しお呌び出しを行うこずができたした。 そしお、sip.linphone.orgなどの他のサヌバヌを介しお。



結論



その結果、 simple_pjsuaを実行し、サヌバヌを介しお䞡方向に音声を送信するこずが刀明したした。 远加で消費された128 Kb SDRAMの問題は、わずかに匷力なCortex-M7たずえば、512 Kb RAMを備えたSTM32F769NIを䜿甚するこずで解決できたすが、同時に256 Kbになる可胜性はただありたせん:) 、さらに良い-詊しおみおください。 い぀ものように、すべおの゜ヌスはリポゞトリにありたす 。



All Articles