Telefon SIP në STM32F7-Discovery

Përshëndetje të gjithëve.

Para një kohë të gjatë, ne shkruam diskutuam se si arritëm të ndiznim një telefon SIP në STM32F4-Discovery me 1 MB ROM dhe 192 KB RAM mbi Embox. Duhet të themi se ajo version ishte minimale dhe lidhi dy telefona direkt pa server dhe me transmetim zëri vetëm në një drejtim. Prandaj, ne vendosëm të fillojmë një telefon më të plotë me thirrje përmes serverit, transmetim zëri në të dyja drejtime, por duke u përpjekur të përshtatemi në sa më pak hapësirë të mundshme.

Luaj videon

Për telefonin, vendosëm të zgjidhim 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 në thirrje. Më poshtë do t'ju jap menjëherë përshkrimin se si ta ndizni atë në STM32F7-Discovery.

Si të ndizni

  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Ă« server SIP (pĂ«r shembull, sip.linphone.org), username dhe password — emri i pĂ«rdoruesit dhe fjalĂ«kalimi pĂ«r llogarinĂ«.

  3. Kryejmë mbledhjen e Embox me komandën make. Për programimin e bordit kemi informacion në wiki dhe në artikullin.
  4. Në konsolë të Embox, ekzekutojmë komandën 'simple_pjsua_imported'
    
    00:00:12.870    pjsua_acc.c  ....Statusi SIP outbound për acc 0 nuk është aktiv
    00:00:12.884    pjsua_acc.c  ....sip:alexk2222@sip.linphone.org: regjistrimi i suksesshëm, statusi=200 (Regjistrimi sukses
    00:00:12.911    pjsua_acc.c  ....Koha për mbajtje e aktivizuar për acc 0, destinacioni:91.121.209.194:5060, intervali:15s
    

  5. Më në fund, mbetet të lidhni kolonat ose kufjet në daljen audio dhe të flisni në dy mikrofonet e vegjël MEMS afër ekranit. Po telefonojmë nga Linux përmes aplikacionit simple_pjsua, pjsua. Ose mund të përdorni çdo tjetër si linphone.

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

Si e arritëm këtë

Pra, origjinalisht u dha problemi i zgjedhjes së platformës harduerike. Duke qenë se ishte e qartë që STM32F4-Discovery nuk do të përshtatej për memorien, u zgjodh STM32F7-Discovery. Ajo ka 1 MB flash dhe 256 KB RAM (+ 64 KB memorie të shpejtë speciale, të cilën ne gjithashtu do ta përdorim). Edhe kjo nuk është shumë për telefonatat përmes serverit, por vendosëm ta provonim.

Kondicionalisht për vete e ndamë detyrën në disa faza:

  • Aktivizimi i PJSIP nĂ« QEMU. Ky ishte i pĂ«rshtatshĂ«m pĂ«r debugging, pĂ«rveç qĂ« atje kishim pĂ«rkrahjen e kodekĂ«ve AC97.
  • Regjistrimi i zĂ«rit dhe riprodhimi nĂ« QEMU dhe nĂ« STM32.
  • Portimi i aplikacionit simple_pjsua nga PJSIP. Ai lejon regjistrimin nĂ« serverin SIP dhe telefonatat.
  • Krijoni serverin tuaj tĂ« bazuar nĂ« Asterisk dhe testoni nĂ« tĂ«, pastaj provoni tĂ« jashtme, si sip.linphone.org

Toni nĂ« Embox funksionon pĂ«rmes Portaudio, i cili pĂ«rdoret gjithashtu nĂ« PISIP. NĂ« QEMU shfaqeshin problemet e para — WAV-tĂ« janĂ« luajtur mirĂ« nĂ« 44100 Hz, por nĂ« 8000 diçka me siguri nuk shkonte siç duhet. U zbulua se problemi ishte nĂ« konfigurimin e frekuencĂ«s — nĂ« harduerin tonĂ« ajo ishte 44100, dhe ne nuk e ndryshuam programatikisht.

Këtu, ndoshta, vlen të sqarojmë pak si ndodh luajtja e zërit. Kartës së zërit mund t'i vendoset një tregues në një copë memorie nga e cila duhet të luajë ose të regjistrojë në një frekuencë të caktuar paraprakisht. Pas përfundimit të treguesit, aktivizohet një ndërprerje dhe ekzekutimi vazhdon me treguesin e ardhshëm. Problemi është se këto tregues duhet të plotësohen me kohë, ndërsa luhet ai paraprak. Këtë problem do ta hasim më tej në STM32F7.

MĂ« pas, ne kemi qiruar njĂ« server dhe e kemi aktivizuar Asterisk aty. Duke pasur parasysh se duhej tĂ« bĂ«nim shumĂ« konfigurime dhe nuk dĂ«shironim tĂ« flisnim shumĂ« nĂ« mikrofon, duhej tĂ« bĂ«nim pajisje pĂ«r riprodhim dhe regjistrim automatik. PĂ«r kĂ«tĂ« qĂ«llim, ne e patch-uar simple_pjsua qĂ« tĂ« mund tĂ« futnim skedarĂ« si zĂ«dhĂ«nĂ«s. NĂ« PJSIP, kjo bĂ«het mjaft thjeshtĂ«, pasi ata kanĂ« konceptin e portit, i cili mund tĂ« jetĂ« ose njĂ« pajisje, ose njĂ« skedar. KĂ«ta porte mund tĂ« lidheshin fleksibĂ«l me porte tĂ« tjera. Mund ta shikoni kodin nĂ« pjsip tonĂ«. repozitoritNĂ« pĂ«rfundim, skema ishte si nĂ« vijim. NĂ« serverin Asterisk unĂ« krijova dy llogari — pĂ«r Linux dhe pĂ«r Embox. MĂ« pas, nĂ« Embox ekzekutohet komanda simple_pjsua_imported, Embox regjistrohet nĂ« server, pas çka ne telefonojmĂ« nga Linux nĂ« Embox. NĂ« momentin e lidhjes ne kontrollojmĂ« nĂ« serverin Asterisk qĂ« e gjithĂ« lidhja Ă«shtĂ« krijuar, dhe pas njĂ« kohe tĂ« caktuar, duhet tĂ« dĂ«gjojmĂ« nĂ« Embox zĂ«rin nga Linux, ndĂ«rsa nĂ« Linux ruajmĂ« skedarin qĂ« riprodhohet nga Embox.

Pasi qĂ« kjo funksionoi nĂ« QEMU, kaluar nĂ« portimin nĂ« STM32F7-Discovery. Problemi i parĂ« — nuk duhej tĂ« ngjitej nĂ« 1 MB ROM pa aktivizuar optimizimin e kompilerit "-Os" pĂ«r madhĂ«sinĂ« e imazhit. Prandaj aktivizuam "-Os". MĂ« pas, me njĂ« patch, fikĂ«m mbĂ«shtetje pĂ«r C++, pasi ajo Ă«shtĂ« e nevojshme vetĂ«m pĂ«r pjsua, ndĂ«rsa ne pĂ«rdorim simple_pjsua.

Pasi u organizuam simple_pjsua, vendosĂ«m se mundĂ«sia pĂ«r ta realizuar kĂ«tĂ« tani ekziston. Por sĂ« pari duhej tĂ« merreshim me regjistrimin dhe riprodhimin e zĂ«rit. Pyetja — ku tĂ« regjistrojmĂ«? ZgjodhĂ«m memorjen e jashtme — SDRAM (128 MB). Mund ta provoni kĂ«tĂ« vetĂ«:

Do të krijojë një WAV stereo me frekuencë 16000 Hz dhe një gjatësi prej 10 sekondash:


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

Po luajmë:


play -m C0000000

KĂ«tu u shfaqĂ«n dy probleme. E para ishte me kodekun — pĂ«rdoret WM8994, dhe ka njĂ« koncept si slot, dhe kĂ«to slot janĂ« 4. Pra, pĂ«r default, nĂ«se nuk konfigurohet ndonjĂ«herĂ«, gjatĂ« reproduktimit tĂ« zĂ«rit, luhet nĂ« tĂ« katĂ«r slotet. Prandaj, nĂ« frekuencĂ«n 16000 Hz merrnim 8000 Hz, ndĂ«rsa pĂ«r 8000 Hz, reproduktimi thjesht nuk funksiononte. Kur pĂ«rzgjodhĂ«m vetĂ«m slotet 0 dhe 2, filloi tĂ« punonte siç duhet. NjĂ« tjetĂ«r problem ishte interfata audio nĂ« STM32Cube, ku dalja audio funksionon pĂ«rmes SAI (Serial Audio Interface) nĂ« mĂ«nyrĂ« sinkrone me hyrjen audio (nuk u thellova nĂ« detaje, por del se ndajnĂ« orĂ«n e pĂ«rbashkĂ«t dhe gjatĂ« inicializimit tĂ« daljes audio, ndonjĂ«herĂ« lidhet me hyrjen audio). Pra, nuk mund tĂ« nisĂ«sh ato ndaras, prandaj bĂ«mĂ« kĂ«tĂ« — gjithmonĂ« punojnĂ« (pĂ«rfshirĂ« gjenerimin e ndĂ«rprerjeve) hyrja audio dhe dalja audio. Por kur nĂ« sistem nuk ka asgjĂ« qĂ« luhet, thjesht i japim daljes audio njĂ« tampon tĂ« zbrazĂ«t, dhe kur fillon luajtja, fillojmĂ« ta mbushim ndershĂ«m.

Pastaj u përballëm me faktin se zëri gjatë regjistrimit të zërit ishte shumë i qetë. Kjo ndodh për shkak se mikrofonët MEMS në STM32F7-Discovery nuk punojnë mirë në frekuenca më të ulëta se 16000 Hz. Prandaj, ne vendosim 16000 Hz, edhe nëse mbërrin 8000 Hz. Për këtë, megjithatë, nevojitej të shtonim një konvertim programor nga një frekuencë në një tjetër.

MĂ« pas, duhej tĂ« rrisnim madhĂ«sinĂ« e grumbullit qĂ« ndodhet nĂ« RAM. Sipas llogaritjeve tona, pjsip kĂ«rkonte rreth 190 Kb, ndĂ«rsa ne kishim mbetur vetĂ«m rreth 100 Kb. KĂ«shtu, u pĂ«rfshi pak memorie tĂ« jashtme — SDRAM (rreth 128 Kb).

Pas tĂ« gjithĂ« kĂ«tyre rregullimeve, pashĂ« paketat e para midis Linux-it dhe Embox-it, dhe dĂ«gjova zĂ«! Por zĂ«ri ishte i tmerrshĂ«m, krejt ndryshe nga QEMU, asgjĂ« nuk mund tĂ« kuptohej. AtĂ«herĂ« ne menduam se çfarĂ« mund tĂ« ishte problemi. Debugging tregoi se Embox thjesht nuk po arrinte tĂ« mbushte / shkarkonte buferat audio. NdĂ«rsa pjsip pĂ«rpunonte njĂ« kornizĂ«, ndodhnin dy ndĂ«rprerje pĂ«r pĂ«rfundimin e pĂ«rpunimit tĂ« buferave, qĂ« ishte shumĂ«. Mendimi i parĂ« pĂ«r tĂ« pĂ«rshpejtuar ishte optimizimi i kompilatorit, por ai ishte tashmĂ« i pĂ«rfshirĂ« nĂ« PJSIP. E dyta — pika fluturuese harduerike, pĂ«r tĂ« cilĂ«n ne kishim folur nĂ« artikullin. Por çfarĂ« tregoi praktika, FPU nuk dha njĂ« rritje tĂ« konsiderueshme nĂ« shpejtĂ«si. Hapi tjetĂ«r ishte caktimi i prioriteteve pĂ«r rrjedhat. NĂ« Embox ka strategji tĂ« ndryshme planifikimi, dhe unĂ« aktivizova atĂ« qĂ« mbĂ«shtet prioritetet, duke caktuar prioritetin mĂ« tĂ« lartĂ« pĂ«r rrjedhat audio. Kjo gjithashtu nuk ndihmoi.

Ideja tjetĂ«r ishte qĂ« ne po punonim me memorie tĂ« jashtme dhe do tĂ« ishte mirĂ« ta transferonim struktura atje, pĂ«r tĂ« cilat ka shpesh qasje. UnĂ« kryeva njĂ« analizĂ« paraprake se kur dhe pĂ«r çfarĂ« simple_pjsua ndan memorie. Doli se nga 190 Kb, 90 Kb e para ndahen pĂ«r nevojat e brendshme tĂ« PJSIP dhe pĂ«r to ka qasje jo shumĂ« tĂ« shpeshta. MĂ« pas, gjatĂ« njĂ« thirrjeje, thirret funksioni pjsua_call_answer, nĂ« tĂ« cilin pastaj ndahen bufferat pĂ«r punĂ«n me frame-t e ardhshĂ«m dhe tĂ« dĂ«rguar. Kjo ishte gjithashtu rreth 100 Kb. Dhe kĂ«tu ne vepruam kĂ«shtu. Para momentit tĂ« thirrjes, tĂ« dhĂ«nat pozicionohen nĂ« memorie tĂ« jashtme. Sa herĂ« qĂ« ndodhte thirrja, menjĂ«herĂ« zĂ«vendĂ«sonim heap-in me njĂ« tjetĂ«r - nĂ« RAM. KĂ«shtu, tĂ« gjitha tĂ« dhĂ«nat “tĂ« nxehta” u transferuan nĂ« njĂ« memorie mĂ« tĂ« shpejtĂ« dhe mĂ« tĂ« parashikueshme.

Në përfundim, të gjithë këto së bashku lejuan nisjen simple_pjsua dhe të telefononi përmes serverit tuaj. Pastaj, përmes serverëve të tjerë si sip.linphone.org.

Përfundimet

NĂ« pĂ«rfundim, arritĂ«m tĂ« aktivizojmĂ« simple_pjsua me transmetimin e zĂ«rit nĂ« tĂ« dy drejtimet pĂ«rmes serverit. Problemi me 128 Kb SDRAM tĂ« shpenzuar mĂ« shumĂ« mund tĂ« zgjidhet duke pĂ«rdorur njĂ« Cortex-M7 pak mĂ« tĂ« fuqishĂ«m (p.sh., STM32F769NI me 512 Kb RAM), por ende nuk e kemi braktisur shpresĂ«n tĂ« kalojmĂ« edhe nĂ« 256 Kb 🙂 Do tĂ« na gĂ«zojĂ« nĂ«se dikush Ă«shtĂ« i interesuar, dhe akoma mĂ« mirĂ« — provon. TĂ« gjithĂ« burimet ndodhen si zakonisht nĂ« repozitorit.

Burimi: habr.com

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