Visiem sveiciens.
Pirms kÄda laika mÄs par to, kÄ mums izdevÄs palaist SIP tÄlruni uz STM32F4-Discovery ar 1 MB ROM un 192 KB RAM, balstÄ«tu uz . Å eit jÄsaka, ka tÄ versija bija minimÄla un savienoja divus telefons tieÅ”i bez servera un ar balss pÄrsÅ«tīŔanu tikai vienÄ virzienÄ. TÄpÄc mÄs nolÄmÄm palaist pilnvÄrtÄ«gÄku tÄlruni ar zvanu caur serveri, balss pÄrsÅ«tīŔanu abos virzienos, bet tajÄ paÅ”Ä laikÄ centÄmies iekļauties pÄc iespÄjas mazÄkÄ atmiÅas apjomÄ.

TÄlrunim tika nolemts izvÄlÄties lietotnes simple_pjsua , kas ir PJSIP bibliotÄkas sastÄvdaļa. TÄ ir minimÄla lietotne, kas spÄj reÄ£istrÄties serverÄ«, pieÅemt un atbildÄt uz zvaniem. ZemÄk es nekavÄjoties sniegÅ”u aprakstu, kÄ to palaist uz STM32F7-Discovery.
KÄ palaist
- KonfigurÄjam Embox
make confload-platform/pjsip/stm32f7cube - FailÄ conf/mods.config iestatÄm nepiecieÅ”amo SIP kontu.
include platform.pjsip.cmd.simple_pjsua_imported( sip_domain="server", sip_user="username", sip_passwd="password")kur serveris ā tas ir SIP serveris (piemÄram, sip.linphone.org), username un password ā lietotÄjvÄrds un parole no konta.
- SasmalcinÄm Embox ar komandu make. Par programmaparatÅ«ras palaiÅ”anu mums ir informÄcija uz un .
- Palaidiet konsolÄ Embox komandu āsimple_pjsua_importedā
00:00:12.870 pjsua_acc.c ....SIP ÄrÄjÄ statuss acc 0 nav aktÄ«vs 00:00:12.884 pjsua_acc.c ....sip:alexk2222@sip.linphone.org: reÄ£istrÄcija veiksmÄ«ga, statuss=200 (ReÄ£istrÄcija veiksmÄ«ga 00:00:12.911 pjsua_acc.c ....SaglabÄÅ”anas taimeris uzsÄkts akountam 0, galamÄrÄ·is:91.121.209.194:5060, intervÄls:15s - Beidzot, atliek ievietot skaļruÅus vai austiÅas audio izejÄ un runÄt diviem maziem MEMS mikrofoniem blakus ekrÄnam. Zvani no Linux caur lietotni simple_pjsua, pjsua. Nu, arÄ« var izmantot jebkuru citu, piemÄram, linphone.
Par to viss ir aprakstīts mūsu .
KÄ mÄs nonÄcÄm lÄ«dz tam
TÄtad, sÄkotnÄji tika uzdots jautÄjums par aparatÅ«ras platformas izvÄli. TÄ kÄ bija skaidrs, ka STM32F4-Discovery nebÅ«s pietiekami atmiÅas, tika izvÄlÄta STM32F7-Discovery. Tam ir 1 MB zibatmiÅa un 256 KB RAM (+ 64 speciÄlÄs ÄtrÄs atmiÅas, ko arÄ« izmantosim). ArÄ« tas nav daudz zvaniem caur serveri, bet nolÄmÄm pamÄÄ£inÄt piestÄt.
NosacÄ«ti uzdevumu sadalÄ«jÄm vairÄkos posmos:
- PJSIP palaiÅ”ana QEMU. Tas bija Ärti atkļūdot, plus mums jau bija atbalsts AC97 kodekam.
- Balss ierakstīŔana un atskaÅoÅ”ana QEMU un uz STM32.
- Lietotnes portÄÅ”ana simple_pjsua no PJSIP sastÄva. TÄ Ä¼auj reÄ£istrÄties SIP serverÄ« un zvanÄ«t.
- Izveidot savu serveri uz Asterisk bÄzes un testÄt uz tÄ, pÄc tam izmÄÄ£inÄt ÄrÄjos, piemÄram, sip.linphone.org
Embox skaÅa darbojas caur Portaudio, kas tiek izmantots arÄ« PISIP. QEMU parÄdÄ«jÄs pirmÄs problÄmas ā WAV faili uz 44100 Hz atskaÅojÄs labi, bet uz 8000 Hz kaut kas acÄ«mredzami nebija kÄrtÄ«bÄ. IzrÄdÄ«jÄs, ka problÄma bija frekvences iestatÄ«jumÄ ā pÄc noklusÄjuma aparatÅ«rÄ bija 44100, un mÄs to programmatiskÄ veidÄ nemainÄ«jÄm.
Å eit, iespÄjams, ir vÄrts nedaudz paskaidrot, kÄ vispÄr notiek skaÅas atskaÅoÅ”ana. SkaÅas kartei var iestatÄ«t kÄdu rÄdÄ«tÄju uz atmiÅas gabalu, no kura jÄatskaÅo vai jÄraksta iepriekÅ” noteiktÄ frekvencÄ. PÄc tam, kad buferis beidzas, tiek izsists pÄrtraukums, un izpilde turpinÄs ar nÄkamo buferi. ProblÄma ir tÄda, ka Å”os buferus ir jÄspÄj iepriekÅ” aizpildÄ«t, kamÄr tiek atskaÅots iepriekÅ”Äjais. Ar Å”o problÄmu mÄs vÄl sastapsimies turpmÄk STM32F7.
PÄc tam mÄs nomÄjÄm serveri un uz tÄ uzstÄdÄ«jÄm Asterisk. TÄ kÄ bija nepiecieÅ”ams daudz atkļūdot, un runÄt mikrofonÄ nevÄlÄjÄs, bija jÄveido automÄtiska atskaÅoÅ”ana un ieraksts. TÄpÄc mÄs labojÄm simple_pjsua, lai varÄtu pievienot failus vietÄ, kur parasti ir audio ierÄ«ces. PJSIP to izdara diezgan vienkÄrÅ”i, jo viÅiem ir jÄdziens ports, kas var bÅ«t gan ierÄ«ce, gan fails. Un Å”os portus var elastÄ«gi pieslÄgt citiem portiem. Kodu var skatÄ«t mÅ«su pjsip. . RezultÄtÄ shÄma bija Å”Äda. Asterisk serverÄ« es izveidoju divus kontus ā vienu Linux un vienu Embox. TÄlÄk, uz Embox tiek izpildÄ«ta komanda simple_pjsua_imported, Embox reÄ£istrÄjas serverÄ«, pÄc tam no Linux zvana uz Embox. Savienojuma brÄ«dÄ« pÄrbaudÄm Asterisk serverÄ«, vai viss savienojums ir izveidots, un pÄc kÄda laika mums jÄdzird skaÅa no Linux uz Embox, kamÄr Linux saglabÄ to failu, kas tiek atskaÅots no Embox.
PÄc tam, kad tas darbojas uz QEMU, mÄs pÄrgÄjÄm uz portÄÅ”anu uz STM32F7-Discovery. PirmÄ problÄma ā mÄs nepatilpÄm 1 MB ROM bez kompilatora optimizÄcijas ā-Osā attÄla izmÄra dÄļ. TÄpÄc ieslÄdzÄm ā-Osā. PÄc tam ar patch mÄs atslÄdzÄm C++ atbalstu, jo tas nepiecieÅ”ams tikai pjsua, bet mÄs izmantojam simple_pjsua.
PÄc tam, kad mÄs iekļÄvÄmies simple_pjsua, mÄs nolÄmÄm, ka Å”obrÄ«d ir iespÄja to palaist. Bet vispirms bija jÄnoskaidro ar ierakstīŔanu un skaÅas reprodukciju. JautÄjums ā kur ierakstÄ«t? MÄs izvÄlÄjÄmies ÄrÄjo atmiÅu ā SDRAM (128 MB). JÅ«s varat to izmÄÄ£inÄt paÅ”i:
Izveidos stereo WAV ar frekvenci 16000 Hz un ilgumu 10 sekundes:
record -r 16000 -c 2 -d 10000 -m C0000000
AtskaÅojam:
play -m C0000000
Å eit radÄs divas problÄmas. Pirmais ir ar kodeku ā tiek izmantots WM8994, un tajÄ ir tÄds jÄdziens kÄ slots, un Å”o slotu ir 4. TÄtad, pÄc noklusÄjuma, ja to nenosaka, tad, atskaÅojot audio, atskaÅoÅ”ana notiek visos Äetros slotos. TÄpÄc pie 16000 Hz mÄs saÅÄmÄm 8000 Hz, bet 8000 Hz atskaÅoÅ”ana vienkÄrÅ”i nedarbojÄs. Kad izvÄlÄjÄmies tikai slotus 0 un 2, tad darbojÄs kÄ vajag. VÄl viena problÄma bija audio interfeiss STM32Cube, kurÄ audio izeja darbojas caur SAI (Serial Audio Interface) sinhroni ar audio ieeju (nedziļinÄjos detaļÄs, bet iznÄk, ka viÅi dalÄs ar kopÄju pulksteni, un, inicializÄjot audio izeju, tÄ kaut kÄ piesaistÄs audio ieejai). Tas nozÄ«mÄ, ka palaist tos atseviŔķi nevar, tÄpÄc izdarÄ«jÄm Å”Ädi ā vienmÄr darbojas (tostarp tiek Ä£enerÄtas pÄrtraukumi) audio ieeja un audio izeja. Bet, kad sistÄmÄ nekas netiek atskaÅots, mÄs vienkÄrÅ”i ievietojam audio izejai tukÅ”u buferi, bet kad sÄkas atskaÅoÅ”ana, tad godÄ«gi sÄkam to piepildÄ«t.
TÄlÄk saskÄrÄmies ar to, ka skaÅa ierakstot balsi bija ļoti klusa. Tas notiek tÄpÄc, ka MEMS mikrofonu uz STM32F7-Discovery kaut kÄ slikti strÄdÄ pie frekvencÄm zem 16000 Hz. TÄpÄc iestata 16000 Hz, ja arÄ« nÄk 8000 Hz. Tam patiesÄ«bÄ bija jÄpapildina programmatÅ«ras pÄrvÄrÅ”ana no vienas frekvences uz citu.
TÄlÄk nÄcÄs palielinÄt kaudzes izmÄru, kas atrodas RAM. PÄc mÅ«su aprÄÄ·iniem, pjsip prasÄ«ja apmÄram 190 kB, bet mums palika tikai apmÄram 100 kB. Te nÄcÄs iesaistÄ«t nedaudz ÄrÄjÄs atmiÅas ā SDRAM (apmÄram 128 kB).
PÄc visÄm Ŕīm izmaiÅÄm es redzÄju pirmos paketus starp Linux un Embox un dzirdÄju skaÅu! Bet skaÅa bija briesmÄ«ga, gluži tÄda kÄ QEMU, neko nevarÄja saprast. TÄdÄjÄdi mÄs aizdomÄjÄmies, kÄda varÄtu bÅ«t problÄma. DebatÄjot, parÄdÄ«jÄs, ka Embox vienkÄrÅ”i neveic laiku, lai piepildÄ«tu/izsÅ«tÄ«tu audio buferus. KamÄr pjsip apstrÄdÄ vienu kadru, notika 2 pÄrtraukumi par buferu apstrÄdes pabeigÅ”anu, kas ir pÄrÄk daudz. PirmÄ doma par paÄtrinÄÅ”anu bija kompaktÄ optimizÄcija, bet tÄ jau bija ieslÄgta PJSIP. OtrÄ - aparatÅ«ras peldoÅ”Ä punkta, par to mÄs stÄstÄ«jÄm . TaÄu, kÄ parÄdÄ«jusi prakse, FPU nesniedza bÅ«tisku Ätruma palielinÄjumu. NÄkamais solis bija plÅ«smu prioritÄÅ”u noteikÅ”ana. Embox ir dažÄdas plÄnoÅ”anas stratÄÄ£ijas, un es iekļÄvu to, kas atbalsta prioritÄtes, un noteicu visaugstÄko prioritÄti audio plÅ«smÄm. Tas arÄ« nepalÄ«dzÄja.
NÄkamÄ ideja bija, ka mÄs strÄdÄjam ar ÄrÄjo atmiÅu, un bÅ«tu labi tur pÄrvietot struktÅ«ras, kurÄm piekļuve notiek ļoti bieži. Es veicu pirmotnÄju analÄ«zi par to, kad un kÄpÄc simple_pjsua notiek atmiÅas pieŔķirÅ”ana. IzrÄdÄ«jÄs, ka no 190 Kb pirmie 90 Kb tiek izmantoti iekÅ”ÄjÄm PJSIP vajadzÄ«bÄm, un piekļuve tiem notiek ne ļoti bieži. TurpinÄjumÄ, ienÄkoÅ”Ä zvana laikÄ tiek izsaukta funkcija pjsua_call_answer, kurÄ tad tiek pieŔķirti buferi darbam ar ienÄkoÅ”ajiem un izejoÅ”ajiem kadriem. Tas bija vÄl apmÄram 100 Kb. Un Å”eit mÄs rÄ«kojÄmies Å”Ädi. LÄ«dz zvana brÄ«dim datus novietojam ÄrÄjÄ atmiÅÄ. TiklÄ«dz zvans ā uzreiz nomainÄm kaudzi uz citu ā RAM. TÄdÄjÄdi visi ākarstieā dati tika pÄrvietoti ÄtrÄkÄ un paredzamÄkÄ atmiÅÄ.
TÄdÄjÄdi viss kopÄ Ä¼Äva palaist simple_pjsua un piezvanÄ«t caur savu serveri. Un pÄc tam jau arÄ« caur citiem serveriem, piemÄram, sip.linphone.org.
SecinÄjumi
TÄdÄjÄdi izdevÄs palaist simple_pjsua ar balss pÄrsÅ«tīŔanu abos virzienos caur serveri. ProblÄmu ar papildu patÄrÄtajiem 128 Kb SDRAM var atrisinÄt, izmantojot nedaudz jaudÄ«gÄku Cortex-M7 (piemÄram, STM32F769NI ar 512 Kb RAM), taÄu tajÄ paÅ”Ä laikÄ mÄs vÄl arvien neesam zaudÄjuÅ”i cerÄ«bas iekļauties 256 Kb š Mums bÅ«tu prieks, ja kÄds interesÄtos, bet vÄl labÄk ā izmÄÄ£inÄtu. Visi avoti, kÄ parasti, ir mÅ«su .
Avots: habr.com
