SIP sími á STM32F7-Discovery

Hæ allir

Fyrir nokkru síðan við писали um hvernig okkur tókst að koma SIP síma á STM32F4-Discovery með 1 MB ROM og 192 KB vinnsluminni) byggt á Embox. Hér verður að segjast að sú útgáfa var í lágmarki og tengdi tvo síma beint án netþjóns og með raddsendingu í aðeins eina átt. Þess vegna ákváðum við að hleypa af stokkunum fullkomnari síma með símtali í gegnum netþjóninn, raddsendingu í báðar áttir, en á sama tíma halda innan minnstu mögulegu minnisstærðar.


Fyrir símann var ákveðið að velja forrit einfalt_pjsua sem hluti af PJSIP bókasafninu. Þetta er lágmarksforrit sem getur skráð sig á netþjóninn, tekið á móti og svarað símtölum. Hér að neðan mun ég strax gefa lýsingu á því hvernig á að keyra það á STM32F7-Discovery.

Hvernig á að hlaupa

  1. Stillir Embox
    make confload-platform/pjsip/stm32f7cube
  2. Stilltu nauðsynlegan SIP reikning í conf/mods.config skránni.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    þar sem miðlara er SIP þjónn (til dæmis sip.linphone.org), notandanafn и lykilorð - notandanafn reiknings og lykilorð.

  3. Að setja saman Embox sem teymi gera. Um borðvélbúnaðinn sem við erum með wiki og grein.
  4. Keyrðu skipunina „simple_pjsua_imported“ í Embox stjórnborðinu
    
    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. Að lokum er eftir að setja hátalara eða heyrnartól í hljóðúttakið og tala í tvo litla MEMS hljóðnema við hliðina á skjánum. Við hringjum frá Linux í gegnum forritið simple_pjsua, pjsua. Jæja, eða þú getur notað hvaða aðra tegund af linphone.

Allt þetta er lýst á okkar wiki.

Hvernig komumst við þangað

Svo upphaflega vaknaði spurningin um að velja vélbúnaðarvettvang. Þar sem ljóst var að STM32F4-Discovery passaði ekki eftir minni varð STM32F7-Discovery fyrir valinu. Hún er með 1 MB glampi drif og 256 KB af vinnsluminni (+ 64 sérstakt hraðminni, sem við munum líka nota). Einnig ekki mikið fyrir símtöl í gegnum netþjóninn, en við ákváðum að reyna að passa inn.

Skilyrt fyrir sig var verkefninu skipt í nokkur stig:

  • Keyrir PJSIP á QEMU. Það var þægilegt fyrir villuleit, auk þess sem við höfðum þegar stuðning fyrir AC97 merkjamálið þar.
  • Raddupptaka og spilun á QEMU og á STM32.
  • Flytja forrit einfalt_pjsua frá PJSIP. Það gerir þér kleift að skrá þig á SIP netþjóninn og hringja.
  • Settu upp þinn eigin stjörnumiðlara og prófaðu á honum, prófaðu síðan ytri netþjóna eins og sip.linphone.org

Hljóð í Embox virkar í gegnum Portaudio, sem einnig er notað í PISIP. Fyrstu vandamálin birtust á QEMU - WAV spilaði vel við 44100 Hz, en við 8000 fór greinilega eitthvað úrskeiðis. Í ljós kom að það var spurning um að stilla tíðnina - sjálfgefið var 44100 í búnaðinum og það breyttist ekki forritunarlega.

Hér er kannski rétt að útskýra aðeins hvernig hljóðið er spilað almennt. Hægt er að stilla hljóðkortið á einhvern bendi í minnishluta sem þú vilt spila úr eða taka upp á fyrirfram ákveðinni tíðni. Eftir að biðminni lýkur er truflun mynduð og framkvæmd heldur áfram með næsta biðminni. Staðreyndin er sú að þessi biðminni þarf að fylla fyrirfram á meðan sá fyrri er spilaður. Við munum horfast í augu við þetta vandamál frekar á STM32F7.

Næst leigðum við netþjón og settum stjörnu á hann. Þar sem það var nauðsynlegt að kemba mikið, en ég vildi ekki tala mikið í hljóðnemann, var nauðsynlegt að gera sjálfvirka spilun og upptöku. Til að gera þetta plástraðum við simple_pjsua þannig að þú getur sent skrár í stað hljóðtækja. Í PJSIP er þetta einfaldlega gert, þar sem þeir hafa hugmyndina um tengi, sem getur verið annað hvort tæki eða skrá. Og þessar höfn geta verið sveigjanlega tengdar öðrum höfnum. Þú getur séð kóðann í pjsip okkar geymslum. Fyrirkomulagið var því sem hér segir. Á Stjörnuþjóninum stofnaði ég tvo reikninga - fyrir Linux og fyrir Embox. Næst er skipunin keyrð á Embbox simple_pjsua_imported, Embox er skráð á netþjóninn, eftir það hringjum við í Embox frá Linux. Í augnablikinu sem tengingin er gerð athugum við á Asterisk þjóninum að tengingin sé komin á og eftir smá stund ættum við að heyra hljóð frá Linux í Embox og í Linux vistum við skrána sem spiluð er úr Embox.

Eftir að það virkaði á QEMU fórum við yfir í flutning á STM32F7-Discovery. Fyrsta vandamálið er að þeir pössuðu ekki inn í 1 MB af ROM án virku þýðandafínstillingar „-Os“ fyrir stærð myndarinnar. Þess vegna tókum við "-Os". Ennfremur slökkti plásturinn á stuðningi fyrir C ++, svo það er aðeins þörf fyrir pjsua, og við notum simple_pjsua.

Eftir að hafa verið settur einfalt_pjsua, ákvað að nú væri tækifæri til að hleypa því af stokkunum. En fyrst þurfti að takast á við upptöku og spilun raddarinnar. Spurningin er hvar á að skrifa? Við völdum ytra minni - SDRAM (128 MB). Þú getur prófað þetta sjálfur:

Býr til hljómtæki WAV með tíðni 16000 Hz og lengd 10 sekúndur:


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

Við töpum:


play -m C0000000

Hér eru tvö vandamál. Fyrsta með merkjamálinu - WM8994 er notað, og það hefur eitthvað sem heitir rauf, og það eru 4 af þessum raufum. Svo, sjálfgefið, ef þetta er ekki stillt, þá er spilun í öllum fjórum raufunum þegar þú spilar hljóð. . Þess vegna fengum við 16000 Hz á tíðninni 8000 Hz, en fyrir 8000 Hz virkaði spilun einfaldlega ekki. Þegar aðeins rifa 0 og 2 voru valin virkaði það eins og það átti að gera. Annað vandamál var hljóðviðmótið í STM32Cube, þar sem hljóðúttakið virkar í gegnum SAI (Serial Audio Interface) samstillt við hljóðinntakið (ég skildi ekki smáatriðin, en það kemur í ljós að þeir deila sameiginlegri klukku og þegar hljóðúttak er frumstillt, hljóð er einhvern veginn tengt við innganginn). Það er, þú getur ekki keyrt þá sérstaklega, svo við gerðum eftirfarandi - hljóðinntakið og hljóðúttakið virka alltaf (þar með talið truflanir myndast). En þegar ekkert er spilað í kerfinu, þá rennum við einfaldlega tómum biðminni inn í hljóðúttakið og þegar spilun hefst byrjum við heiðarlega að fylla það.

Ennfremur lentum við í þeirri staðreynd að hljóðið við raddupptöku var mjög rólegt. Þetta er vegna þess að MEMS hljóðnemar á STM32F7-Discovery virka einhvern veginn ekki vel á tíðni undir 16000 Hz. Þess vegna setjum við 16000 Hz, jafnvel þótt 8000 Hz komi. Til að gera þetta var samt nauðsynlegt að bæta hugbúnaðarbreytingu á einni tíðni við aðra.

Næst þurfti ég að auka stærð hrúgunnar, sem er staðsett í vinnsluminni. Samkvæmt útreikningum okkar krafðist pjsip um 190 KB og við eigum aðeins um 100 KB eftir. Hér þurfti ég að nota eitthvað utanaðkomandi minni - SDRAM (um 128 KB).

Eftir allar þessar breytingar sá ég fyrstu pakkana á milli Linux og Embox og ég heyrði hljóðið! En hljóðið var hræðilegt, alls ekki það sama og á QEMU, það var ekki hægt að greina neitt. Síðan hugsuðum við um hvað gæti verið að. Villuleit sýndi að Embox hefur einfaldlega ekki tíma til að fylla/afhlaða hljóðbiðmunum. Á meðan pjsip var að vinna úr einum ramma, áttu 2 truflanir tíma til að eiga sér stað um að biðminni vinnslu væri lokið, sem er of mikið. Fyrsta hugsunin um hraða var hagræðing þýðanda, en hún var þegar innifalin í PJSIP. Annað er fljótandi punktur fyrir vélbúnað, við ræddum það í grein. En eins og æfingin hefur sýnt, gaf FPU ekki verulega aukningu á hraða. Næsta skref var að forgangsraða þráðum. Embox hefur mismunandi tímasetningaraðferðir og ég hef sett inn eina sem styður forgangsröðun og stillir hljóðstrauma í hæsta forgang. Þetta hjálpaði heldur ekki.

Næsta hugmynd var að við værum að vinna með ytra minni og það væri gaman að flytja mannvirki þangað sem er mjög oft aðgengilegt. Ég gerði bráðabirgðagreiningu á því hvenær og undir hverju einfalt_pjsua úthlutar minni. Í ljós kom að af 190 Kb er fyrstu 90 Kb úthlutað fyrir innri þarfir PJSIP og er ekki mjög oft aðgangur að þeim. Ennfremur, meðan á innhringingu stendur, er kallað á pjsua_call_answer aðgerðina, þar sem biðmunum er síðan úthlutað til að vinna með inn- og útsendingarramma. Það var samt um 100 Kb. Og svo gerðum við eftirfarandi. Fram að símtalinu setjum við gögnin í ytra minni. Um leið og símtalið er skiptum við strax um hauginn fyrir annan - í vinnsluminni. Þannig voru öll „heit“ gögn flutt í hraðara og fyrirsjáanlegra minni.

Fyrir vikið gerði þetta allt saman mögulegt að hleypa af stokkunum einfalt_pjsua og hringdu í gegnum netþjóninn þinn. Og svo í gegnum aðra netþjóna eins og sip.linphone.org.

Niðurstöður

Fyrir vikið var hægt að hleypa af stokkunum einfalt_pjsua með raddsendingu í báðar áttir í gegnum netþjóninn. Vandamálið með aukalega eytt 128 KB af SDRAM er hægt að leysa með því að nota aðeins öflugri Cortex-M7 (til dæmis STM32F769NI með 512 KB af vinnsluminni), en á sama tíma höfum við enn ekki gefið upp vonina um að komast inn í 256 KB 🙂 Við munum vera ánægð ef einhver hefur áhuga, Eða enn betra, prófaðu það. Allar heimildir, eins og venjulega, eru í okkar geymslum.

Heimild: www.habr.com

Bæta við athugasemd