Telefon SIP në STM32F7-Discovery

Përshëndetje të gjithëve.

Disa kohë më parë ne kemi shkruar flasim për mënyrën si arritëm të lancojmë telefonin SIP në STM32F4-Discovery me 1 MB ROM dhe 192 KB RAM) duke u bazuar në Embox. Këtu duhet të përmendet se ajo version ishte minimale dhe lidhte dy telefona direkt pa server dhe me transmetim zëri vetëm në një drejtim. Prandaj, vendosëm të lancojmë një telefon më të plotë me telefonatat përmes serverit, transmetimin e zërit në të dy drejtimet, por duke u përpjekur të zgjidhnim sa më pak hapësirë të memories.

Luaj videon

Për telefonin u vendos të zgjedhim aplikacionin simple_pjsua në përbërje të bibliotekës PJSIP. Ky është një aplikacion minimal që di të regjistrohet në server, të pranojë dhe të përgjigjet telefonatave. Më poshtë do të jap përshkrimin se si ta lancojmë në STM32F7-Discovery.

Si të lancojmë

  1. Konfigurojmë Embox
    make confload-platform/pjsip/stm32f7cube
  2. Në skedarin conf/mods.config përcaktojmë llogarinë SIP të nevojshme.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ku server — ky Ă«shtĂ« serveri SIP (p.sh., sip.linphone.org), username dhe password — emri i pĂ«rdoruesit dhe fjalĂ«kalimi pĂ«r llogarinĂ«.

  3. Ndërtojmë Embox me komandën make. Më shumë për programimin e bordit kemi në wiki dhe në artikulli ynë.
  4. LançojmĂ« nĂ« konsolĂ«n e Embox komandĂ«n “simple_pjsua_imported”
    
    00:00:12.870    pjsua_acc.c  ....Statusi i daljes SIP për acc 0 nuk është aktiv
    00:00:12.884    pjsua_acc.c  ....sip:alexk2222@sip.linphone.org: regjistrimi i suksesshëm, status=200 (Regjistrimi i suksesshëm
    00:00:12.911    pjsua_acc.c  ....Taktimi mbajtur për acc 0, destinacioni:91.121.209.194:5060, intervali:15s
    

  5. Në fund, mbetet të vendosim kolonat ose kufjet në daljen audio dhe të flasim në dy mikrofonat e vegjël MEMS pranë ekranit. Telefonojmë nga Linux me aplikacionin simple_pjsua, pjsua. Ose mund të përdorim çdo aplikacion tjetër si linphone.

E gjithë kjo është e përshkruar në wiki.

Si arritëm këtu

Pra, nĂ« fillim u shtrua pyetja e zgjedhjes sĂ« platformĂ«s harduerike. Duke qenĂ« se ishte e qartĂ« qĂ« STM32F4-Discovery nuk do tĂ« pĂ«rshtatej pĂ«r shkak tĂ« memories, u zgjodh STM32F7-Discovery. Ajo ka 1 MB flash dhe 256 KB RAM (+ 64 KB memorie tĂ« veçantĂ« tĂ« shpejtĂ«, tĂ« cilat do t’i pĂ«rdorim gjithashtu). Po ashtu, nuk Ă«shtĂ« shumĂ« pĂ«r thirrje pĂ«rmes serverit, por vendosĂ«m tĂ« provojmĂ« tĂ« pĂ«rfshihemi.

Kondicionalisht, ne ndamë detyrat në disa etapa:

  • Lancimi i PJSIP nĂ« QEMU. Kjo ishte e pĂ«rshtatshme pĂ«r debugim dhe po ashtu kishim mbĂ«shtetje pĂ«r kodekĂ«t AC97.
  • Regjistrimi i zĂ«rit dhe riprodhimi nĂ« QEMU dhe nĂ« STM32.
  • Portimi i aplikacionit simple_pjsua nga biblioteka PJSIP. Ajo lejon tĂ« regjistrohemi nĂ« serverin SIP dhe tĂ« telefonojmĂ«.
  • TĂ« zhvillojmĂ« serverin tonĂ« tĂ« vetĂ«ngjitur nĂ« bazĂ« tĂ« Asterisk dhe ta testojmĂ« atje, pas kĂ«saj tĂ« provojmĂ« ato tĂ« jashtme, si sip.linphone.org

ZĂ«ri nĂ« Embox funksionon pĂ«rmes Portaudio, i cili pĂ«rdoret gjithashtu nĂ« PISIP. NĂ« QEMU dolĂ«n problemet e para — WAV duke u luajtur mirĂ« nĂ« 44100 Hz, por nĂ« 8000 diçka dukej qartĂ« se nuk po shkonte si duhet. U zbulua se problemi ishte te konfigurimi i frekuencĂ«s — nĂ« pajisje ishte 44100 si parazgjedhje, dhe ne nuk e ndryshuam kĂ«tĂ« programatikisht.

Këtu, ndoshta, është mirë të sqarojmë se si ndodh luajtja e zërit. Kartës së zërit mund t'i caktohet një tregues në një copë memorie, nga e cila duhet të luhet ose të regjistrohet në një frekuencë të vendosur paraprakisht. Pasi buferi të përfundojë, gjenerohet një ndërprerje, dhe ekzekutimi vazhdon nga buferi tjetër. Problemi është se këto buferë duhet të mbushen përpara, ndërsa luhet i pari. Ne do të përballemi me këtë problem më vonë në STM32F7.

MĂ« pas, ne morĂ«m me qira njĂ« server dhe implementuam Asterisk nĂ« tĂ«. Duke qenĂ« se duhej tĂ« bĂ«nim shumĂ« debugging, dhe nuk dĂ«shironim tĂ« flisnim shumĂ« nĂ« mikrofon, ishte e nevojshme tĂ« bĂ«hej luajtja dhe regjistrimi automatik. PĂ«r kĂ«tĂ«, ne e patch-ojmĂ« simple_pjsua nĂ« mĂ«nyrĂ« qĂ« tĂ« mund tĂ« injectonim skedarĂ«t nĂ« vend tĂ« pajisjeve audio. NĂ« PJSIP bĂ«het mjaft thjeshtĂ«, pasi ata kanĂ« konceptin e portit, i cili mund tĂ« jetĂ« si pajisje, ashtu edhe skedar. Dhe kĂ«to porte mund tĂ« lidheshin nĂ« mĂ«nyrĂ« fleksibile me porte tĂ« tjera. Mund tĂ« shihni kodin nĂ« pjsip tonĂ«. repotitĂ« e tij. NĂ« fund, skema ishte si mĂ« poshtĂ«. NĂ« serverin Asterisk krijova dy llogari — pĂ«r Linux dhe pĂ«r Embox. MĂ« pas nĂ« Embox ekzekutohet komanda simple_pjsua_imported, Embox regjistrohet nĂ« server, pas tĂ« cilĂ«s nga Linux telefonojmĂ« nĂ« Embox. NĂ« momentin e lidhjes kontrollojmĂ« nĂ« serverin Asterisk se tĂ« gjitha lidhjet janĂ« vendosur, dhe pas njĂ« kohe duhet tĂ« dĂ«gjojmĂ« nĂ« Embox zĂ«rin nga Linux, ndĂ«rsa nĂ« Linux ruajmĂ« atĂ« skedarin qĂ« luhet nga Embox.

Pasi qĂ« kjo funksionoi nĂ« QEMU, kaluam nĂ« portimin nĂ« STM32F7-Discovery. Problemi i parĂ« — nuk po ndiznim nĂ« 1 MB ROM pa aktivizuar optimizimin e kompilatorit “-Os” pĂ«r shkak tĂ« madhĂ«sisĂ« sĂ« imazhit. Prandaj aktivizuam “-Os”. MĂ« pas, me patch çaktivizuam mbĂ«shtetje pĂ«r C++, sepse ajo Ă«shtĂ« e nevojshme vetĂ«m pĂ«r pjsua, ndĂ«rsa ne pĂ«rdorim simple_pjsua.

Pasi e vendosĂ«m simple_pjsua, vendosĂ«m se tani kemi shanse ta lansojmĂ«. Por fillimisht duhej tĂ« merremi me regjistrimin dhe riprodhimin e zĂ«rit. Pyetja — ku tĂ« regjistrojmĂ«? Zgjedhim memorien e jashtme — SDRAM (128 MB). Mund ta provoni vetĂ«:

Do të krijojë WAV stereo me frekuencë 16000 Hz dhe zgjatje 10 sekonda:


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

Po luajmë:


play -m C0000000

KĂ«tu dolĂ«n dy probleme. E para ishte me kodekĂ«t — pĂ«rdorej WM8994, dhe aty ka njĂ« koncept qĂ« quhet slot, dhe kĂ«to slote janĂ« 4. Pra, nĂ« default, nĂ«se nuk e konfigurojmĂ«, gjatĂ« luajtjes sĂ« audios, luajtja ndodhte nĂ« tĂ« katra slotet. Prandaj, nĂ« frekuencĂ«n 16000 Hz, ne merrnim 8000 Hz, dhe pĂ«r 8000 Hz luajtja thjesht nuk funksiononte. Kur zgjodhĂ«m vetĂ«m slotet 0 dhe 2, atĂ«herĂ« funksionoi si duhet. NjĂ« tjetĂ«r problem ishte ndĂ«rfaqja audio nĂ« STM32Cube, ku dalja audio funksionon pĂ«rmes SAI (Serial Audio Interface) nĂ« mĂ«nyrĂ« sinçkronike me hyrjen audio (nuk u thellova nĂ« detaje, por duket se ndajnĂ« orĂ«n e pĂ«rbashkĂ«t dhe gjatĂ« inicializimit tĂ« daljes audio, somehow lidhet me hyrjen audio). Pra, nuk mund tĂ« nisen ato veçmas, prandaj bĂ«mĂ« si mĂ« poshtĂ« — gjithmonĂ« funksionojnĂ« (pĂ«rfshirĂ« gjenerimin e ndĂ«rprerjeve) hyrja audio dhe dalja audio. Por kur nĂ« sistem nuk luhet asgjĂ«, ne thjesht i ofrojmĂ« daljes audio njĂ« buffer bosh, dhe kur niset luajtja, atĂ«herĂ« ndershĂ«m fillojmĂ« ta mbushim.

Më vonë u ndeshëm me faktin se zëri gjatë regjistrimit të zërit ishte shumë i ulët. Kjo ndodh për shkak se mikrofonat MEMS në STM32F7-Discovery punojnë dobët në frekuenca më të ulta se 16000 Hz. Pra, vendosim 16000 Hz, edhe nëse vjen 8000 Hz. Për këtë, vërtet duhej të shtonim një konvertim programor të një frekuence të një për të tjetër.

MĂ« pas duhej tĂ« rrisja madhĂ«sinĂ« e heap-it, i cili ndodhet nĂ« RAM. Sipas llogaritjeve tona, pjsip kĂ«rkonte rreth 190 Kb, ndĂ«rsa ne kishim mbetur vetĂ«m rreth 100 Kb. KĂ«tu duhej tĂ« angazhonim pak memorie tĂ« jashtme — SDRAM (rreth 128 Kb).

Pas tĂ« gjitha kĂ«tyre ndryshimeve, pashĂ« paketat e para midis Linux-it dhe Embox-it, dhe dĂ«gjova zĂ«rin! Por zĂ«ri ishte tmerrĂ«sisht i qartĂ«, aspak si nĂ« QEMU, asgjĂ« nuk mund tĂ« kuptohej. AtĂ«herĂ« u menduam se çfarĂ« mund tĂ« ishte problemi. Debugging tregoi se Embox thjesht nuk arrinte tĂ« mbushte/bojkotojĂ« bufferat audio. NdĂ«rsa pjsip pĂ«rpunonte njĂ« frame, ndodhnin 2 ndĂ«rprerje pĂ«r pĂ«rfundimin e pĂ«rpunimit tĂ« bufferave, qĂ« ishte shumĂ«. Mendimi i parĂ« pĂ«r pĂ«rshpejtim ishte optimizimi i kompajlerit, por ai ishte tashmĂ« i aktivizuar nĂ« PJSIP. E dyta — pika e flotimit harduerik, pĂ«r tĂ« cilĂ«n kemi treguar nĂ« artikulli ynĂ«. Por çfarĂ« tregoi praktika, FPU nuk dha njĂ« rritje tĂ« rĂ«ndĂ«sishme nĂ« shpejtĂ«si. Hapi tjetĂ«r ishte vendosja e prioriteteve pĂ«r rrjedhat. NĂ« Embox ka strategji tĂ« ndryshme planifikimi, dhe unĂ« aktivizova atĂ« qĂ« mbĂ«shtet prioritete, duke i caktuar rrjedhave audio prioritetin mĂ« tĂ« lartĂ«. Edhe kjo nuk ndihmoi.

Ideja tjetĂ«r ishte se ne po punonim me memorie tĂ« jashtme dhe do tĂ« ishte mirĂ« ta transferonim strukturat qĂ« aksesohen shumĂ« shpesh atje. UnĂ« bĂ«ra njĂ« analizĂ« paraprake tĂ« kohĂ«s dhe tĂ« cilave pĂ«r tĂ« cilat simple_pjsua ndan memorie. Doli se nga 190 Kb, 90 Kb e para ndahen pĂ«r nevojat e brendshme tĂ« PJSIP dhe aksesi ndaj tyre ndodhte jo shumĂ« shpesh. MĂ« pas, gjatĂ« njĂ« thirrjeje hyrĂ«se, thirret funksioni pjsua_call_answer, ku mĂ« pas ndahen tamponĂ«t pĂ«r punĂ« me fletĂ« hyrĂ«se dhe dalĂ«se. Kjo ishte edhe rreth 100 Kb. Dhe kĂ«tu ne vepruam si mĂ« poshtĂ«. Para momentit tĂ« thirrjes, tĂ« dhĂ«nat ato i vendosim nĂ« memorien e jashtme. Sa herĂ« qĂ« bĂ«het thirrja — menjĂ«herĂ« zĂ«vendĂ«sojmĂ« pile me njĂ« tjetĂ«r — nĂ« RAM. KĂ«shtu, tĂ« gjitha tĂ« dhĂ«nat "nĂ« ngrohje" u transferuan nĂ« njĂ« memorie mĂ« tĂ« shpejtĂ« dhe mĂ« tĂ« parashikueshme.

Si rezultat, të gjithë këto së bashku na lejuan të nisim simple_pjsua dhe të bëjmë thirrje përmes serverit tonë. Pastaj edhe përmes serverëve të tjerë si sip.linphone.org.

Përfundimet

Si rezultat, arritĂ«m tĂ« fillojmĂ« simple_pjsua me transmetim tĂ« zĂ«rit nĂ« tĂ« dyja anĂ«t pĂ«rmes serverit. Problemi me 128 Kb SDRAM tĂ« shpenzuar shtesĂ« mund tĂ« zgjidhet duke pĂ«rdorur njĂ« Cortex-M7 pak mĂ« tĂ« fuqishĂ«m (p.sh., STM32F769NI me 512 Kb RAM), por akoma nuk e kemi hequr dorĂ« nga shpresa pĂ«r tĂ« hyrĂ« nĂ« 256 Kb 🙂 Do tĂ« ishim tĂ« lumtur nĂ«se dikush interesoheshin, dhe mĂ« mirĂ« — ta provojĂ«. TĂ« gjithĂ« burimet, si zakonisht, janĂ« nĂ« repotitĂ« e tij.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster