SIP nga telepono sa STM32F7-Discovery

Kumusta tanan.

Kaniadto pa kita nagsulat bahin sa kung giunsa namo paglansad ang usa ka SIP nga telepono sa STM32F4-Discovery nga adunay 1 MB ROM ug 192 KB RAM) base sa Embox. Dinhi kinahanglan isulti nga kana nga bersyon gamay ra ug konektado ang duha ka mga telepono direkta nga wala’y server ug adunay transmission sa tingog sa usa ra ka direksyon. Busa, nakahukom kami nga maglunsad og usa ka mas kompleto nga telepono nga adunay usa ka tawag pinaagi sa server, voice transmission sa duha ka direksyon, apan sa samang higayon magpabilin sulod sa pinakagamay nga posibleng gidak-on sa memorya.


Alang sa telepono, nakahukom nga magpili usa ka aplikasyon simple_pjsua isip kabahin sa librarya sa PJSIP. Kini usa ka gamay nga aplikasyon nga mahimong magparehistro sa server, makadawat ug pagtubag sa mga tawag. Sa ubos hatagan dayon nako ang usa ka paghulagway kung giunsa kini pagpadagan sa STM32F7-Discovery.

Unsaon pagdagan

  1. Pag-configure sa Embox
    make confload-platform/pjsip/stm32f7cube
  2. Ibutang ang gikinahanglan nga SIP account sa conf/mods.config file.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    diin server usa ka SIP server (pananglitan, sip.linphone.org), username ΠΈ password - username ug password sa account.

  3. Pag-assemble sa Embox isip usa ka team sa paghimo sa. Mahitungod sa board firmware nga naa namo wiki ug sa artikulo.
  4. Pagdalagan ang "simple_pjsua_imported" nga sugo sa Embox console
    
    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. Sa katapusan, kini nagpabilin sa pagsal-ot sa mga speaker o headphone sa audio output, ug pagsulti sa duha ka gagmay nga MEMS mikropono sunod sa display. Nagtawag kami gikan sa Linux pinaagi sa aplikasyon nga simple_pjsua, pjsua. Aw, o mahimo nimong gamiton ang bisan unsang klase sa linphone.

Kining tanan gihulagway sa among wiki.

Unsaon namo pag-abot didto

Mao nga, sa sinugdan mitungha ang pangutana bahin sa pagpili sa usa ka plataporma sa hardware. Tungod kay klaro nga ang STM32F4-Discovery dili mohaum sa memorya, gipili ang STM32F7-Discovery. Siya adunay 1 MB flash drive ug 256 KB sa RAM (+ 64 espesyal nga paspas nga memorya, nga atong gamiton usab). Dili usab daghan alang sa mga tawag pinaagi sa server, apan nakahukom kami nga sulayan nga mohaum.

Kondisyon alang sa ilang kaugalingon, ang buluhaton gibahin sa daghang mga yugto:

  • Pagpadagan sa PJSIP sa QEMU. Kini sayon ​​​​alang sa pag-debug, dugang pa nga kami adunay suporta alang sa AC97 codec didto.
  • Pagrekord sa tingog ug playback sa QEMU ug sa STM32.
  • Pag-port sa usa ka aplikasyon simple_pjsua gikan sa PJSIP. Gitugotan ka niini nga magparehistro sa SIP server ug maghimo mga tawag.
  • I-deploy ang imong kaugalingon nga server nga nakabase sa Asterisk ug sulayi kini, unya sulayi ang mga eksternal sama sa sip.linphone.org

Ang tunog sa Embox naglihok pinaagi sa Portaudio, nga gigamit usab sa PISIP. Ang unang mga problema nagpakita sa QEMU - WAV maayo ang pagdula sa 44100 Hz, apan sa 8000 usa ka butang nga tin-aw nga sayop. Kini nahimo nga kini usa ka butang sa pag-set sa frequency - sa default kini 44100 sa mga ekipo, ug kini wala magbag-o sa programa.

Dinhi, tingali, angay nga ipasabut ang gamay kung giunsa ang tunog gipatokar sa kinatibuk-an. Ang sound card mahimong ibutang sa usa ka pointer sa usa ka piraso sa memorya nga gusto nimong dulaon o irekord sa gitakda nang daan nga frequency. Pagkahuman sa buffer, usa ka interrupt ang namugna ug ang pagpatuman nagpadayon sa sunod nga buffer. Ang tinuod mao nga kini nga mga buffer kinahanglan nga pun-on daan samtang ang nauna gidula. Atong atubangon kini nga problema sa STM32F7.

Sunod, nag-abang kami usa ka server ug gipakatap ang Asterisk niini. Tungod kay gikinahanglan ang pag-debug og daghan, apan dili ko gusto nga makigsulti sa mikropono, gikinahanglan nga maghimo og awtomatik nga playback ug pagrekord. Aron mahimo kini, among gi-patch ang simple_pjsua aron maka-slip ka sa mga file imbes sa mga audio device. Sa PJSIP, kini gihimo nga yano, tungod kay sila adunay konsepto sa usa ka pantalan, nga mahimo nga usa ka aparato o usa ka file. Ug kini nga mga pantalan mahimong dali nga konektado sa ubang mga pantalan. Makita nimo ang code sa among pjsip mga tipiganan. Ingon nga resulta, ang laraw mao ang mosunod. Sa Asterisk server, nagsugod ko og duha ka account - para sa Linux ug para sa Embox. Sunod, ang mando gipatuman sa Embox simple_pjsua_imported, Narehistro ang Embox sa server, pagkahuman gitawag namon ang Embox gikan sa Linux. Sa higayon sa koneksyon, among gisusi ang Asterisk server nga ang koneksyon natukod, ug pagkahuman sa usa ka panahon kinahanglan namon nga madungog ang tunog gikan sa Linux sa Embox, ug sa Linux among gitipig ang file nga gipatugtog gikan sa Embox.

Human kini nagtrabaho sa QEMU, mipadayon kami sa pag-port sa STM32F7-Discovery. Ang una nga problema mao nga wala sila mohaum sa 1 MB sa ROM nga wala ang gipaandar nga compiler optimization "-Os" alang sa gidak-on sa imahe. Mao nga giapil namo ang "-Os". Dugang pa, ang patch nagpugong sa suporta alang sa C ++, mao nga kini gikinahanglan lamang alang sa pjsua, ug kami naggamit sa simple_pjsua.

Human gibutang simple_pjsua, nakahukom nga karon adunay higayon nga ilunsad kini. Apan kinahanglan una nga atubangon ang pagrekord ug pag-playback sa tingog. Ang pangutana asa isulat? Gipili namo ang external memory - SDRAM (128 MB). Mahimo nimong sulayan kini sa imong kaugalingon:

Naghimo usa ka stereo WAV nga adunay frequency nga 16000 Hz ug gidugayon nga 10 segundos:


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

Napildi kami:


play -m C0000000

Adunay duha ka problema dinhi. Ang una nga adunay codec - gigamit ang WM8994, ug kini adunay usa ka butang sama sa usa ka slot, ug adunay 4 niini nga mga slot. . Busa, sa frequency nga 16000 Hz, nakadawat kami og 8000 Hz, apan alang sa 8000 Hz, ang playback wala gayud molihok. Sa diha nga ang mga slots 0 ug 2 lamang ang gipili, kini nagtrabaho ingon nga kini kinahanglan. Ang laing problema mao ang audio interface sa STM32Cube, diin ang audio output naglihok pinaagi sa SAI (Serial Audio Interface) nga dungan sa audio input (wala ko kasabot sa mga detalye, apan kini nahimo nga sila adunay usa ka komon nga orasan ug sa diha nga ang ang output sa audio gisugdan, ang audio sa usa ka paagi gilakip niini nga entrada). Kana mao, dili nimo kini mahimo nga magkalainlain, mao nga among gibuhat ang mga musunud - ang audio input ug audio output kanunay nga molihok (lakip ang mga interrupts nga nahimo). Apan kung wala’y gipatugtog sa sistema, nan nag-slip lang kami usa ka walay sulod nga buffer sa output sa audio, ug kung magsugod na ang playback, matinud-anon namon nga gisugdan kini nga pun-on.

Dugang pa, among nasugatan ang kamatuoran nga ang tingog sa panahon sa pagrekord sa tingog hilom kaayo. Kini tungod sa kamatuoran nga ang mga mikropono sa MEMS sa STM32F7-Discovery sa usa ka paagi dili molihok nga maayo sa mga frequency nga ubos sa 16000 Hz. Busa, nagtakda kami og 16000 Hz, bisan kung moabut ang 8000 Hz. Aron mahimo kini, bisan pa, kinahanglan nga magdugang usa ka pagbag-o sa software sa usa ka frequency sa lain.

Sunod, kinahanglan nakong dugangan ang gidak-on sa pundok, nga nahimutang sa RAM. Sumala sa among mga kalkulasyon, ang pjsip nanginahanglan ug mga 190 KB, ug mga 100 KB na lang ang nahabilin. Dinhi kinahanglan nako nga mogamit usa ka eksternal nga memorya - SDRAM (mga 128 KB).

Human sa tanan niini nga mga pag-edit, akong nakita ang unang mga pakete tali sa Linux ug Embox, ug akong nadungog ang tingog! Apan ang tunog makalilisang, dili parehas sa QEMU, imposible nga mahibal-an ang bisan unsa. Dayon naghunahuna kami kon unsay mahitabo. Gipakita sa pag-debug nga ang Embox wala’y oras sa pagpuno / pagdiskarga sa mga buffer sa audio. Samtang giproseso sa pjsip ang usa ka frame, adunay 2 ka interrupt nga mahitabo bahin sa pagkompleto sa pagproseso sa buffer, nga sobra ra kaayo. Ang una nga gihunahuna alang sa katulin mao ang pag-optimize sa compiler, apan naapil na kini sa PJSIP. Ang ikaduha mao ang usa ka hardware floating point, naghisgot kami bahin niini artikulo. Apan sama sa gipakita sa praktis, ang FPU wala maghatag ug dakong pagtaas sa katulin. Ang sunod nga lakang mao ang pag-una sa mga hilo. Ang Embox adunay lainlaing mga estratehiya sa pag-iskedyul, ug gilakip nako ang usa nga nagsuporta sa mga prayoridad ug nagtakda sa mga audio stream sa labing taas nga prayoridad. Kini wala usab makatabang.

Ang sunod nga ideya mao nga nagtrabaho kami gamit ang eksternal nga memorya ug maayo nga ibalhin ang mga istruktura didto nga kanunay nga ma-access. Naghimo ako usa ka pasiuna nga pagtuki kung kanus-a ug kung unsa simple_pjsua naggahin ug memorya. Nasayran nga gikan sa 190 Kb, ang unang 90 Kb gigahin alang sa internal nga panginahanglan sa PJSIP ug dili kaayo sila ma-access. Dugang pa, sa panahon sa usa ka umaabot nga tawag, ang pjsua_call_answer function gitawag, diin ang mga buffer unya gigahin alang sa pagtrabaho sa umaabot ug paggawas nga mga frame. Mga 100 Kb pa kini. Ug dayon among gibuhat ang mosunod. Hangtud sa takna sa tawag, among gibutang ang data sa external memory. Sa diha nga ang tawag, gipulihan dayon namon ang pundok sa lain - sa RAM. Sa ingon, ang tanan nga "init" nga datos gibalhin sa mas paspas ug mas matag-an nga panumduman.

Ingon usa ka sangputanan, kining tanan nga magkauban nagpaposible sa paglansad simple_pjsua ug tawag pinaagi sa imong server. Ug dayon pinaagi sa ubang mga server sama sa sip.linphone.org.

kaplag

Ingon usa ka sangputanan, posible nga maglansad simple_pjsua nga adunay voice transmission sa duha ka direksyon pinaagi sa server. Ang problema sa dugang nga gigasto nga 128 KB sa SDRAM mahimong masulbad pinaagi sa paggamit sa usa ka gamay nga labi ka kusgan nga Cortex-M7 (pananglitan, STM32F769NI nga adunay 512 KB nga RAM), apan sa parehas nga oras, wala gihapon kami nawad-an sa paglaum nga makasulod sa 256 KB πŸ™‚ Malipay kami kung adunay interesado, O mas maayo pa, sulayi kini. Ang tanan nga mga tinubdan, sama sa naandan, anaa sa atong mga tipiganan.

Source: www.habr.com

Idugang sa usa ka comment