SIP-telefon STM32F7-Discovery-s

Tere kõigile.

Mõni aeg tagasi me писали selle kohta, kuidas meil õnnestus käivitada SIP-telefon STM32F4-Discovery 1 MB ROM-i ja 192 KB RAM-iga) Embox. Siinkohal peab ütlema, et too versioon oli minimaalne ja ühendas kaks telefoni otse ilma serverita ja kõneedastusega ainult ühes suunas. Seetõttu otsustasime käivitada terviklikuma telefoni, millel on kõne läbi serveri, kõne edastamine mõlemas suunas, kuid samas hoida võimalikult väikeses mälumahus.


Telefoni jaoks otsustati valida rakendus simple_pjsua osana PJSIP teegist. See on minimaalne rakendus, mis suudab serveris registreeruda, kõnesid vastu võtta ja neile vastata. Allpool annan kohe kirjelduse, kuidas seda STM32F7-Discoverys käivitada.

Kuidas joosta

  1. Emboxi seadistamine
    make confload-platform/pjsip/stm32f7cube
  2. Määrake failis conf/mods.config vajalik SIP-konto.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    kus server on SIP-server (näiteks sip.linphone.org), kasutajanimi и parool - konto kasutajanimi ja parool.

  3. Emboxi kokkupanek meeskonnana tegema. Teave tahvli püsivara kohta, mis meil on wiki ja siit.
  4. Käivitage Emboxi konsoolis käsk "simple_pjsua_imported".
    
    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. Lõpuks jääb üle kõlarid või kõrvaklapid heliväljundisse sisestada ja rääkida kahe väikese MEMS-mikrofoniga ekraani kõrval. Helistame Linuxist läbi rakenduse simple_pjsua, pjsua. Noh, või võite kasutada mis tahes muud tüüpi telefonitelefone.

Seda kõike kirjeldatakse meie lehel wiki.

Kuidas me sinna sattusime

Seega tekkis algselt küsimus riistvaraplatvormi valimise kohta. Kuna oli selge, et STM32F4-Discovery mälu järgi ei mahu, valiti STM32F7-Discovery. Tal on 1 MB välkmälu ja 256 KB muutmälu (+ 64 spetsiaalset kiirmälu, mida ka kasutame). Samuti pole palju kõnede jaoks läbi serveri, kuid otsustasime proovida sisse mahtuda.

Tinglikult enda jaoks oli ülesanne jagatud mitmeks etapiks:

  • PJSIP-i käivitamine QEMU-s. See oli mugav silumiseks, lisaks oli meil juba seal AC97 kodeki tugi.
  • Häälsalvestus ja taasesitus QEMU-s ja STM32-s.
  • Rakenduse teisaldamine simple_pjsua PJSIP-ist. See võimaldab teil SIP-serveris registreeruda ja helistada.
  • Juurutage oma Asteriskil põhinev server ja testige seda, seejärel proovige väliseid servereid, nagu sip.linphone.org

Emboxi heli töötab Portaudio kaudu, mida kasutatakse ka PISIP-is. Esimesed probleemid ilmnesid QEMU-l – WAV mängis hästi 44100 Hz juures, aga 8000 juures läks midagi selgelt valesti. Selgus, et tegu oli sageduse seadmisega - vaikimisi oli see seadmetes 44100 ja see programmiliselt ei muutunud.

Siinkohal tasub ehk veidi selgitada, kuidas heli üldiselt mängitakse. Helikaarti saab seadistada mõnele viitele mälutükile, kust soovite etteantud sagedusel mängida või salvestada. Pärast puhvri lõppu genereeritakse katkestus ja täitmine jätkub järgmise puhvriga. Fakt on see, et need puhvrid tuleb eelmise esitamise ajal eelnevalt täita. Selle probleemiga puutume edasi STM32F7-s.

Järgmiseks rentisime serveri ja juurutasime sellele Asteriski. Kuna siluda oli vaja palju, aga mikrofoni eriti rääkida ei tahtnud, oli vaja teha automaatne taasesitus ja salvestamine. Selleks paikasime simple_pjsua, et saaksite heliseadmete asemel faile libistada. PJSIP-is tehakse seda üsna lihtsalt, kuna neil on pordi mõiste, mis võib olla kas seade või fail. Ja neid porte saab paindlikult teiste portidega ühendada. Koodi näete meie pjsip-is hoidlad. Selle tulemusena oli skeem järgmine. Asteriski serveris käivitasin kaks kontot – Linuxi ja Emboxi jaoks. Järgmisena käivitatakse käsk Emboxis simple_pjsua_importeeritud, Embox on serveris registreeritud, misjärel helistame Emboxile Linuxist. Ühenduse loomise hetkel kontrollime Asteriski serveris, et ühendus on loodud ja mõne aja pärast peaks Emboxis kuulma heli Linuxist ning Linuxis salvestame Emboxist mängitava faili.

Pärast seda, kui see töötas QEMU-ga, liikusime üle STM32F7-Discoveryle. Esimene probleem seisneb selles, et need ei mahtunud 1 MB ROM-i ilma lubatud kompilaatori optimeerimiseta "-Os" pildi suuruse jaoks. Seetõttu lisasime "-Os". Lisaks keelas plaaster C ++ toe, seega on seda vaja ainult pjsua jaoks ja me kasutame simple_pjsua-d.

Pärast paigutamist simple_pjsua, otsustas, et nüüd on võimalus see käivitada. Enne oli aga vaja tegeleda hääle salvestamise ja taasesitusega. Küsimus on selles, kuhu kirjutada? Valisime välismälu - SDRAM (128 MB). Saate seda ise proovida:

Loob stereo-WAV-i sagedusega 16000 Hz ja kestusega 10 sekundit:


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

Me kaotame:


play -m C0000000

Siin on kaks probleemi. Esimene koos koodekiga - kasutusel on WM8994 ja sellel on selline asi nagu pesa ja neid pesasid on 4. Nii et vaikimisi, kui see pole seadistatud, siis heli esitamisel toimub taasesitus kõigis neljas pesas . Seetõttu saime sagedusel 16000 Hz 8000 Hz, kuid 8000 Hz puhul taasesitus lihtsalt ei töötanud. Kui valiti ainult pesad 0 ja 2, töötas see nii nagu peab. Probleemiks oli ka STM32Cube'i heliliides, milles heliväljund töötab SAI (Serial Audio Interface) kaudu sünkroonselt helisisendiga (ma ei saanud detailidest aru, aga selgub, et neil on ühine kell ja millal heliväljund initsialiseeritakse, heli on kuidagi selle sissepääsu külge kinnitatud). See tähendab, et te ei saa neid eraldi käivitada, seega tegime järgmist - helisisend ja heliväljund töötavad alati (ka katkestused tekivad). Kuid kui süsteemis midagi ei esitata, libistame heliväljundisse lihtsalt tühja puhvri ja kui taasesitus algab, hakkame seda ausalt täitma.

Lisaks kohtasime tõsiasja, et heli salvestamise ajal oli väga vaikne. Selle põhjuseks on asjaolu, et STM32F7-Discovery MEMS-mikrofonid ei tööta kuidagi hästi sagedustel alla 16000 Hz. Seetõttu paneme 16000 Hz, isegi kui tuleb 8000 Hz. Selleks oli aga vaja lisada ühe sageduse tarkvara teisendus teiseks.

Järgmisena pidin suurendama hunniku suurust, mis asub RAM-is. Meie arvutuste kohaselt vajas pjsip umbes 190 KB ja meil on alles umbes 100 KB. Siin pidin kasutama välismälu - SDRAM-i (umbes 128 KB).

Pärast kõiki neid muudatusi nägin esimesi pakette Linuxi ja Emboxi vahel ja kuulsin heli! Aga heli oli kohutav, sugugi mitte sama, mis QEMU-l, oli võimatu millestki aru saada. Siis mõtlesime, milles asi võib olla. Silumine näitas, et Emboxil pole lihtsalt aega helipuhvrite täitmiseks / mahalaadimiseks. Sel ajal, kui pjsip töötles ühte kaadrit, oli puhvertöötluse lõpetamisel aega 2 katkestust, mis on liiga palju. Esimene mõte kiirusest oli kompilaatori optimeerimine, kuid see oli juba PJSIP-is sees. Teine on riistvaraline ujukoma, me rääkisime sellest siit. Kuid nagu praktika on näidanud, ei suurendanud FPU kiirust märkimisväärselt. Järgmine samm oli lõimede tähtsuse järjekorda seadmine. Emboxil on erinevad ajastamisstrateegiad ja olen lisanud ühe, mis toetab prioriteete ja seab helivoogudele kõrgeima prioriteedi. Seegi ei aidanud.

Järgmine mõte oli, et töötame välismäluga ja sinna oleks tore teisaldada struktuure, millele ligipääsetakse ülitihti. Tegin eelanalüüsi, millal ja mille all simple_pjsua eraldab mälu. Selgus, et 190 Kb-st on esimesed 90 Kb eraldatud PJSIP-i sisemisteks vajadusteks ja neile ei pääseta kuigi tihti ligi. Lisaks kutsutakse sissetuleva kõne ajal funktsioon pjsua_call_answer, milles seejärel eraldatakse puhvrid sissetulevate ja väljaminevate kaadritega töötamiseks. See oli ikka umbes 100 Kb. Ja siis tegime järgmist. Kuni kõne hetkeni paigutame andmed välismällu. Kohe pärast kõnet asendame hunniku kohe teisega - RAM-is. Seega kanti kõik "kuumad" andmed kiiremasse ja prognoositavamasse mällu.

Selle tulemusena võimaldas see kõik koos käivitada simple_pjsua ja helistage oma serveri kaudu. Ja siis teiste serverite kaudu, näiteks sip.linphone.org.

Järeldused

Selle tulemusena oli võimalik käivitada simple_pjsua kõneedastusega mõlemas suunas läbi serveri. Lisaks kulutatud 128 KB SDRAM-i probleemi saab lahendada veidi võimsama Cortex-M7 abil (näiteks STM32F769NI 512 KB RAM-iga), kuid samas pole me veel lootust 256-sse pääseda. KB 🙂 Meil ​​on hea meel, kui kellelgi on huvi, või veel parem, proovige järele. Kõik allikad, nagu tavaliselt, on meie lehel hoidlad.

Allikas: www.habr.com

Lisa kommentaar