Simu ya SIP kwenye STM32F7-Discovery

Sema kila mtu

Wakati uliopita sisi писали kuhusu jinsi tulivyoweza kuzindua simu ya SIP kwenye STM32F4-Discovery yenye ROM 1 MB na RAM ya KB 192) kulingana na Embox. Hapa ni lazima kusema kwamba toleo hilo lilikuwa ndogo na liliunganisha simu mbili moja kwa moja bila seva na kwa maambukizi ya sauti katika mwelekeo mmoja tu. Kwa hiyo, tuliamua kuzindua simu kamili zaidi na simu kwa njia ya seva, maambukizi ya sauti kwa pande zote mbili, lakini wakati huo huo uendelee ndani ya ukubwa mdogo wa kumbukumbu iwezekanavyo.


Kwa simu, iliamuliwa kuchagua programu rahisi_pjsua kama sehemu ya maktaba ya PJSIP. Huu ni programu ndogo ambayo inaweza kujiandikisha kwenye seva, kupokea na kujibu simu. Hapo chini nitatoa maelezo ya jinsi ya kuiendesha kwenye STM32F7-Discovery.

Jinsi ya kukimbia

  1. Inasanidi Embox
    make confload-platform/pjsip/stm32f7cube
  2. Weka akaunti ya SIP inayohitajika katika faili ya conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ambapo server ni seva ya SIP (kwa mfano, sip.linphone.org), username ΠΈ nywila - jina la mtumiaji na nenosiri la akaunti.

  3. Kukusanya Embox kama timu kufanya. Kuhusu firmware ya bodi tunayo wiki na Ibara ya.
  4. Endesha amri ya "simple_pjsua_imported" kwenye koni ya 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. Hatimaye, inasalia kuingiza spika au vipokea sauti vinavyobanwa kichwani kwenye pato la sauti, na kuongea katika maikrofoni mbili ndogo za MEMS karibu na onyesho. Tunapiga simu kutoka Linux kupitia programu simple_pjsua, pjsua. Kweli, au unaweza kutumia aina nyingine yoyote ya linphone.

Yote hii imeelezewa kwenye yetu wiki.

Tumefikaje huko

Kwa hiyo, awali swali liliondoka kuhusu kuchagua jukwaa la vifaa. Kwa kuwa ilikuwa wazi kuwa Ugunduzi wa STM32F4 haungefaa kutoka kwa kumbukumbu, Ugunduzi wa STM32F7 ulichaguliwa. Ana gari la 1 MB na 256 KB ya RAM (+ 64 kumbukumbu maalum ya haraka, ambayo tutatumia pia). Pia sio simu nyingi kupitia seva, lakini tuliamua kujaribu kutoshea.

Kwa masharti kwao wenyewe, kazi hiyo iligawanywa katika hatua kadhaa:

  • Inaendesha PJSIP kwenye QEMU. Ilikuwa rahisi kwa utatuzi, pamoja na kwamba tayari tulikuwa na usaidizi wa kodeki ya AC97 hapo.
  • Kurekodi sauti na kucheza tena kwenye QEMU na kwenye STM32.
  • Kutuma maombi rahisi_pjsua kutoka kwa PJSIP. Inakuruhusu kujiandikisha kwenye seva ya SIP na kupiga simu.
  • Tumia seva yako inayotegemea kinyota na uijaribu, kisha ujaribu za nje kama vile sip.linphone.org

Sauti katika Embox hufanya kazi kupitia Portaudio, ambayo pia inatumika katika PISIP. Shida za kwanza zilionekana kwenye QEMU - WAV ilicheza vizuri kwa 44100 Hz, lakini kwa 8000 kitu kilienda vibaya. Ilibadilika kuwa ni suala la kuweka mzunguko - kwa default ilikuwa 44100 katika vifaa, na hii haikubadilika kwa utaratibu.

Hapa, labda, inafaa kuelezea kidogo jinsi sauti inavyochezwa kwa ujumla. Kadi ya sauti inaweza kuwekwa kwa kielekezi kwa kipande cha kumbukumbu ambacho ungependa kucheza au kurekodi kwa masafa yaliyoamuliwa mapema. Baada ya bafa kuisha, ukatizaji unatolewa na utekelezaji unaendelea na bafa inayofuata. Ukweli ni kwamba bafa hizi zinahitaji kujazwa mapema wakati ile ya awali inachezwa. Tutakabiliana na tatizo hili zaidi kwenye STM32F7.

Kisha, tulikodisha seva na kusambaza nyota juu yake. Kwa kuwa ilikuwa ni lazima kurekebisha mengi, lakini sikutaka kuzungumza kwenye kipaza sauti sana, ilikuwa ni lazima kufanya uchezaji wa moja kwa moja na kurekodi. Ili kufanya hivyo, tuliweka viraka simple_pjsua ili uweze kuteleza faili badala ya vifaa vya sauti. Katika PJSIP, hii inafanywa kwa urahisi kabisa, kwa kuwa wana dhana ya bandari, ambayo inaweza kuwa kifaa au faili. Na bandari hizi zinaweza kuunganishwa kwa urahisi na bandari zingine. Unaweza kuona msimbo katika pjsip yetu hazina. Kama matokeo, mpango ulikuwa kama ifuatavyo. Kwenye seva ya kinyota, nilianza akaunti mbili - kwa Linux na kwa Embox. Ifuatayo, amri inatekelezwa kwenye Embox simple_pjsua_imported, Embox imesajiliwa kwenye seva, baada ya hapo tunaita Embox kutoka Linux. Wakati wa uunganisho, tunaangalia kwenye seva ya Asterisk kwamba uunganisho umeanzishwa, na baada ya muda tunapaswa kusikia sauti kutoka kwa Linux kwenye Embox, na katika Linux tunahifadhi faili ambayo inachezwa kutoka kwa Embox.

Baada ya kufanya kazi kwenye QEMU, tuliendelea na uhamishaji hadi STM32F7-Discovery. Tatizo la kwanza ni kwamba hazikutoshea kwenye MB 1 ya ROM bila uboreshaji wa mkusanyaji "-Os" kwa ukubwa wa picha. Ndiyo sababu tulijumuisha "-Os". Zaidi ya hayo, kiraka kililemaza usaidizi wa C ++, kwa hivyo inahitajika tu kwa pjsua, na tunatumia simple_pjsua.

Baada ya kuwekwa rahisi_pjsua, aliamua kuwa sasa kuna nafasi ya kuizindua. Lakini kwanza ilikuwa ni lazima kukabiliana na kurekodi na kucheza tena kwa sauti. Swali ni wapi kuandika? Tulichagua kumbukumbu ya nje - SDRAM (128 MB). Unaweza kujaribu hii mwenyewe:

Huunda WAV ya stereo yenye mzunguko wa 16000 Hz na muda wa sekunde 10:


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

Tunapoteza:


play -m C0000000

Kuna matatizo mawili hapa. Ya kwanza na codec - WM8994 inatumiwa, na ina kitu kama yanayopangwa, na kuna 4 ya haya yanayopangwa. Kwa hivyo, kwa chaguo-msingi, ikiwa hii haijasanidiwa, basi wakati wa kucheza sauti, uchezaji hutokea katika nafasi zote nne. . Kwa hivyo, kwa mzunguko wa 16000 Hz, tulipokea 8000 Hz, lakini kwa 8000 Hz, uchezaji haukufanya kazi. Wakati nafasi 0 na 2 pekee zilichaguliwa, ilifanya kazi kama inavyopaswa. Shida nyingine ilikuwa kiolesura cha sauti kwenye STM32Cube, ambayo pato la sauti hufanya kazi kupitia SAI (Serial Audio Interface) kwa usawa na ingizo la sauti (sikuelewa maelezo, lakini ikawa kwamba wanashiriki saa ya kawaida na wakati pato la sauti limeanzishwa, sauti inaambatishwa kwa njia fulani na mlango wake). Hiyo ni, huwezi kuziendesha kando, kwa hivyo tulifanya yafuatayo - ingizo la sauti na pato la sauti hufanya kazi kila wakati (pamoja na usumbufu hutolewa). Lakini wakati hakuna kitu kinachochezwa kwenye mfumo, basi tunaingiza bafa tupu kwenye pato la sauti, na uchezaji unapoanza, tunaanza kuijaza kwa uaminifu.

Zaidi ya hayo, tulikutana na ukweli kwamba sauti wakati wa kurekodi sauti ilikuwa kimya sana. Hii ni kutokana na ukweli kwamba maikrofoni za MEMS kwenye STM32F7-Discovery kwa namna fulani hazifanyi kazi vizuri katika masafa chini ya 16000 Hz. Kwa hivyo, tunaweka 16000 Hz, hata ikiwa 8000 Hz inakuja. Ili kufanya hivyo, ingawa, ilikuwa ni lazima kuongeza ubadilishaji wa programu ya mzunguko mmoja hadi mwingine.

Ifuatayo, ilinibidi kuongeza saizi ya lundo, ambayo iko kwenye RAM. Kulingana na hesabu zetu, pjsip ilihitaji takriban 190 KB, na tumebakisha takriban 100 KB pekee. Hapa ilibidi nitumie kumbukumbu ya nje - SDRAM (kuhusu 128 KB).

Baada ya hariri hizi zote, niliona vifurushi vya kwanza kati ya Linux na Embox, na nikasikia sauti! Lakini sauti ilikuwa ya kutisha, sio sawa na kwenye QEMU, haikuwezekana kujua chochote. Kisha tukafikiria juu ya nini inaweza kuwa jambo. Utatuzi ulionyesha kuwa Embox haina wakati wa kujaza / kupakua vibafa vya sauti. Wakati pjsip ilikuwa ikichakata fremu moja, vipindi 2 vilikuwa na wakati wa kutokea kuhusu kukamilika kwa uchakataji wa akiba, ambao ni mwingi sana. Wazo la kwanza la kasi lilikuwa uboreshaji wa mkusanyaji, lakini tayari lilikuwa limejumuishwa kwenye PJSIP. Ya pili ni sehemu ya kuelea ya vifaa, tulizungumza juu yake ndani Ibara ya. Lakini kama mazoezi yameonyesha, FPU haikutoa ongezeko kubwa la kasi. Hatua iliyofuata ilikuwa kuweka vipaumbele kwenye threads. Embox ina mikakati tofauti ya kuratibu, na nimejumuisha moja inayoauni vipaumbele na kuweka mitiririko ya sauti kwa kipaumbele cha juu zaidi. Hii pia haikusaidia.

Wazo lililofuata lilikuwa kwamba tunafanya kazi na kumbukumbu ya nje na itakuwa vizuri kuhamisha miundo huko ambayo hupatikana mara nyingi sana. Nilifanya uchambuzi wa awali wa lini na chini ya nini rahisi_pjsua hutenga kumbukumbu. Ilibadilika kuwa kati ya Kb 190, Kb 90 za kwanza zimetengwa kwa mahitaji ya ndani ya PJSIP na hazipatikani mara nyingi. Zaidi ya hayo, wakati wa simu inayoingia, kitendakazi cha pjsua_call_answer huitwa, ambamo bafa hutengwa kwa ajili ya kufanya kazi na fremu zinazoingia na zinazotoka. Ilikuwa bado kama Kb 100. Na kisha tulifanya yafuatayo. Hadi wakati wa simu, tunaweka data kwenye kumbukumbu ya nje. Mara tu simu inapopigwa, mara moja tunabadilisha lundo na nyingine - kwenye RAM. Kwa hivyo, data zote "za moto" zilihamishiwa kwenye kumbukumbu ya haraka na inayotabirika zaidi.

Kama matokeo, haya yote kwa pamoja yalifanya iwezekane kuzindua rahisi_pjsua na piga simu kupitia seva yako. Na kisha kupitia seva zingine kama vile sip.linphone.org.

Matokeo

Matokeo yake, iliwezekana kuzindua rahisi_pjsua na usambazaji wa sauti katika pande zote mbili kupitia seva. Tatizo la 128 KB ya SDRAM inaweza kutatuliwa kwa kutumia Cortex-M7 yenye nguvu zaidi (kwa mfano, STM32F769NI na 512 KB ya RAM), lakini wakati huo huo, bado hatujakata tamaa ya kuingia 256. KB πŸ™‚ Tutafurahi ikiwa mtu ana nia, Au bora zaidi, ijaribu. Vyanzo vyote, kama kawaida, viko kwenye yetu hazina.

Chanzo: mapenzi.com

Kuongeza maoni