SIP Telefon op STM32F7-Discovery

Salut alleguer.

Virun enger Zäit hu mir geschriwwen iwwer wéi mir et fäerdeg bruecht hunn e SIP Telefon op STM32F4-Discovery mat 1 MB ROM an 192 KB RAM ze starten) baséiert op Embox. Hei muss gesot ginn, datt dës Versioun minimal war an zwee Telefone direkt ouni Server a mat Stëmmiwwerdroung nëmmen an eng Richtung verbonne sinn. Dofir, decidéiert mir eng méi komplett Telefon mat engem Opruff duerch e Server ze starten, Stëmm Transmissioun an zwou Richtungen, mä gläichzäiteg fit an déi klengst méiglech Erënnerung Gréisst.


Et gouf decidéiert eng Applikatioun fir den Telefon ze wielen einfach_pjsua als Deel vun der PJSIP Bibliothéik. Dëst ass eng minimal Applikatioun déi sech um Server ka registréieren, Uruff kréien an beäntweren. Hei ënnen wäert ech direkt eng Beschreiwung ginn wéi dëst op der STM32F7-Discovery lafen.

Wéi starten

  1. Embox konfiguréieren
    make confload-platform/pjsip/stm32f7cube
  2. An der conf/mods.config Datei setzen mir den erfuerderleche SIP Kont.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    wou Server ass e SIP Server (zum Beispill sip.linphone.org), Benotzernumm и Passwuert - Benotzernumm a Passwuert fir de Kont.

  3. Mir sammelen d'Embox mat engem Team maachen. Mir hunn Informatiounen iwwert Verwaltungsrot Firmware op Wiki an a Artikel.
  4. Run de Kommando "simple_pjsua_imported" an der Embox Konsole
    
    00:00:12.870    pjsua_acc.c  ....SIP outbound status for acc 0 is not active
    00:00:12.884    pjsua_acc.c  ....sip:[email protected]: 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. Endlech ass alles wat bleift ass Spriecher oder Kopfhörer an den Audioausgang anzeginn, a schwätzt an zwee kleng MEMS Mikrofonen nieft dem Display. Mir ruffe vu Linux mat der Applikatioun simple_pjsua, pjsua. Gutt, oder Dir kënnt all aner Typ vu Linphone benotzen.

All dëst ass op eisem beschriwwen Wiki.

Wéi si mer hei ukomm

Also, am Ufank ass d'Fro opgestan iwwer d'Wiel vun enger Hardwareplattform. Well et kloer war datt d'STM32F4-Discovery net fir d'Erënnerung gëeegent wier, gouf de STM32F7-Discovery gewielt. Si huet eng 1 MB Flash fueren an 256 KB RAM (+ 64 speziell séier Erënnerung, déi mir wäerten och benotzen). Et ass och net vill fir Uriff duerch de Server, awer mir hu beschloss ze probéieren eran ze kommen.

Konventionell ass d'Aufgab an e puer Etappen opgedeelt:

  • Lafen PJSIP op QEMU. Et war praktesch fir Debugging, plus hu mir schonn Ënnerstëtzung fir den AC97 Codec do.
  • Stëmmopnam a Wiedergabe op QEMU a STM32.
  • D'Applikatioun portéieren einfach_pjsua vum PJSIP. Et erlaabt Iech op engem SIP Server anzeschreiwen an Uriff ze maachen.
  • Deploy Ären eegene Server baséiert op Asterisk an testt et, a probéiert dann extern, wéi sip.linphone.org

Sound an Embox funktionnéiert iwwer Portaudio, wat och am PISIP benotzt gëtt. Déi éischt Problemer erschéngen op QEMU - WAVs goufe gutt bei 44100 Hz gespillt, awer um 8000 war eppes kloer falsch. Et huet sech erausgestallt, datt de Problem am Kader vun der Frequenz war - Par défaut an der Ausrüstung war et 44100, a mir hunn dëst net an der Software geännert.

Hei ass et wahrscheinlech derwäert e bëssen z'erklären wéi Toun am Allgemengen gespillt gëtt. D'Soundkaart kann e puer Zeiger op e Stéck Erënnerung setzen, aus deem se op enger virbestëmmter Frequenz gespillt oder opgeholl muss ginn. Nodeems de Puffer erausgeet, gëtt en Ënnerbriechung generéiert an d'Ausféierung geet weider vum nächste Puffer. De Punkt ass datt dës Puffer am Viraus gefëllt musse ginn, während dee virdrun gespillt gëtt. Mir wäerten dëse Problem weider op der STM32F7 begéinen.

Als nächst hu mir e Server gelount an Asterisk drop ofgesat. Well et vill Debugging ze maachen war, an ech wollt net vill an de Mikro schwätze, war et néideg automatesch Playback an Opnam ze maachen. Fir dëst ze maachen, hu mir simple_pjsua patchéiert sou datt mir Dateien anstatt Audiogeräter kéinte setzen. Am PJSIP gëtt dat ganz einfach gemaach, well se d'Konzept vun engem Hafen hunn, deen entweder en Apparat oder eng Datei ka sinn. An dës Häfen kënnen flexibel mat anere Häfen verbonne ginn. Dir kënnt de Code an eisem pjsip gesinn Repositories. Als Resultat war de Schema wéi follegt. Ech hunn zwee Konten um Asterisk Server erstallt - fir Linux a fir Embox. Als nächst gëtt de Kommando op Embox ausgefouert simple_pjsua_importéiert, Embox registréiert op de Server, duerno ruffe mir Embox vu Linux. Am Moment vun der Verbindung kontrolléiere mir op den Asterisk Server datt déi ganz Verbindung etabléiert ass, a no enger Zäit sollte mir den Sound vu Linux an der Embox héieren, an am Linux späichere mir d'Datei déi vun der Embox gespillt gëtt.

Wann dëst op QEMU geschafft huet, si mir weidergaange fir et op d'STM32F7-Discovery ze portéieren. Den éischte Problem war datt mir net an 1 MB ROM passen kënnen ouni d'"-Os" Compiler Optimisatioun fir Bildgréisst aktivéiert. Dofir hu mir "-Os" abegraff. Als nächst huet de Patch d'Ënnerstëtzung fir C ++ behënnert, sou datt et nëmme fir pjsua gebraucht gëtt, a mir benotzen simple_pjsua.

No der Plazéierung einfach_pjsua, decidéiert, datt et elo eng Chance war et ze lancéieren. Awer fir d'éischt hu mir erausfonnt wéi een Stëmmen opgeholl a spillt. Fro: wou ze schreiwen? Mir hunn extern Erënnerung gewielt - SDRAM (128 MB). Dir kënnt dëst selwer probéieren:

Erstellt e Stereo WAV mat enger Frequenz vun 16000 Hz an enger Dauer vun 10 Sekonnen:


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

Mir verléieren:


play -m C0000000

Hei waren zwee Problemer. Deen éischten ass mam Codec - WM8994 gëtt benotzt, an et huet sou eppes wéi e Slot, an et gi 4 vun dësen Slots Also, par défaut, wann dëst net konfiguréiert ass, dann wann Dir Audio spillt, geschitt alles véier Plaze . Dofir hu mir op enger Frequenz vun 16000 Hz 8000 Hz kritt, awer fir 8000 Hz Playback huet einfach net geschafft. Wann mir ausgewielt nëmmen Plaze 0 an 2, et geschafft wéi erwaart. En anere Problem war d'Audio-Interface am STM32Cube, an deem d'Audiooutput duerch SAI (Serial Audio Interface) synchron mam Audio-Input funktionnéiert (ech hunn d'Detailer net verstanen, awer et stellt sech eraus datt se eng gemeinsam Auer deelen a beim initialiséieren den Audioausgang, Audio ass iergendwéi un d'Entrée gebonnen). Dat ass, et ass onméiglech se separat auszeféieren, also hu mir déi folgend gemaach - den Audioinput an den Audioausgang funktionnéieren ëmmer (inklusiv Ënnerbriechungen ginn generéiert). Awer wann näischt am System spillt, rutsche mir einfach en eidele Puffer an den Audioausgang, a wann d'Playback ufänkt, fänken mir éierlech un ze fëllen.

Dunn hu mir d'Tatsaach begéint datt den Toun beim Opnam vun der Stëmm ganz roueg war. Dëst ass wéinst der Tatsaach datt d'MEMS Mikrofonen op der STM32F7-Discovery iergendwéi net gutt bei Frequenzen ënner 16000 Hz funktionnéieren. Dofir setze mir et op 16000 Hz, och wann 8000 Hz kënnt. Fir dëst ze maachen, war et awer néideg fir Software Konversioun vun enger Frequenz op eng aner ze addéieren.

Als nächst musse mir d'Gréisst vum Koup erhéijen, deen am RAM läit. No eise Berechnungen erfuerdert pjsip ongeféier 190 KB, a mir haten nëmmen ongeféier 100 KB lénks. Hei hu mir e bësse extern Erënnerung ze benotzen - SDRAM (ongeféier 128 KB).

No all dësen Ännerungen hunn ech déi éischt Packagen tëscht Linux an Embox gesinn, an den Toun héieren! Awer de Sound war schrecklech, guer net wéi op QEMU, näischt konnt héieren ginn. Dunn hu mir eis gefrot, wat kéint de Fall sinn. Debugging huet gewisen datt d'Embox einfach keng Zäit huet fir Audiobuffer ze fëllen / ze lueden. Wärend pjsip ee Frame veraarbecht, sinn 2 Ënnerbriechungen iwwer d'Fäerdegstellung vun der Pufferveraarbechtung geschitt, wat ze vill ass. Meng éischt Gedanken fir Speedup war Compiler Optimisatioun, awer dat war schonn am PJSIP abegraff. Déi zweet ass Hardware Schwemmpunkt, mir hunn doriwwer geschwat Artikel. Awer wéi d'Praxis gewisen huet, huet FPU keng bedeitend Erhéijung vun der Geschwindegkeet geliwwert. Den nächste Schrëtt war thread Prioritéiten ze setzen. Embox huet verschidde Fuerplangstrategien, an ech hunn deen aktivéiert deen Prioritéite ënnerstëtzt an den Audiostreamen déi héchst Prioritéit ginn. Dëst huet och net gehollef.

Déi nächst Iddi war datt mir mat externem Gedächtnis schaffen an et wier gutt Strukturen dohinner ze plënneren, déi extrem oft zougänglech sinn. Ech hunn eng virleefeg Analyse gemaach wéini an ënner wat einfach_pjsua verdeelt Erënnerung. Et huet sech erausgestallt datt aus 190 KB déi éischt 90 KB fir d'intern Bedierfnesser vun PJSIP zougewisen sinn an net ganz dacks zougänglech sinn. Als nächst, wärend engem erakommend Uruff, gëtt d'Funktioun pjsua_call_answer genannt, an där Puffer dann zougedeelt ginn fir mat erakommen an erausgaang Frames ze schaffen. Et war nach ongeféier 100 KB. An dann hu mir déi folgend gemaach. Bis den Uruff gemaach gëtt, ginn d'Donnéeën an der externer Erënnerung gespäichert. Soubal den Uruff schellt, ersetzen mir direkt de Koup mat engem aneren am RAM. Sou goufen all déi "waarm" Donnéeën op méi séier a méi prévisibel Erënnerung transferéiert.

Als Resultat, all dëst zesummen erlaabt eis ze starten einfach_pjsua an ruffen duerch Äre Server. An dann duerch aner Serveren wéi sip.linphone.org.

Conclusiounen

Um Enn war et méiglech ze starten einfach_pjsua mat Stëmm Iwwerdroung a béid Richtungen iwwer de Server. De Problem mat engem zousätzleche 128 KB vun SDRAM kann duerch e bësse méi mächteg Cortex-M7 geléist ginn (zum Beispill, STM32F769NI mat 512 KB vun RAM), mä mir hunn nach net opginn Hoffnung vun fit an 256 KB :) Mir wäerten sidd frou wann een interesséiert ass, oder besser nach, probéiert et. All Quellen, wéi gewinnt, sinn an eisem Repositories.

Source: will.com

Setzt e Commentaire