Tere kÔigile.
MĂ”nda aega tagasi kirjutasime kuidas me suudame kĂ€ivitada SIP telefoni STM32F4-Discovery'l 1 MB ROM-i ja 192 KB RAM-iga, mis pĂ”hineb . Tuleb öelda, et see versioon oli minimaalne ja ĂŒhendas kaks telefoni otse ilma serverita ning hÀÀl edastati vaid ĂŒhes suunas. Seega otsustasime kĂ€ivitada tĂ€ielikuma telefoni, kus kĂ”ned toimuvad serveri kaudu, hÀÀl edastatakse mĂ”lemas suunas, kuid samas hoida mĂ€lu vĂ”imalikult vĂ€ikese suurusega.

Telefonile otsustati valida rakendus simple_pjsua , mis kuulub PJSIP raamatukogusse. See on minimaalne rakendus, mis oskab registreerida end serveris, vastu vĂ”tta ja helistada. Allpool anname kohe ĂŒlevaate, kuidas seda STM32F7-Discovery'l kĂ€ivitada.
Kuidas kÀivitada
- Konfigureerime Emboxi
make confload-platform/pjsip/stm32f7cube - Failis conf/mods.config seadistame vajaliku SIP kontode.
include platform.pjsip.cmd.simple_pjsua_imported( sip_domain="server", sip_user="username", sip_passwd="password")kus server â see on SIP server (nĂ€iteks sip.linphone.org), username ja parool â kasutajanimi ja parool konto jaoks.
- Kogume Emboxi kÀsuga tee. Juhend tarkvara laadimiseks on meil olemas ja .
- KĂ€ivitage Emboxi konsoolis kĂ€sk âsimple_pjsua_importedâ
00:00:12.870 pjsua_acc.c ....SIP vÀljuv staatus konto 0 jaoks ei ole aktiivne 00:00:12.884 pjsua_acc.c ....sip:alexk2222@sip.linphone.org: registreerimine Ônnestus, staatus=200 (registreerimine Ônnestus 00:00:12.911 pjsua_acc.c ....Hoidmisajastuse taimer kÀivitati konto 0 jaoks, sihtkoht:91.121.209.194:5060, intervall:15s - LÔpuks jÀÀb ainult vÀljastada kÔlarid vÔi kÔrvaklapid helivÀljundisse ning rÀÀkida kahe vÀikese MEMS mikrofoniga ekraani kÔrval. Helistame linuks soovitusel rakenduse simple_pjsua, pjsua kaudu. VÔi vÔite kasutada midagi muud, nÀiteks linphone.
KÔik see on kirjeldatud meie .
Kuidas me siia jÔudsime
Nii et esmalt seisis kĂŒsimus riistvara platvormi valikust. Kuna oli selge, et STM32F4-Discovery ei sobi mĂ€lumahu tĂ”ttu, valiti STM32F7-Discovery. Sellel on 1 MB vĂ€lk ja 256 KB RAM-i (+ 64 KB eraldi kiiret mĂ€lu, mida me samuti kasutame). See ei ole ka palju serveri kaudu helistamiseks, kuid otsustasime proovida.
Otsustasime jagada ĂŒlesande tinglikult mitmeks etapiks:
- PJSIP kÀivitamine QEMU-s. See oli mugav silumiseks, lisaks oli meil seal juba AC97 kodeki tugi.
- HÀÀlte salvestamine ja kordamine QEMU-s ja STM32-l.
- Rakenduse edastamine simple_pjsua PJSIP kokku pannud. See vÔimaldab registreeruda SIP serveris ja helistada.
- Koosta oma server Asterisk baasil ja testige sellel, seejÀrel proovige vÀliseid, nagu sip.linphone.org.
HÀÀl Emboxis töötab Portaudio kaudu, mida kasutatakse ka PISIPis. QEMU-s ilmusid esimesed probleemid â 44100 Hz WAV-failid mĂ€ngisid hĂ€sti, aga 8000 Hz puhul lĂ€ks midagi valesti. Selgus, et probleem oli sageduse seadistustes â vaikimisi oli riistvaras 44100, ja me ei saanud seda programmiga muuta.
Siin on vĂ”ib-olla mĂ”istlik natuke selgitada, kuidas ĂŒldse helide esitamine toimub. Helikaardile saab seadistada teatud nĂ€itaja mĂ€lu tĂŒkile, millest tuleb esitada vĂ”i salvestada eelnevalt seadistatud sagedusel. Kui puhver saab otsa, genereeritakse katkestus ja tĂ€itmine jĂ€tkub jĂ€rgmise puhvri juurest. Asi on selles, et neid puhvrit tuleb eelnevalt tĂ€ita, kuni eelmine toitmine kestab. Selle probleemiga kohtume hiljem STM32F7-l.
SeejĂ€rel rentisime serveri ja seadistasime sellele Asteriski. Kuna tuli palju siluda, ja rÀÀkimine mikrofonis ei olnud just meeldiv, tuli teha automaatne esitamine ja salvestamine. Selle jaoks patĆĄisime simple_pjsua nii, et saaksime faile heliseadmete asemel esitada. PJSIP-is on see ĂŒsna lihtne, kuna neil on olemas port, mis vĂ”ib olla nii seade kui ka fail. Ja neid porte saab paindlikult ĂŒhendada teiste portidega. Koodi saab vaadata meie pjsip . LĂ”pptulemusena oli skeem jĂ€rgmine. Asteriski serveris tĂ”in sisse kaks kontot â ĂŒhele Linuxile ja ĂŒhele Emboxile. SeejĂ€rel, Emboxis kĂ€itatakse kĂ€sku simple_pjsua_imported, Embox registreerib end serveris, pĂ€rast mida helistame Linuxist Emboxile. Ăhenduse loomise hetkel kontrollime Asteriski serveris, et kĂ”ik ĂŒhendused on loodud ja mĂ”ne aja pĂ€rast peaksime Emboxis kuulma hÀÀlt Linuxist, samal ajal kui Linuxisse salvestame faili, mis mĂ€ngib Emboxist.
PĂ€rast seda, kui see QEMU-s tööle hakkas, liikusime STM32F7-Discovery portimise juurde. Esimene probleem â ei mahtunud 1 MB ROM-i ilma kompilatsiooni optimeerimiseta "-Os" pildi suuruse tĂ”ttu. SeetĂ”ttu lĂŒlitasime "-Os" sisse. Edasi, patĆĄiga lĂŒlitasime vĂ€lja C++ toe, kuna seda vajame ainult pjsua jaoks, kuid kasutame simple_pjsua-d.
PĂ€rast seda, kui mahtusime simple_pjsua, otsustasime, et nĂŒĂŒd on vĂ”imalus see kĂ€ivitada. Kuid kĂ”igepealt pidime aru saama hÀÀle salvestamisest ja esitamisest. KĂŒsimus â kuhu salvestada? Valisime vĂ€lise mĂ€lu â SDRAM (128 MB). VĂ”ite proovida seda ise:
Loob loob stereo WAV sagedusega 16000 Hz ja kestusega 10 sekundit:
record -r 16000 -c 2 -d 10000 -m C0000000
MĂ€ngime:
play -m C0000000
Siin tekkis kaks probleemi. Esiteks koodekiga - kasutatakse WM8994, kus on selline mĂ”isted nagu slot, ja neid slotte on neli. Nii et vaikimisi, kui seda ei seadista, toimub audio esitamine kĂ”igis neljas slotis. Seega sagedusel 16000 Hz saime 8000 Hz, ja 8000 Hz jaoks ei töötanud esitamine ĂŒldse. Kui valiti ainult slottide 0 ja 2, töötas see nagu vaja. Teiseks probleemiks oli audio liides STM32Cube'is, kus audio vĂ€ljund töötab SAI (Serial Audio Interface) kaudu sĂŒnkroonselt audio sisendiga (ma ei sĂŒvenenud detailidesse, kuid tundub, et nad jagavad ĂŒhist kella ja audio vĂ€ljundi initsialiseerimisel seondub see kuidagi audio sisendi juurde). Seega ei saa neid eraldi kĂ€ivitada, seega tegime jĂ€rgmist - audio sisend ja audio vĂ€ljund töötavad alati (sealhulgas genereeritakse katkestusi). Kuid kui sĂŒsteemis ei esitata midagi, siis anname audio vĂ€ljundile lihtsalt tĂŒhja puhvri, ja kui esitamine kĂ€ivitub, hakkame seda ausalt tĂ€itma.
SeejĂ€rel seisisime silmitsi probleemiga, et heli salvestamisel oli hÀÀl vĂ€ga vaikne. See juhtub seetĂ”ttu, et MEMS mikrofonid STM32F7-Discovery'l töötavad kuidagi halvasti sagedustel, mis on madalamad kui 16000 Hz. Seega seadistame sageduse 16000 Hz, isegi kui tuleb 8000 Hz. Selleks tuli tĂ”si kĂŒll lisada programmi konversioon ĂŒhte sagedust teise.
JÀrgmiseks tuli suurendada virna suurust, mis asub RAM-is. Meie arvutuste kohaselt nÔudis pjsip umbes 190 KB, kuid meil jÀi alles vaid umbes 100 KB. Siin tuli natuke vÀlist mÀlu kaasata - SDRAM (umbes 128 KB).
KĂ”ikide nende paranduste jĂ€rel nĂ€gin esimesi pakette Linuxi ja Emboxi vahel ning kuulsin heli! Kuid heli oli kohutav, kaugel sellest, mis oli QEMU-s, ei saanud midagi aru. Siis mĂ”tlesime, mis vĂ”ib olla probleem. Silumisprotsess nĂ€itas, et Embox ei suuda lihtsalt audio puhvereid tĂ€ita/loosida. Kui pjsip töötleb ĂŒhte raami, toimus 2 katkestust puhverite töötlemise lĂ”petamiseks, mis on liiga palju. Esmaseks mĂ”tteks kiiruskasvuks oli kompilaatori optimeerimine, kuid see oli PJSIP-is juba sisse lĂŒlitatud. Teiseks - riistvaraline ujuvpunktsioon, millest rÀÀkisime. . Kuid praktika nĂ€itas, et FPU ei toonud olulist kiirusetĂ”usu. JĂ€rgmine samm oli voogude prioriteetide seadmine. Emboxis on erinevad planeerimisstrateegiad, ja ma valisin selle, mis toetab prioriteete ning seadistasin audio voogudele maksimaalse prioriteedi. See ei aidanud samuti.
JĂ€rgmiseks oli mĂ”te, et töötame vĂ€lisse mĂ€lu ja oleks hea need struktuurid sinna ĂŒle viia, millega sageli manipuleeritakse. Tehtud oli eelanalĂŒĂŒs selle kohta, millal ja mille jaoks simple_pjsua mĂ€lu eraldatakse. Selgus, et 190 Kb-st eraldatakse esimesed 90 Kb sisemisteks vajadusteks PJSIP ja nende poole pöördumine ei toimu vĂ€ga sageli. SeejĂ€rel, sissetuleva kĂ”ne ajal, kutsutakse funktsioon pjsua_call_answer, kus seejĂ€rel eraldatakse puhvrisid tööks sissetulevate ja vĂ€ljuvate raamidega. See oli veel umbes 100 Kb. Ja tegime jĂ€rgnevalt. Enne kĂ”net paigutame andmed vĂ€lisse mĂ€llu. Niipea, kui kĂ”ne algab, asendame kohe kĂŒhvel teise â RAMis. Nii et kĂ”ik âkuumadâ andmed viidi kiiremisse ja ettearvamatumasse mĂ€llu.
KokkuvÔttes vÔimaldas see kÔik kÀivitada simple_pjsua ja helistada oma serveri kaudu. SeejÀrel ka lÀbi teiste serverite, nagu sip.linphone.org.
JĂ€reldused
KokkuvĂ”ttes Ă”nnestus simple_pjsua edastada hÀÀlt mĂ”lemas suunas serveri kaudu. Probleemi lisakulu 128 Kb SDRAM-i lahendamiseks vĂ”iksime kasutada veidi vĂ”imsamat Cortex-M7 (nĂ€iteks STM32F769NI 512 Kb RAM-iga), kuid samas pole me veel kaotanud lootust mahtuda ka 256 Kb đ Ootame, et keegi vĂ”iks huvi tunda, ja veel parem â proovida. KĂ”ik lĂ€htekoodid, nagu tavaliselt, on meie .
Allikas: habr.com
