Pirms kÄda laika mÄs ŠæŠøŃŠ°Š»Šø par to, kÄ mums izdevÄs palaist SIP tÄlruni STM32F4-Discovery ar 1 MB ROM un 192 KB RAM), pamatojoties uz Embox. Te gan jÄsaka, ka tÄ versija bija minimÄla un savienoja divus telefonus tieÅ”i bez servera un ar balss pÄrraidi tikai vienÄ virzienÄ. TÄpÄc nolÄmÄm laist klajÄ pilnÄ«gÄku telefonu ar zvanu caur serveri, balss pÄrraidi abos virzienos, bet tajÄ paÅ”Ä laikÄ iekļaujoties pÄc iespÄjas mazÄkÄ atmiÅas apjomÄ.
Tika nolemts telefonam izvÄlÄties aplikÄciju simple_pjsua kÄ daļa no PJSIP bibliotÄkas. Å Ä« ir minimÄla lietojumprogramma, kas var reÄ£istrÄties serverÄ«, saÅemt un atbildÄt uz zvaniem. ZemÄk es nekavÄjoties sniegÅ”u aprakstu par to, kÄ to palaist STM32F7-Discovery.
include platform.pjsip.cmd.simple_pjsua_imported(
sip_domain="server",
sip_user="username",
sip_passwd="password")
kur serveris ir SIP serveris (piemÄram, sip.linphone.org), lietotÄjvÄrds Šø parole ā konta lietotÄjvÄrds un parole.
MÄs komplektÄjam Embox ar komandu padarÄ«t. Mums ir informÄcija par plates programmaparatÅ«ru vietnÄ wiki un raksts.
Palaidiet komandu āsimple_pjsua_importedā Embox konsolÄ
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
Visbeidzot, atliek tikai ievietot skaļruÅus vai austiÅas audio izvadÄ un runÄt divos mazos MEMS mikrofonos, kas atrodas blakus displejam. MÄs zvanÄm no Linux, izmantojot lietojumprogrammu simple_pjsua, pjsua. Nu, vai arÄ« varat izmantot jebkura cita veida linphone.
TÄtad, sÄkotnÄji radÄs jautÄjums par aparatÅ«ras platformas izvÄli. TÄ kÄ bija skaidrs, ka STM32F4-Discovery nederÄs atmiÅai, tika izvÄlÄts STM32F7-Discovery. ViÅai ir 1 MB zibatmiÅa un 256 KB RAM (+ 64 speciÄlÄ ÄtrÄ atmiÅa, ko arÄ« izmantosim). Tas arÄ« nav daudz zvaniem caur serveri, taÄu mÄs nolÄmÄm mÄÄ£inÄt iekļūt.
Parasti uzdevums tika sadalÄ«ts vairÄkos posmos:
Palaiž PJSIP uz QEMU. Tas bija Ärti atkļūdoÅ”anai, turklÄt mums jau bija atbalsts AC97 kodekam.
Balss ierakstÄ«Å”ana un atskaÅoÅ”ana QEMU un STM32.
Lietojumprogrammas pÄrneÅ”ana simple_pjsua no PJSIP. Tas ļauj reÄ£istrÄties SIP serverÄ« un veikt zvanus.
Izvietojiet savu serveri, pamatojoties uz Asterisk, un pÄrbaudiet to, un pÄc tam izmÄÄ£iniet ÄrÄjos, piemÄram, sip.linphone.org
SkaÅa pakalpojumÄ Embox darbojas, izmantojot Portaudio, kas tiek izmantota arÄ« PISIP. PirmÄs problÄmas parÄdÄ«jÄs QEMU - WAV tika atskaÅoti labi ar 44100 Hz, bet pie 8000 kaut kas acÄ«mredzami nogÄja greizi. IzrÄdÄ«jÄs, ka problÄma bija frekvences iestatÄ«Å”anÄ - pÄc noklusÄjuma aprÄ«kojumÄ tÄ bija 44100, un mÄs to nemainÄ«jÄm programmatÅ«rÄ.
Å eit, iespÄjams, ir vÄrts nedaudz paskaidrot, kÄ skaÅa tiek atskaÅota kopumÄ. SkaÅas karte var iestatÄ«t kÄdu rÄdÄ«tÄju uz atmiÅas daļu, no kuras tÄ ir jÄatskaÅo vai jÄieraksta iepriekÅ” noteiktÄ frekvencÄ. Kad buferis beidzas, tiek Ä£enerÄts pÄrtraukums un izpilde turpinÄs no nÄkamÄ bufera. Lieta tÄda, ka Å”ie buferi ir jÄaizpilda iepriekÅ”, kamÄr tiek atskaÅots iepriekÅ”Äjais. Ar Å”o problÄmu mÄs saskarsimies tÄlÄk STM32F7.
PÄc tam mÄs noÄ«rÄjÄm serveri un izvietojÄm tajÄ Asterisk. TÄ kÄ bija jÄveic daudz atkļūdoÅ”anas un es negribÄju daudz runÄt mikrofonÄ, bija nepiecieÅ”ams veikt automÄtisku atskaÅoÅ”anu un ierakstÄ«Å”anu. Lai to izdarÄ«tu, mÄs ielÄpÄjÄm simple_pjsua, lai audio ierÄ«Äu vietÄ varÄtu ievietot failus. PJSIP tas tiek darÄ«ts pavisam vienkÄrÅ”i, jo tiem ir porta jÄdziens, kas var bÅ«t gan ierÄ«ce, gan fails. Un Å”os portus var elastÄ«gi savienot ar citiem portiem. JÅ«s varat apskatÄ«t kodu mÅ«su pjsip krÄtuves. RezultÄtÄ shÄma bija Å”Äda. Es izveidoju divus kontus Asterisk serverÄ« - Linux un Embox. PÄc tam komanda tiek izpildÄ«ta Embox simple_pjsua_imported, Embox reÄ£istrÄjas serverÄ«, pÄc tam mÄs izsaucam Embox no Linux. Savienojuma brÄ«dÄ« mÄs pÄrbaudÄm Asterisk serverÄ«, vai viss savienojums ir izveidots, un pÄc kÄda laika mums vajadzÄtu dzirdÄt skaÅu no Linux Embox, un Linux mÄs saglabÄjam failu, kas tiek atskaÅots no Embox.
Kad tas strÄdÄja ar QEMU, mÄs pÄrgÄjÄm uz tÄ pÄrneÅ”anu uz STM32F7-Discovery. PirmÄ problÄma bija tÄda, ka mÄs nevarÄjÄm iekļauties 1 MB ROM, ja nebija iespÄjota ā-Osā kompilatora optimizÄcija attÄla izmÄram. TÄpÄc mÄs iekļÄvÄm ā-Osā. PÄc tam ielÄps atspÄjoja C++ atbalstu, tÄpÄc tas ir nepiecieÅ”ams tikai pjsua, un mÄs izmantojam simple_pjsua.
PÄc ievietoÅ”anas simple_pjsua, nolÄma, ka tagad ir iespÄja to palaist. Bet vispirms mums bija jÄizdomÄ, kÄ ierakstÄ«t un atskaÅot balsis. JautÄjums - kur rakstÄ«t? MÄs izvÄlÄjÄmies ÄrÄjo atmiÅu - SDRAM (128 MB). To varat izmÄÄ£inÄt pats:
Izveidos stereo WAV ar frekvenci 16000 Hz un ilgumu 10 sekundes:
record -r 16000 -c 2 -d 10000 -m C0000000
MÄs zaudÄjam:
play -m C0000000
Å eit bija divas problÄmas. Pirmais ir ar kodeku - tiek izmantots WM8994, un tam ir tÄda lieta kÄ slots, un Å”ie sloti ir 4. TÄtad pÄc noklusÄjuma, ja tas nav konfigurÄts, tad atskaÅojot audio, atskaÅoÅ”ana notiek visos Äetras slots. TÄpÄc ar frekvenci 16000 Hz mÄs saÅÄmÄm 8000 Hz, bet 8000 Hz atskaÅoÅ”anai vienkÄrÅ”i nedarbojÄs. Kad mÄs atlasÄ«jÄm tikai 0 un 2 slotus, tas darbojÄs, kÄ paredzÄts. VÄl viena problÄma bija audio interfeiss STM32Cube, kurÄ audio izvade darbojas caur SAI (Serial Audio Interface) sinhroni ar audio ievadi (sÄ«kÄku informÄciju nesapratu, bet izrÄdÄs, ka viÅiem ir kopÄ«gs pulkstenis un inicializÄjot audio izeja, audio kaut kÄdÄ veidÄ ir saistÄ«ts ar tÄ ieeju). Tas ir, nav iespÄjams tos palaist atseviŔķi, tÄpÄc mÄs rÄ«kojÄmies Å”Ädi - audio ieeja un audio izeja vienmÄr darbojas (arÄ« tiek Ä£enerÄti pÄrtraukumi). Bet, kad sistÄmÄ nekas netiek atskaÅots, mÄs vienkÄrÅ”i ieslidinÄm tukÅ”u buferi audio izvadÄ, un, kad sÄkas atskaÅoÅ”ana, mÄs godÄ«gi sÄkam to aizpildÄ«t.
Tad mÄs saskÄrÄmies ar faktu, ka skaÅa, ierakstot balsi, bija ļoti klusa. Tas ir saistÄ«ts ar faktu, ka STM32F7-Discovery MEMS mikrofoni kaut kÄ nedarbojas labi frekvencÄs, kas zemÄkas par 16000 Hz. TÄpÄc mÄs to iestatÄm uz 16000 Hz, pat ja pienÄk 8000 Hz. TomÄr, lai to izdarÄ«tu, bija jÄpievieno programmatÅ«ras vienas frekvences konvertÄÅ”ana uz citu.
TÄlÄk mums bija jÄpalielina kaudzes izmÄrs, kas atrodas RAM. PÄc mÅ«su aprÄÄ·iniem, pjsip vajadzÄja apmÄram 190 KB, un mums bija palikuÅ”i tikai aptuveni 100 KB. Å eit mums bija jÄizmanto nedaudz ÄrÄjÄs atmiÅas - SDRAM (apmÄram 128 KB).
PÄc visiem Å”iem labojumiem es redzÄju pirmÄs pakotnes starp Linux un Embox un dzirdÄju skaÅu! Bet skaÅa bija briesmÄ«ga, nepavisam ne tÄda kÄ QEMU, neko nevarÄja dzirdÄt. Tad mÄs domÄjÄm, kas varÄtu bÅ«t par lietu. AtkļūdoÅ”ana parÄdÄ«ja, ka Embox vienkÄrÅ”i nav laika aizpildÄ«t/izlÄdÄt audio buferus. KamÄr pjsip apstrÄdÄ vienu kadru, ir notikuÅ”i 2 pÄrtraukumi saistÄ«bÄ ar bufera apstrÄdes pabeigÅ”anu, kas ir pÄrÄk daudz. Mana pirmÄ doma par paÄtrinÄjumu bija kompilatora optimizÄcija, taÄu tÄ jau bija iekļauta PJSIP. Otrais ir aparatÅ«ras peldoÅ”ais punkts, mÄs par to runÄjÄm raksts. Bet, kÄ liecina prakse, FPU nenodroÅ”inÄja ievÄrojamu Ätruma pieaugumu. NÄkamais solis bija pavedienu prioritÄÅ”u noteikÅ”ana. Embox ir dažÄdas plÄnoÅ”anas stratÄÄ£ijas, un es iespÄjoju to, kas atbalsta prioritÄtes un pieŔķīra audio straumÄm visaugstÄko prioritÄti. Tas arÄ« nepalÄ«dzÄja.
NÄkamÄ doma bija tÄda, ka mÄs strÄdÄjam ar ÄrÄjo atmiÅu un bÅ«tu labi tur pÄrvietot struktÅ«ras, kurÄm piekļūst ÄrkÄrtÄ«gi bieži. Es veicu iepriekÅ”Äju analÄ«zi par to, kad un saskaÅÄ ar ko simple_pjsua pieŔķir atmiÅu. IzrÄdÄ«jÄs, ka no 190 KB pirmie 90 KB tiek atvÄlÄti PJSIP iekÅ”ÄjÄm vajadzÄ«bÄm un tiem netiek piekļūts pÄrÄk bieži. TÄlÄk ienÄkoÅ”Ä zvana laikÄ tiek izsaukta funkcija pjsua_call_answer, kurÄ pÄc tam tiek pieŔķirti buferi darbam ar ienÄkoÅ”ajiem un izejoÅ”ajiem kadriem. Tas joprojÄm bija aptuveni 100 KB. Un tad mÄs rÄ«kojÄmies Å”Ädi. LÄ«dz zvana veikÅ”anai dati tiek saglabÄti ÄrÄjÄ atmiÅÄ. TiklÄ«dz zvans zvana, mÄs nekavÄjoties nomainÄm kaudzi ar citu RAM. TÄdÄjÄdi visi ākarstieā dati tika pÄrsÅ«tÄ«ti uz ÄtrÄku un paredzamÄku atmiÅu.
RezultÄtÄ tas viss kopÄ Ä¼Äva mums startÄt simple_pjsua un zvaniet caur savu serveri. Un tad caur citiem serveriem, piemÄram, sip.linphone.org.
Atzinumi
BeigÄs bija iespÄjams palaist simple_pjsua ar balss pÄrraidi abos virzienos caur serveri. ProblÄma ar papildus 128 KB SDRAM atrisinÄma, izmantojot nedaudz jaudÄ«gÄku Cortex-M7 (piemÄram, STM32F769NI ar 512 KB RAM), taÄu vÄl neesam atmetuÅ”i cerÄ«bas ietilpinÄt 256 KB :) priecÄjies, ja kÄdu interesÄ, vai vÄl labÄk ā pamÄÄ£ini. Visi avoti, kÄ parasti, ir mÅ«su krÄtuves.