SIP telefòn sou STM32F7-Discovery

Bonjou tout moun.

Yon ti tan de sa nou писали sou fason nou te jere lanse yon telefòn SIP sou STM32F4-Discovery ak 1 MB ROM ak 192 KB RAM) ki baze sou Embox. Isit la li dwe di ke vèsyon sa a te minim ak konekte de telefòn dirèkteman san yon sèvè ak transmisyon vwa sèlman nan yon direksyon. Se poutèt sa, nou deside lanse yon telefòn ki pi konplè ak yon apèl atravè yon sèvè, transmisyon vwa nan tou de direksyon, men an menm tan an anfòm nan gwosè a memwa ki pi piti posib.


Li te deside chwazi yon aplikasyon pou telefòn lan senp_pjsua kòm yon pati nan bibliyotèk PJSIP la. Sa a se yon aplikasyon minim ki ka anrejistre sou sèvè a, resevwa epi reponn apèl. Anba a mwen pral imedyatman bay yon deskripsyon sou ki jan yo kouri sa a sou STM32F7-Discovery la.

Ki jan yo lanse

  1. Konfigirasyon Embbox
    make confload-platform/pjsip/stm32f7cube
  2. Nan fichye a conf/mods.config nou mete kont SIP ki nesesè yo.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    kote sèvè se yon sèvè SIP (pa egzanp, sip.linphone.org), non itilizatè и modpas - non itilizatè ak modpas pou kont lan.

  3. Nou rasanble Embox ak yon ekip . Nou gen enfòmasyon sou firmwèr tablo nan wiki ak Atik.
  4. Kouri lòd "simple_pjsua_imported" nan konsole Embbox la
    
    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. Finalman, tout sa ki rete se insert oratè oswa kas ekoutè nan pwodiksyon odyo a, epi pale nan de ti mikwofòn MEMS akote ekspozisyon an. Nou rele soti nan Linux lè l sèvi avèk aplikasyon an simple_pjsua, pjsua. Oke, oswa ou ka itilize nenpòt lòt kalite linphone.

Tout bagay sa yo dekri sou nou an wiki.

Ki jan nou te rive isit la

Se konsa, okòmansman kesyon an leve sou chwazi yon platfòm pyès ki nan konpitè. Depi li te klè ke STM32F4-Dekouvèt la pa ta dwe apwopriye pou memwa, yo te chwazi STM32F7-Dekouvèt la. Li gen yon kondwi flash 1 MB ak 256 KB RAM (+ 64 memwa espesyal vit, ke nou pral itilize tou). Li pa anpil tou pou apèl atravè sèvè a, men nou deside eseye antre.

Konvansyonèl, travay la te divize an plizyè etap:

  • Kouri PJSIP sou QEMU. Li te pratik pou debogaj, plis nou te deja gen sipò pou codec AC97 la.
  • Anrejistreman vwa ak lèktur sou QEMU ak STM32.
  • Pòt aplikasyon an senp_pjsua soti nan PJSIP la. Li pèmèt ou anrejistre sou yon sèvè SIP epi fè apèl.
  • Deplwaye sèvè pwòp ou a ki baze sou Asterisk epi teste sou li, epi answit eseye sa ki ekstèn, tankou sip.linphone.org.

Son nan Embbox travay atravè Portaudio, ki itilize tou nan PISIP. Premye pwoblèm yo te parèt sou QEMU - WAV yo te jwe byen nan 44100 Hz, men nan 8000 yon bagay te byen klè ale mal. Li te tounen soti ke pwoblèm nan te nan mete frekans lan - pa default nan ekipman an li te 44100, epi nou pa t 'chanje sa a nan lojisyèl.

Isit la, li la pwobableman vo eksplike yon ti kras sou ki jan son yo jwe an jeneral. Kat son an ka mete kèk konsèy sou yon moso memwa ki soti nan ki li bezwen yo dwe jwe oswa anrejistre nan yon frekans Predetermined. Apre tanpon an fini, yon entèwonp pwodui epi ekzekisyon kontinye soti nan tanpon kap vini an. Pwen an se ke tanpon sa yo bezwen ranpli davans pandan y ap jwe youn anvan an. Nou pral rankontre pwoblèm sa a plis sou STM32F7 la.

Apre sa, nou te lwe yon sèvè epi deplwaye Asterisk sou li. Depi te gen anpil debogaj pou fè, epi mwen pa t 'vle pale anpil nan mikwofòn la, li te nesesè yo fè lektur otomatik ak anrejistreman. Pou fè sa, nou patched simple_pjsua pou nou te kapab mete dosye olye de aparèy odyo. Nan PJSIP sa a se fè byen tou senpleman, depi yo gen konsèp nan yon pò, ki ka swa yon aparèy oswa yon dosye. Ak pò sa yo ka fleksib konekte ak lòt pò. Ou ka wè kòd la nan pjsip nou an depo. Kòm yon rezilta, konplo a te jan sa a. Mwen te kreye de kont sou sèvè Asterisk la - pou Linux ak pou Embbox. Apre sa, lòd la egzekite sou Embbox simple_pjsua_imported, Embbox anrejistre sou sèvè a, apre sa nou rele Embbox soti nan Linux. Nan moman koneksyon an, nou tcheke sou sèvè Asterisk la ke koneksyon an antye etabli, epi apre kèk tan nou ta dwe tande son soti nan Linux nan Embox, ak nan Linux nou sove fichye a ki jwe nan Embbox.

Yon fwa sa a te travay sou QEMU, nou te deplase sou pò li nan STM32F7-Discovery la. Pwoblèm nan premye se ke nou pa t 'kapab anfòm nan 1 MB nan ROM san yo pa optimize nan "-Os" du pou gwosè imaj pèmèt. Se poutèt sa, nou enkli "-Os". Apre sa, patch la enfim sipò pou C++, kidonk li nesesè sèlman pou pjsua, epi nou itilize simple_pjsua.

Apre mete senp_pjsua, deside ke te gen kounye a yon chans lanse li. Men, anvan nou te dwe konnen ki jan yo anrejistre ak jwe vwa yo. Kesyon: ki kote yo ekri? Nou te chwazi memwa ekstèn - SDRAM (128 MB). Ou ka eseye sa a tèt ou:

Ap kreye yon WAV stereo ak yon frekans 16000 Hz ak yon dire 10 segonn:


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

Nou pèdi:


play -m C0000000

Te gen de pwoblèm isit la. Premye a se ak codec a - WM8994 yo itilize, epi li gen yon bagay tankou yon plas, e gen 4 nan fant sa yo Se konsa, pa default, si sa a pa configuré, Lè sa a, lè jwe odyo, lèktur rive nan tout kat fant. Se poutèt sa, nan yon frekans nan 16000 Hz nou te resevwa 8000 Hz, men pou 8000 Hz lèktur tou senpleman pa t 'travay. Lè nou chwazi sèlman fant 0 ak 2, li te travay jan yo espere. Yon lòt pwoblèm se te koòdone odyo nan STM32Cube a, nan ki pwodiksyon odyo a travay atravè SAI (Serial Audio Interface) synchronously ak opinyon odyo a (mwen pa t 'konprann detay yo, men li vire soti ke yo pataje yon revèy komen ak lè inisyalize. pwodiksyon odyo a, odyo se yon jan kanmenm mare nan antre li). Sa vle di, li enposib kouri yo separeman, kidonk nou te fè sa ki annapre yo - opinyon odyo ak pwodiksyon odyo toujou travay (ki gen ladan entèwonp yo pwodwi). Men, lè pa gen anyen k ap jwe nan sistèm nan, nou tou senpleman glise yon tanpon vid nan pwodiksyon odyo a, epi lè lèktur kòmanse, nou onètman kòmanse ranpli li.

Lè sa a, nou te rankontre lefèt ke son an lè anrejistreman vwa a te trè trankil. Sa a se akòz lefèt ke mikwofòn MEMS yo sou STM32F7-Discovery yon jan kanmenm pa travay byen nan frekans ki anba a 16000 Hz. Se poutèt sa, nou mete li nan 16000 Hz, menm si 8000 Hz rive. Pou fè sa, sepandan, li te nesesè yo ajoute konvèsyon lojisyèl nan yon frekans nan yon lòt.

Apre sa, nou te oblije ogmante gwosè pil la, ki sitiye nan RAM. Dapre kalkil nou yo, pjsip te mande apeprè 190 KB, epi nou te sèlman sou 100 KB rete. Isit la nou te oblije sèvi ak yon ti kras memwa ekstèn - SDRAM (apeprè 128 KB).

Apre tout koreksyon sa yo, mwen te wè premye pakè yo ant Linux ak Embbox, epi mwen tande son an! Men, son an te terib, pa ditou tankou sou QEMU, pa t 'kapab tande anyen. Lè sa a, nou te mande sa ki ta ka pwoblèm nan. Debogaj te montre ke Embox tou senpleman pa gen tan ranpli / dechaje tanpon odyo. Pandan ke pjsip ap trete yon ankadreman, 2 entèwonp sou fini an nan pwosesis tanpon te fèt, ki se twòp. Premye panse mwen pou akselerasyon se te optimize konpilatè, men sa te deja enkli nan PJSIP. Dezyèm lan se pwen k ap flote kenkayri, nou te pale sou li nan Atik. Men, jan pratik te montre, FPU pa t 'bay yon ogmantasyon siyifikatif nan vitès. Pwochen etap la se te fikse priyorite fil. Embbox gen diferan estrateji orè, epi mwen pèmèt youn nan ki sipòte priyorite yo epi ki bay kouran odyo yo pi gwo priyorite. Sa a pa t 'ede tou.

Lide nan pwochen te ke nou ap travay ak memwa ekstèn epi li ta bon pou deplase estrikti la ki gen aksè trè souvan. Mwen te fè yon analiz preliminè sou ki lè ak anba ki sa senp_pjsua bay memwa. Li te tounen soti ke sou 190 KB, premye 90 KB yo atribye ba pou bezwen entèn PJSIP epi yo pa jwenn aksè trè souvan. Apre sa, pandan yon apèl fèk ap rantre, yo rele fonksyon pjsua_call_answer la, kote tanpon yo ap resevwa lajan pou travay avèk ankadreman k ap rantre ak sortan. Li te toujou sou 100 KB. Apre sa, nou te fè sa ki annapre yo. Jiskaske apèl la fèt, done yo estoke nan memwa ekstèn. Le pli vit ke apèl la sonnen, nou imedyatman ranplase pil la ak yon lòt nan RAM. Kidonk, tout done "cho" yo te transfere nan memwa pi vit ak pi previzib.

Kòm rezilta, tout bagay sa yo ansanm te pèmèt nou lanse senp_pjsua epi rele nan sèvè w la. Apre sa, atravè lòt serveurs tankou sip.linphone.org.

Jwenn

Nan fen a li te posib yo lanse senp_pjsua ak transmisyon vwa nan toude direksyon atravè sèvè a. Pwoblèm nan ak yon lòt 128 KB nan SDRAM ka rezoud lè w sèvi ak yon ti kras pi pwisan Cortex-M7 (pa egzanp, STM32F769NI ak 512 KB nan RAM), men nou poko abandone espwa nan sere nan 256 KB :) Nou pral dwe kontan si yon moun enterese, oswa pi byen toujou, eseye li. Tout sous, kòm dabitid, se nan nou depo.

Sous: www.habr.com

Add nouvo kòmantè