Telefon SIP fuq STM32F7-Discovery

Hi kulħadd

Ftit ilu aħna писали dwar kif irnexxielna nniedu telefon SIP fuq STM32F4-Discovery b'1 MB ROM u 192 KB RAM) ibbażat fuq Embox. Hawnhekk irid jingħad li dik il-verżjoni kienet minima u konnessa żewġ telefowns direttament mingħajr server u bi trażmissjoni tal-vuċi f’direzzjoni waħda biss. Għalhekk, iddeċidejna li tniedi telefon aktar komplut b'sejħa permezz tas-server, trasmissjoni tal-vuċi fiż-żewġ direzzjonijiet, iżda fl-istess ħin inżommu l-iżgħar daqs tal-memorja possibbli.


Għat-telefon, ġie deċiż li tagħżel applikazzjoni sempliċi_pjsua bħala parti mil-librerija PJSIP. Din hija applikazzjoni minima li tista' tirreġistra fuq is-server, tirċievi u twieġeb telefonati. Hawn taħt se nagħti immedjatament deskrizzjoni ta 'kif tħaddem fuq STM32F7-Discovery.

Kif tmexxi

  1. Konfigurazzjoni ta' Embox
    make confload-platform/pjsip/stm32f7cube
  2. Issettja l-kont SIP meħtieġ fil-fajl conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    fejn servers huwa server SIP (per eżempju, sip.linphone.org), username и password - username u password tal-kont.

  3. Armar ta 'Embox bħala tim jagħmlu. Dwar il-firmware tal-bord li għandna fuq wiki u artikolu.
  4. Mexxi l-kmand "simple_pjsua_imported" fil-console Embox
    
    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. Fl-aħħarnett, jibqa 'ddaħħal kelliema jew headphones fil-ħruġ tal-awdjo, u titkellem f'żewġ mikrofoni MEMS żgħar ħdejn il-wiri. Aħna nsejħu minn Linux permezz tal-applikazzjoni simple_pjsua, pjsua. Ukoll, jew tista 'tuża kwalunkwe tip ieħor ta' linphone.

Dan kollu huwa deskritt fuq tagħna wiki.

Kif wasalna hemm

Għalhekk, inizjalment qamet il-mistoqsija dwar l-għażla ta 'pjattaforma tal-ħardwer. Peress li kien ċar li STM32F4-Discovery ma joqgħodx mill-memorja, intgħażel STM32F7-Discovery. Hija għandha flash drive ta '1 MB u 256 KB ta' RAM (+ 64 memorja veloċi speċjali, li aħna se nużaw ukoll). Ukoll mhux ħafna għal sejħiet permezz tas-server, iżda ddeċidejna li nippruvaw nidħlu.

Kondizzjonalment għalihom infushom, il-kompitu kien maqsum f'diversi stadji:

  • Tmexxi PJSIP fuq QEMU. Kien konvenjenti għad-debugging, kif ukoll aħna diġà kellna appoġġ għall-codec AC97 hemmhekk.
  • Reġistrazzjoni u daqq tal-vuċi fuq QEMU u fuq STM32.
  • Porting ta' applikazzjoni sempliċi_pjsua minn PJSIP. Jippermettilek tirreġistra fuq is-server SIP u tagħmel sejħiet.
  • Uża s-server tiegħek ibbażat fuq Asterisk u ttestja fuqu, imbagħad ipprova dawk esterni bħal sip.linphone.org

Il-ħoss f'Embox jaħdem permezz ta' Portaudio, li jintuża wkoll f'PISIP. L-ewwel problemi dehru fuq QEMU - WAV lagħbu tajjeb f'44100 Hz, iżda f'8000 xi ħaġa ċara marret ħażin. Irriżulta li kienet kwistjoni ta 'l-issettjar tal-frekwenza - b'mod awtomatiku kien 44100 fit-tagħmir, u dan ma nbidilx b'mod programmatiku.

Hawnhekk, forsi, ta 'min jispjega ftit kif il-ħoss jindaqq b'mod ġenerali. Il-karta tal-ħoss tista 'tiġi ssettjata għal xi pointer għal biċċa memorja li minnha trid tilgħab jew tirrekordja bi frekwenza predeterminata. Wara li jintemm il-buffer, tiġi ġġenerata interruzzjoni u l-eżekuzzjoni tkompli bil-buffer li jmiss. Il-fatt hu li dawn il-buffers iridu jimtlew minn qabel waqt li jkun qed jintlagħab dak preċedenti. Se niffaċċjaw din il-problema aktar fuq STM32F7.

Sussegwentement, kellna server u skjerajna Asterisk fuqu. Peress li kien meħtieġ li tiddibaggja ħafna, iżda ma ridtx nitkellem fil-mikrofonu ħafna, kien meħtieġ li jsir daqq u reġistrazzjoni awtomatiċi. Biex tagħmel dan, aħna patched simple_pjsua sabiex inti tista 'slip fajls minflok apparati awdjo. Fil-PJSIP, dan isir pjuttost sempliċi, peress li għandhom il-kunċett ta 'port, li jista' jkun jew apparat jew fajl. U dawn il-portijiet jistgħu jkunu konnessi b'mod flessibbli ma 'portijiet oħra. Tista 'tara l-kodiċi fil-pjsip tagħna repożitorji. Bħala riżultat, l-iskema kienet kif ġej. Fuq is-server Asterisk, bdejt żewġ kontijiet - għal Linux u għal Embox. Sussegwentement, il-kmand jiġi esegwit fuq Embox simple_pjsua_imported, Embox huwa rreġistrat fuq is-server, u wara nsejħu Embox minn Linux. Fil-mument tal-konnessjoni, aħna niċċekkjaw fuq is-server Asterisk li l-konnessjoni hija stabbilita, u wara ftit għandna nisimgħu ħoss minn Linux f'Embox, u fil-Linux nissejvjaw il-fajl li jindaqq minn Embox.

Wara li ħadmet fuq QEMU, imxejna għall-porting għal STM32F7-Discovery. L-ewwel problema hija li ma kinux jidħlu f'1 MB ta 'ROM mingħajr l-ottimizzazzjoni tal-kompilatur attivata "-Os" għad-daqs tal-immaġni. Huwa għalhekk li inkludejna "-Os". Barra minn hekk, il-garża ddiżattivat l-appoġġ għal C ++, għalhekk hija meħtieġa biss għal pjsua, u nużaw simple_pjsua.

Wara li tqiegħed sempliċi_pjsua, iddeċieda li issa hemm ċans li titnieda. Iżda l-ewwel kien meħtieġ li tittratta r-reġistrazzjoni u l-daqq tal-vuċi. Il-mistoqsija hija fejn tikteb? Aħna għażilna memorja esterna - SDRAM (128 MB). Tista' tipprova dan int stess:

Joħloq stereo WAV bi frekwenza ta' 16000 Hz u tul ta' 10 sekondi:


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

Nitilfu:


play -m C0000000

Hemm żewġ problemi hawn. L-ewwel bil-codec - WM8994 jintuża, u għandu tali ħaġa bħala slot, u hemm 4 minn dawn is-slots. Allura, b'mod awtomatiku, jekk dan ma jkunx ikkonfigurat, allura meta tilgħab l-awdjo, daqq iseħħ fl-erba 'slots kollha. . Għalhekk, bi frekwenza ta '16000 Hz, irċevejna 8000 Hz, iżda għal 8000 Hz, daqq sempliċiment ma ħadimx. Meta ntgħażlu biss slots 0 u 2, ħadem kif suppost. Problema oħra kienet l-interface tal-awdjo fl-STM32Cube, li fiha l-output tal-awdjo jaħdem permezz tas-SAI (Serial Audio Interface) b'mod sinkroniku mal-input tal-awdjo (ma fhimtx id-dettalji, iżda jirriżulta li jaqsmu arloġġ komuni u meta l- output tal-awdjo huwa inizjalizzat, awdjo huwa b'xi mod mehmuż magħha entratura). Jiġifieri, ma tistax tmexxihom separatament, għalhekk għamilna dan li ġej - l-input tal-awdjo u l-output tal-awdjo dejjem jaħdmu (inklużi l-interruzzjonijiet huma ġġenerati). Imma meta ma jkun qed jintlagħab xejn fis-sistema, allura aħna sempliċement niżloq buffer vojt fil-ħruġ tal-awdjo, u meta jibda l-plejbek, aħna onestament nibdew nimlewh.

Barra minn hekk, iltqajna mal-fatt li l-ħoss waqt ir-reġistrazzjoni tal-vuċi kien kwiet ħafna. Dan huwa dovut għall-fatt li l-mikrofoni MEMS fuq l-STM32F7-Discovery b'xi mod ma jaħdmux tajjeb fi frekwenzi taħt 16000 Hz. Għalhekk, aħna nissettjaw 16000 Hz, anke jekk jiġi 8000 Hz. Biex tagħmel dan, madankollu, kien meħtieġ li tiżdied konverżjoni ta 'softwer ta' frekwenza waħda għal oħra.

Sussegwentement, kelli nżid id-daqs tal-borġ, li jinsab fir-RAM. Skont il-kalkoli tagħna, pjsip kien jeħtieġ madwar 190 KB, u fadal biss madwar 100 KB. Hawnhekk kelli nuża xi memorja esterna - SDRAM (madwar 128 KB).

Wara dawn l-editji kollha, rajt l-ewwel pakketti bejn Linux u Embox, u smajt il-ħoss! Iżda l-ħoss kien terribbli, xejn l-istess bħal fuq QEMU, kien impossibbli li tagħmel xi ħaġa. Imbagħad ħsibna dwar x'jista 'jkun il-kwistjoni. Id-debugging wera li Embox sempliċement m'għandux ħin biex jimla / iħottu buffers tal-awdjo. Filwaqt li pjsip kien qed jipproċessa qafas wieħed, 2 interruzzjonijiet kellhom żmien biex iseħħu dwar it-tlestija tal-ipproċessar tal-buffer, li huwa wisq. L-ewwel ħsieb għall-veloċità kien l-ottimizzazzjoni tal-kompilatur, iżda kien diġà inkluż fil-PJSIP. It-tieni huwa punt floating hardware, tkellimna dwarha fi artikolu. Iżda kif wriet il-prattika, FPU ma tatx żieda sinifikanti fil-veloċità. Il-pass li jmiss kien li tingħata prijorità lill-ħjut. Embox għandha strateġiji ta 'skedar differenti, u jien inkludejt waħda li tappoġġja l-prijoritajiet u tistabbilixxi flussi awdjo għall-ogħla prijorità. Dan lanqas ma għen.

L-idea li jmiss kienet li qed naħdmu b'memorja esterna u jkun sabiħ li nċaqalqu hemm strutturi li huma aċċessati ħafna drabi. Għamilt analiżi preliminari ta' meta u taħt xiex sempliċi_pjsua jalloka memorja. Irriżulta li minn 190 Kb, l-ewwel 90 Kb huma allokati għall-bżonnijiet interni tal-PJSIP u ma tantx jiġu aċċessati. Barra minn hekk, waqt sejħa deħlin, tissejjaħ il-funzjoni pjsua_call_answer, li fiha buffers imbagħad jiġu allokati biex jaħdmu ma 'frames deħlin u ħerġin. Kien għadu madwar 100 Kb. U mbagħad għamilna dan li ġej. Sal-mument tas-sejħa, aħna npoġġu d-dejta fil-memorja esterna. Hekk kif is-sejħa, aħna immedjatament nissostitwixxu l-borġ b'ieħor - fir-RAM. Għalhekk, id-dejta kollha "taħraq" ġiet trasferita għal memorja aktar mgħaġġla u aktar prevedibbli.

Bħala riżultat, dan kollu flimkien għamilha possibbli li titnieda sempliċi_pjsua u ċempel permezz tas-server tiegħek. U mbagħad permezz ta' servers oħra bħal sip.linphone.org.

Sejbiet

Bħala riżultat, kien possibbli li titnieda sempliċi_pjsua bi trażmissjoni tal-vuċi fiż-żewġ direzzjonijiet permezz tas-server. Il-problema b'128 KB ta 'SDRAM minfuqa addizzjonalment tista' tiġi solvuta bl-użu ta 'Cortex-M7 kemmxejn aktar qawwi (per eżempju, STM32F769NI b'512 KB ta' RAM), iżda fl-istess ħin, għadna ma qatgħux it-tama li nidħlu f'256 KB 🙂 Inkunu ferħanin jekk xi ħadd ikun interessat, Jew aħjar, ipprovah. Is-sorsi kollha, bħas-soltu, huma tagħna repożitorji.

Sors: www.habr.com

Żid kumment