Ffôn SIP ar STM32F7-Discovery

Helo pawb

Ychydig amser yn ôl fe wnaethon ni писали am sut y gwnaethom lwyddo i lansio ffôn SIP ar STM32F4-Discovery gyda 1 MB ROM a 192 KB RAM) yn seiliedig ar Embox. Yma mae'n rhaid dweud bod y fersiwn honno'n fach iawn ac yn cysylltu dwy ffôn yn uniongyrchol heb weinydd a gyda thrawsyriant llais i un cyfeiriad yn unig. Felly, penderfynasom lansio ffôn mwy cyflawn gyda galwad trwy'r gweinydd, trosglwyddo llais i'r ddau gyfeiriad, ond ar yr un pryd cadw o fewn y maint cof lleiaf posibl.


Ar gyfer y ffôn, penderfynwyd dewis cais syml_pjsua fel rhan o lyfrgell PJSIP. Mae hwn yn gymhwysiad lleiaf posibl sy'n gallu cofrestru ar y gweinydd, derbyn ac ateb galwadau. Isod byddaf yn rhoi disgrifiad ar unwaith o sut i'w redeg ar STM32F7-Discovery.

Sut i redeg

  1. Ffurfweddu Embox
    make confload-platform/pjsip/stm32f7cube
  2. Gosodwch y cyfrif SIP gofynnol yn y ffeil conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    lle gweinydd yn weinydd SIP (er enghraifft, sip.linphone.org), enw defnyddiwr и cyfrinair - enw defnyddiwr a chyfrinair cyfrif.

  3. Cydosod Embox fel tîm gwneud. Ynglŷn â'r firmware bwrdd sydd gennym wiki a Erthygl.
  4. Rhedeg y gorchymyn “simple_pjsua_imported” yn y consol 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. Yn olaf, mae'n dal i fod i fewnosod siaradwyr neu glustffonau yn yr allbwn sain, a siarad mewn dau ficroffon MEMS bach wrth ymyl yr arddangosfa. Rydym yn galw o Linux trwy'r cais simple_pjsua, pjsua. Wel, neu gallwch ddefnyddio unrhyw fath arall o linphone.

Disgrifir hyn i gyd ar ein wiki.

Sut wnaethon ni gyrraedd yno

Felly, i ddechrau cododd y cwestiwn am ddewis platfform caledwedd. Gan ei bod yn amlwg na fyddai STM32F4-Discovery yn ffitio o'r cof, dewiswyd STM32F7-Discovery. Mae ganddi yriant fflach 1 MB a 256 KB o RAM (+ 64 cof cyflym arbennig, y byddwn hefyd yn ei ddefnyddio). Hefyd dim llawer ar gyfer galwadau drwy'r gweinydd, ond fe benderfynon ni geisio ffitio i mewn.

Yn amodol drostynt eu hunain, rhannwyd y dasg yn sawl cam:

  • Rhedeg PJSIP ar QEMU. Roedd yn gyfleus ar gyfer dadfygio, ac roedd gennym eisoes gefnogaeth i'r codec AC97 yno.
  • Recordio llais a chwarae yn ôl ar QEMU ac ar STM32.
  • Cludo cais syml_pjsua oddi wrth PJSIP. Mae'n caniatáu ichi gofrestru ar y gweinydd SIP a gwneud galwadau.
  • Defnyddiwch eich gweinydd seren eich hun a phrofwch arno, yna rhowch gynnig ar rai allanol fel sip.linphone.org

Mae Sound in Embox yn gweithio trwy Portaudio, a ddefnyddir hefyd yn PISIP. Ymddangosodd y problemau cyntaf ar QEMU - chwaraeodd WAV yn dda ar 44100 Hz, ond ar 8000 aeth rhywbeth o'i le yn amlwg. Daeth i'r amlwg ei fod yn fater o osod yr amlder - yn ddiofyn roedd yn 44100 yn yr offer, ac nid oedd hyn yn newid yn rhaglennol.

Yma, efallai, mae'n werth esbonio ychydig sut mae'r sain yn cael ei chwarae yn gyffredinol. Gellir gosod y cerdyn sain i bwyntydd at ddarn o gof yr ydych am ei chwarae neu ei recordio ar amlder a bennwyd ymlaen llaw. Ar ôl i'r byffer ddod i ben, cynhyrchir ymyriad ac mae'r gweithredu'n parhau gyda'r byffer nesaf. Y ffaith yw bod angen llenwi'r byfferau hyn ymlaen llaw tra bod yr un blaenorol yn cael ei chwarae. Byddwn yn wynebu'r broblem hon ymhellach ar STM32F7.

Nesaf, fe wnaethom rentu gweinydd a gosod Asterisk arno. Gan fod angen dadfygio llawer, ond nid oeddwn am siarad llawer ar y meicroffon, roedd angen chwarae a recordio'n awtomatig. I wneud hyn, fe wnaethon ni glytio simple_pjsua fel y gallwch chi lithro ffeiliau yn lle dyfeisiau sain. Yn PJSIP, gwneir hyn yn eithaf syml, gan fod ganddynt y cysyniad o borthladd, a all fod naill ai'n ddyfais neu'n ffeil. A gellir cysylltu'r porthladdoedd hyn yn hyblyg â phorthladdoedd eraill. Gallwch weld y cod yn ein pjsip storfeydd. O ganlyniad, roedd y cynllun fel a ganlyn. Ar y gweinydd Asterisk, dechreuais ddau gyfrif - ar gyfer Linux ac ar gyfer Embox. Nesaf, gweithredir y gorchymyn ar Embox syml_pjsua_mewnforio, Mae Embox wedi'i gofrestru ar y gweinydd, ac ar ôl hynny rydym yn galw Embox o Linux. Ar hyn o bryd o gysylltiad, rydym yn gwirio ar y gweinydd Asterisk bod y cysylltiad wedi'i sefydlu, ac ar ôl ychydig dylem glywed sain gan Linux yn Embox, ac yn Linux rydym yn arbed y ffeil sy'n cael ei chwarae o Embox.

Ar ôl iddo weithio ar QEMU, fe wnaethom symud ymlaen i gludo i STM32F7-Discovery. Y broblem gyntaf yw nad oeddent yn ffitio i mewn i 1 MB o ROM heb yr optimeiddio casglwr wedi'i alluogi “-Os” ar gyfer maint y ddelwedd. Dyna pam yr ydym yn cynnwys "-Os". Bellach, mae'r chlytia anabl cymorth ar gyfer C ++, felly mae ei angen yn unig ar gyfer pjsua, ac rydym yn defnyddio simple_pjsua.

Ar ôl cael ei osod syml_pjsua, penderfynodd fod nawr cyfle i'w lansio. Ond yn gyntaf roedd angen delio â recordio a chwarae'r llais. Y cwestiwn yw ble i ysgrifennu? Dewison ni gof allanol - SDRAM (128 MB). Gallwch chi roi cynnig ar hyn eich hun:

Yn creu WAV stereo ag amledd o 16000 Hz a hyd o 10 eiliad:


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

Rydym yn colli:


play -m C0000000

Mae dwy broblem yma. Defnyddir y cyntaf gyda'r codec - WM8994, ac mae ganddo'r fath beth â slot, ac mae 4 o'r slotiau hyn.Felly, yn ddiofyn, os nad yw hyn wedi'i ffurfweddu, yna wrth chwarae sain, mae chwarae'n digwydd ym mhob un o'r pedwar slot . Felly, ar amlder o 16000 Hz, cawsom 8000 Hz, ond ar gyfer 8000 Hz, nid oedd chwarae yn gweithio. Pan ddewiswyd slotiau 0 a 2 yn unig, fe weithiodd fel y dylai. Problem arall oedd y rhyngwyneb sain yn y STM32Cube, lle mae'r allbwn sain yn gweithio trwy SAI (Rhyngwyneb Sain Cyfresol) yn gydamserol â'r mewnbwn sain (doeddwn i ddim yn deall y manylion, ond mae'n troi allan eu bod yn rhannu cloc cyffredin a phryd mae'r allbwn sain yn cael ei ymgychwyn, sain yn cael ei gysylltu rywsut i fynedfa). Hynny yw, ni allwch eu rhedeg ar wahân, felly fe wnaethom y canlynol - mae'r mewnbwn sain a'r allbwn sain bob amser yn gweithio (gan gynnwys ymyriadau yn cael eu cynhyrchu). Ond pan nad oes unrhyw beth yn cael ei chwarae yn y system, yna rydyn ni'n llithro byffer gwag i'r allbwn sain, a phan fydd chwarae'n dechrau, rydyn ni'n onest yn dechrau ei lenwi.

Ymhellach, daethom ar draws y ffaith bod y sain wrth recordio llais yn dawel iawn. Mae hyn oherwydd y ffaith nad yw meicroffonau MEMS ar y STM32F7-Discovery rywsut yn gweithio'n dda ar amleddau o dan 16000 Hz. Felly, rydym yn gosod 16000 Hz, hyd yn oed os daw 8000 Hz. Er mwyn gwneud hyn, fodd bynnag, roedd angen ychwanegu trosiad meddalwedd o un amledd i un arall.

Nesaf, roedd yn rhaid i mi gynyddu maint y domen, sydd wedi'i leoli yn RAM. Yn ôl ein cyfrifiadau, roedd angen tua 190 KB ar pjsip, a dim ond tua 100 KB sydd gennym ar ôl. Yma roedd yn rhaid i mi ddefnyddio rhywfaint o gof allanol - SDRAM (tua 128 KB).

Ar ôl yr holl olygiadau hyn, gwelais y pecynnau cyntaf rhwng Linux ac Embox, a chlywais y sain! Ond yr oedd y sain yn ofnadwy, ddim o gwbl yr un fath ag ar QEMU, yr oedd yn anmhosibl gwneyd dim allan. Yna fe wnaethom feddwl beth allai fod yn fater. Dangosodd dadfygio nad oes gan Embox amser i lenwi / dadlwytho byfferau sain. Er bod pjsip yn prosesu un ffrâm, roedd gan 2 ymyriad amser i ddigwydd ynghylch cwblhau prosesu byffer, sy'n ormod. Y syniad cyntaf am gyflymder oedd optimeiddio casglwyr, ond roedd eisoes wedi'i gynnwys yn PJSIP. Mae'r ail yn bwynt arnawf caledwedd, buom yn siarad amdano yn Erthygl. Ond fel y dangosodd arfer, ni roddodd FPU gynnydd sylweddol mewn cyflymder. Y cam nesaf oedd blaenoriaethu edafedd. Mae gan Embox wahanol strategaethau amserlennu, ac rwyf wedi cynnwys un sy'n cefnogi blaenoriaethau ac yn gosod ffrydiau sain i'r flaenoriaeth uchaf. Wnaeth hyn ddim helpu chwaith.

Y syniad nesaf oedd ein bod yn gweithio gyda chof allanol a byddai'n braf symud strwythurau yno y ceir mynediad iddynt yn aml iawn. Fe wnes i ddadansoddiad rhagarweiniol o bryd ac o dan beth syml_pjsua yn dyrannu cof. Daeth i'r amlwg, allan o 190 Kb, bod y 90 Kb cyntaf yn cael eu dyrannu ar gyfer anghenion mewnol PJSIP ac nid ydynt yn cael eu cyrchu'n aml iawn. Ymhellach, yn ystod galwad sy'n dod i mewn, gelwir y swyddogaeth pjsua_call_answer, lle mae byfferau wedyn yn cael eu dyrannu ar gyfer gweithio gyda fframiau sy'n dod i mewn ac allan. Roedd yn dal i fod tua 100 Kb. Ac yna gwnaethom y canlynol. Hyd at eiliad yr alwad, rydyn ni'n gosod y data mewn cof allanol. Cyn gynted ag y bydd yr alwad, rydym yn disodli'r domen ar unwaith gydag un arall - yn RAM. Felly, trosglwyddwyd yr holl ddata “poeth” i gof cyflymach a mwy rhagweladwy.

O ganlyniad, roedd hyn i gyd gyda'i gilydd yn ei gwneud hi'n bosibl lansio syml_pjsua a galwch drwy eich gweinydd. Ac yna trwy weinyddion eraill fel sip.linphone.org.

Canfyddiadau

O ganlyniad, roedd yn bosibl lansio syml_pjsua gyda thrawsyriant llais i'r ddau gyfeiriad trwy'r gweinydd. Gellir datrys y broblem gyda gwario 128 KB o SDRAM yn ychwanegol trwy ddefnyddio Cortex-M7 ychydig yn fwy pwerus (er enghraifft, STM32F769NI gyda 512 KB o RAM), ond ar yr un pryd, nid ydym wedi rhoi'r gorau i obeithio mynd i mewn i 256 o hyd. KB 🙂 Byddwn yn falch os oes gan rywun ddiddordeb, Neu well eto, rhowch gynnig arni. Mae pob ffynhonnell, yn ôl yr arfer, yn ein storfeydd.

Ffynhonnell: hab.com

Ychwanegu sylw