Tere kÔigile.
MĂ”ni aeg tagasi me rÀÀkisime, kuidas me suutsime kĂ€ivitada SIP telefoni STM32F4-Discovery'l (1 MB ROM ja 192 KB RAM) pĂ”hjal . Siinkohal tuleb mĂ€rkida, et see versioon oli minimaalne ja ĂŒhendab kahte telefoni otse ilma serverita ning hÀÀle edastamine toimus vaid ĂŒhes suunas. SeetĂ”ttu otsustasime kĂ€ivitada tĂ€isfunktsionaalsema telefoni, mis helistab serveri kaudu ja edastab hÀÀlt mĂ”lemas suunas, kuid ĂŒhtlasi pĂŒĂŒame mahtuda vĂ”imalikult vĂ€ikese mĂ€lumahtu.

Telefoni jaoks otsustati valida rakendus simple_pjsua PJSIP teegi koosseisus. See on minimaalne rakendus, mis suudab registreeruda serveris, vastu vÔtta ja helistada. Allpool toon kohe vÀlja, kuidas seda STM32F7-Discovery'l kÀivitada.
Kuidas kÀivitada
- Konfigureerime Emboxi
make confload-platform/pjsip/stm32f7cube - Failis conf/mods.config mÀÀrame vajalikud SIP konto andmed.
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 password â kasutajanimi ja parool konto jaoks.
- Koostame Emboxi kÀsuga make. Meil on plaadi flashimise kohta teavet ja .
- KĂ€ivitame Emboxi konsoolis kĂ€su âsimple_pjsua_importedâ
00:00:12.870 pjsua_acc.c ....SIP vĂ€ljastamise staatus aknas 0 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 ....SĂ€ilitamise taimer kĂ€ivitatud aknas 0, sihtkoht:91.121.209.194:5060, intervall:15s - LĂ”puks peab ĂŒhendama kĂ”larite vĂ”i kĂ”rvaklappide helivĂ€ljundi ja rÀÀkima kahe vĂ€ikese MEMS mikrofoniga ekraani kĂ”rval. Helistame Linuxist rakenduse simple_pjsua, pjsua kaudu. VĂ”i vĂ”ib kasutada ka mĂ”nda muud, nĂ€iteks linphone'i.
KÔik see on kirjeldatud meie .
Kuidas me siia jÔudsime
Nii et alguses oli kĂŒsimus riistvara platvormi valikust. Kuna oli selge, et STM32F4-Discovery ei sobi mĂ€lumahtude tĂ”ttu, valiti STM32F7-Discovery. Sellel on 1 MB mĂ€lukaart ja 256 KB RAM (+ 64 KB spetsiaalset kiiret mĂ€lu, mida me ka kasutame). Samuti pole see piisav serveri kaudu kĂ”nede jaoks, kuid otsustasime proovida sisse mahutada.
Otsustasime ĂŒlesande tinglikult mitmeks etapiks jagada:
- PJSIP kÀivitamine QEMU-s. See oli mugav silumiseks, pluss seal oli juba AC97 koodeki tugi.
- HÀÀlte salvestamine ja esitamine QEMU-s ja STM32-s.
- Rakenduse portimine simple_pjsua PJSIP-ist. See vÔimaldab registreeruda SIP serveris ja helistada.
- Tee enda Asteriski baasil server ĂŒles ja testige seda, seejĂ€rel proovige vĂ€liseid, nagu sip.linphone.org
Emboxis töötab heli Portaudio kaudu, mida kasutatakse ka PISIP-is. QEMU-s ilmnesid esimesed probleemid â 44100 Hz WAV failid mĂ€ngisid hĂ€sti, kuid 8000 Hz puhul ei lĂ€inud kĂ”ik Ă”igesti. Selgus, et asi oli sageduse seadistuses â vaikimisi oli seadmel seade 44100 ja meil seda programmiliselt ei muudetud.
Siin on vĂ”ib-olla vajalik natuke selgitada, kuidas heli ĂŒldiselt mĂ€ngitakse. Helikaardile saab seadistada viitamise mingi mĂ€lukoha juurde, kust tuleb mĂ€ngida vĂ”i salvestada eelnevalt seadistatud sagedusel. PĂ€rast seda, kui pĂ”randa tĂ€itmine lĂ”peb, genereeritakse katkestus ja tĂ€itmine jĂ€tkub jĂ€rgmise pĂ”randa juurest. Asi on selles, et neid pĂ”randaid tuleb tĂ€ita ette, enne kui eelmine mĂ€ngitakse. Sellega probleemiga kohtume hiljem ka STM32F7-l.
SeejĂ€rel rentisime serveri ja paigaldasime sellele Asteriski. Kuna pidime palju tĂ”rkeotsingut tegema ja ei tahtnud palju mikrofoni rÀÀkida, oli vajalik automatiseeritud esitamine ja salvestamine. Selleks muutsime simple_pjsua nii, et saaksime faile meedia seadmete asemel sisestada. PJSIP-is on seda ĂŒsna lihtne teha, kuna neil on olemas port, mis vĂ”ib olla nii seade kui ka fail. Nende porte saab paindlikult ĂŒhendada teiste portidega. Koodi saab vaadata meie pjsip-is. LĂ”puks oli skeem jĂ€rgmine. Serveris Asterisk registreerisin kaks kontot â ĂŒhte Linuxi ja ĂŒhte Emboxi jaoks. SeejĂ€rel tĂ€idetakse Emboxis kĂ€sk simple_pjsua_imported, Embox registreerib end serveris, pĂ€rast mida helistame Linuxist Emboxile. Kohtumise hetkel kontrollime Asteriski serveris, et kĂ”ik ĂŒhendused on loodud ja mĂ”ne aja pĂ€rast peaksime kuulma Emboxis heli Linuxist, samal ajal salvestame Linuxis faili, mis prediseerib Emboxist.
Kui see QEMU-s töötama hakkas, lĂ€ksime STM32F7-Discovery portimise juurde. Esimene probleem oli see, et 1 MB ROM-i ei mahtunud ilma kompilaatori optimeerimise "-Os" sisselĂŒlitamiseta. Nii et lĂŒlitasime "-Os" sisse. Edasi, patĆĄiga lĂŒlitasime vĂ€lja C++ toete, kuna see on vajalik ainult pjsua jaoks, aga meie kasutame simple_pjsua.
Kuna mahtusime simple_pjsua, otsustasime, et nĂŒĂŒd on tĂ”enĂ€osus see kĂ€ima saada. Aga kĂ”igepealt pidime tegelema hÀÀle salvestamise ja taasesitamisega. KĂŒsimus oli - kuhu salvestada? Valisime vĂ€lise mĂ€lu - SDRAM (128 MB). Saate seda ise proovida:
Loo stereo WAV sagedusega 16000 Hz ja kestusega 10 sekundit:
record -r 16000 -c 2 -d 10000 -m C0000000
Esitame:
play -m C0000000
Siin tekkis kaks probleem. Esimene on koodekiga â kasutatakse WM8994, kus on selline asi nagu pesa, ja neid pesasid on neli. Nii et vaikimisi, kui seda ei seadista, toimub audio esitamine kĂ”igis neljas pesas. SeetĂ”ttu 16000 Hz sagedusel saime 8000 Hz, ja 8000 Hz puhul ei toimunud esitamine lihtsalt. Kui valisime ainult pesad 0 ja 2, siis töötas kĂ”ik nagu peab. Teine probleem oli audio liides STM32Cube'is, kus audio vĂ€ljund töötab lĂ€bi SAI (Serial Audio Interface) sĂŒnkroonselt audio sisendiga (ei sĂŒvenenud detailidesse, kuid tundub, et nad jagavad ĂŒhist kella ja audio vĂ€ljundi initsialiseerimisel seondub see mingil moel audio sisendiga). TĂ€hendab, neid eraldi kĂ€ivitada ei saa, seega tegime jĂ€rgmist â audio sisend ja sisend töötavad alati (sealhulgas genereeritakse katkestusi). Kuid kui sĂŒsteemis ei midagi esitatakse, siis anname audio vĂ€ljundile lihtsalt tĂŒhja puhversalvestuse, ja kui esitamine algab, hakkame seda ausalt tĂ€itma.
SeejĂ€rel kohtasime probleemi, et hÀÀlt salvestades oli heli vĂ€ga vaikne. See juhtub, kuna STM32F7-Discovery MEMS-mikrofonid ei tööta kuidagi hĂ€sti sagedustel alla 16000 Hz. SeetĂ”ttu mÀÀrame sageduseks 16000 Hz, isegi kui sisend on 8000 Hz. Selleks on tĂ”si, et tuli lisada ĂŒhe sageduse ĂŒmberprogrammeerimine teiseks.
SeejĂ€rel tuli suurendada hunniku 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 kasutada natuke vĂ€list mĂ€lu â SDRAM-i (umbes 128 kB).
PĂ€rast kĂ”iki neid muudatusi nĂ€gin esimesi pakette Linuxi ja Emboxi vahel ning kuulsin heli! Kuid heli oli kohutav, kaugel QEMU omadest, midagi polnud vĂ”imalik aru saada. Siis mĂ”tlesime, mis vĂ”iks olla probleem. Silumise kĂ€igus selgus, et Embox ei jĂ”ua lihtsalt audio-bufeere tĂ€ita / tĂŒhjendada. Kui pjsip töötas ĂŒhe raami kallal, toimusid juba kaks katkestust, mis lĂ”petasid bufeerite töötlemise, mis on liiga palju. Esimene mĂ”te kiirusel oli kompilaatori optimeerimine, kuid see oli juba PJSIP-is sisse lĂŒlitatud. Teiseks â riistvara ujuvkomaar, millest oleme rÀÀkinud. . Kuid praktika on nĂ€idanud, et FPU ei andnud mĂ€rkimisvÀÀrset kiiruskasvu. JĂ€rgmine samm oli voogude prioriteetide seadmine. Emboxis on erinevaid ajakava strateegiaid, ning ma valisin selle, mis toetab prioriteete ja seadsin audio voogudele kĂ”rgeima prioriteedi. See ei aidanud samuti.
JĂ€rgmine idee oli, et töötame vĂ€limĂ€lu abil ning oleks hea sinna paigutada strukture, millele pÀÀseda tuleb vĂ€ga tihti. Tezisin eelanalĂŒĂŒsi selle kohta, millal ja milleks simple_pjsua mĂ€lu eraldatakse. Selgus, et 190 Kb-st eraldatakse esimesed 90 Kb PJSIP-i sisemiste vajaduste tarbeks ja nendele pÀÀsemine ei toimu eriti sageli. SeetĂ”ttu kutsutakse sissetuleva kĂ”ne ajal funktsioon pjsua_call_answer, kus seejĂ€rel eraldatakse puhvrid sissetulevate ja vĂ€ljaminevate raamistikudega töötamiseks. See oli veel umbes 100 Kb. Ja siin tegime me jĂ€rgmist. Enne kĂ”net paigaldasime andmed vĂ€limĂ€lu. Kui kĂ”ik lĂ€heb kĂ”ne ajal â kohe asendame hunniku teisega â RAM-is. Nii oli kĂ”ik âkuumadâ andmed ĂŒle viidud kiiremasse ja ennustatavamasse mĂ€lu.
KokkuvÔttes vÔimaldas kÔik see kÀivitada simple_pjsua ja helistada lÀbi oma serveri. Ja siis juba lÀbi teiste serverite, nagu sip.linphone.org.
JĂ€reldused
LĂ”puks Ă”nnestus kĂ€ivitada simple_pjsua hÀÀle edastamine mĂ”lemas suunas lĂ€bi serveri. Probleemi, mis tulenes 128 Kb SDRAM lisa kulutamisest, saab lahendada veidi vĂ”imsama Cortex-M7 kasutamisega (nĂ€iteks STM32F769NI, millel on 512 Kb RAM), kuid me pole veel loobunud ka 256 Kb mahutavusse mahutamisest đ Oleme rÔÔmsad, kui keegi on sellest huvitatud, ja veel parem â proovib. KĂ”ik algfailid, nagu tavaliselt, on meie .
Allikas: habr.com
