SIP telepon dina STM32F7-Papanggihan

Sampurasun sadayana.

Sakedap kamari urang wrote ngeunaan kumaha urang junun ngaluncurkeun telepon SIP dina STM32F4-Discovery kalayan 1 MB ROM sareng 192 KB RAM) dumasar kana Embox. Di dieu kudu disebutkeun yen versi ieu minimal tur disambungkeun dua telepon langsung tanpa server jeung transmisi sora ngan dina hiji arah. Kituna, urang mutuskeun pikeun ngajalankeun hiji telepon leuwih lengkep ku panggero ngaliwatan server, transmisi sora dina duanana arah, tapi dina waktos anu sareng tetep dina ukuran memori pangleutikna mungkin.


Pikeun telepon, éta mutuskeun pikeun milih hiji aplikasi simple_pjsua salaku bagian tina perpustakaan PJSIP. Ieu mangrupikeun aplikasi minimal anu tiasa ngadaptar dina server, nampi sareng ngawalon sauran. Di handap ieu kuring bakal langsung masihan katerangan kumaha ngajalankeun éta dina STM32F7-Discovery.

Kumaha ngajalankeun

  1. Ngonpigurasikeun Embox
    make confload-platform/pjsip/stm32f7cube
  2. Nyetél akun SIP diperlukeun dina file conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    di mana server nyaéta server SIP (contona, sip.linphone.org), ngaran pamaké и password - ngaran pamaké sarta sandi akun.

  3. Assembling Embox salaku tim nyieun. Ngeunaan firmware dewan kami boga on wiki jeung artikel.
  4. Jalankeun paréntah "simple_pjsua_imported" dina konsol 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. Tungtungna, éta tetep nyelapkeun spiker atanapi headphone kana kaluaran audio, sareng nyarios kana dua mikrofon MEMS leutik di gigireun tampilan. Urang nelepon ti Linux Ubuntu ngaliwatan aplikasi simple_pjsua, pjsua. Nya, atanapi anjeun tiasa nganggo jinis linphone anu sanés.

Sadaya ieu dijelaskeun dina kami wiki.

Kumaha urang nepi ka dinya

Janten, mimitina patarosan timbul ngeunaan milih platform hardware. Kusabab éta écés yén STM32F4-Papanggihan moal cocog tina mémori, dipilih STM32F7-Papanggihan. Anjeunna gaduh 1 MB flash drive sareng 256 KB RAM (+ 64 mémori gancang khusus, anu ogé bakal kami anggo). Ogé teu loba pikeun nelepon ngaliwatan server, tapi urang mutuskeun pikeun nyobaan pas.

Sarat pikeun diri, tugas dibagi kana sababaraha tahap:

  • Ngajalankeun PJSIP on QEMU. Éta merenah pikeun debugging, tambah kami geus boga rojongan pikeun codec AC97 dinya.
  • Rékam sora sareng playback dina QEMU sareng dina STM32.
  • Porting hiji aplikasi simple_pjsua ti PJSIP. Éta ngamungkinkeun anjeun ngadaptar dina server SIP sareng nelepon.
  • Nyebarkeun server basis Asterisk anjeun sorangan sareng uji éta, teras cobian anu éksternal sapertos sip.linphone.org

Sora dina Embox dianggo ngaliwatan Portaudio, anu ogé dianggo dina PISIP. Masalah mimiti muncul dina QEMU - WAV dicoo ogé dina 44100 Hz, tapi dina 8000 hal jelas salah. Tétéla éta masalah netepkeun frékuénsi - sacara standar éta 44100 alat, sarta ieu teu robah programmatically.

Di dieu, sigana, éta patut ngajelaskeun saeutik kumaha sora dimaénkeun sacara umum. Kartu sora bisa disetel ka sababaraha pointer kana sapotong memori ti mana Anjeun hoyong muterkeun atawa ngarekam dina frékuénsi predetermined. Saatos panyangga ends, hiji interupsi dihasilkeun sarta palaksanaan terus jeung panyangga salajengna. Kanyataan yén panyangga ieu kedah dieusi sateuacanna nalika anu sateuacana dimaénkeun. Urang bakal nyanghareupan masalah ieu salajengna dina STM32F7.

Salajengna, urang nyéwa server sareng nyebarkeun Asterisk di dinya. Kusabab éta peryogi pisan debug, tapi kuring henteu hoyong seueur nyarios kana mikropon, éta kedah dilakukeun playback sareng ngarékam otomatis. Jang ngalampahkeun ieu, kami nambal simple_pjsua supados anjeun tiasa ngagentos file tinimbang alat audio. Dina PJSIP, ieu dipigawé cukup basajan, sabab boga konsép port, nu bisa jadi alat atawa file. Jeung palabuhan ieu bisa flexibly disambungkeun ka palabuhan séjén. Anjeun tiasa ningali kode dina pjsip kami repositories. Hasilna, skéma ieu kieu. Dina server Asterisk, kuring ngamimitian dua akun - pikeun Linux sareng Embox. Salajengna, paréntah dieksekusi dina Embox simple_pjsua_imported, Embox ngadaptar dina server, nu satutasna urang nelepon Embox ti Linux. Dina momen sambungan, urang pariksa dina server Asterisk yén sambungan geus ngadegkeun, sarta sanggeus bari urang kedah ngadangu sora tina Linux Ubuntu dina Embox, sarta dina Linux Ubuntu urang nyimpen file nu diputer ti Embox.

Saatos eta digarap dina QEMU, urang dipindahkeun kana porting ka STM32F7-Papanggihan. Masalah kahiji nyaeta aranjeunna henteu pas kana 1 MB ROM tanpa optimasi compiler diaktipkeun "-Os" pikeun ukuran gambar. Éta pisan sababna naha urang kaasup "-Os". Salajengna, patch ditumpurkeun rojongan pikeun C ++, ku kituna diperlukeun ngan pikeun pjsua, sarta kami nganggo simple_pjsua.

Sanggeus ditempatkeun simple_pjsua, mutuskeun yén ayeuna aya kasempetan pikeun ngajalankeun eta. Tapi mimitina éta perlu nungkulan rékaman jeung playback sora. Patarosan na dimana nulis? Urang milih memori éksternal - SDRAM (128 MB). Anjeun tiasa nyobian ieu sorangan:

Nyiptakeun WAV stereo kalayan frékuénsi 16000 Hz sareng durasi 10 detik:


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

Urang leungit:


play -m C0000000

Aya dua masalah di dieu. Kahiji jeung codec nu - WM8994 dipaké, sarta mibanda hiji hal saperti slot , tur aya 4 tina liang ieu, ku kituna, sacara standar, lamun ieu teu ngonpigurasi, lajeng nalika maén audio, playback lumangsung dina sakabéh opat liang. . Ku alatan éta, dina frékuénsi 16000 Hz, kami nampi 8000 Hz, tapi pikeun 8000 Hz, playback ngan saukur teu jalan. Nalika ngan slot 0 jeung 2 dipilih, digawé sakumaha sakuduna. Masalah sanésna nyaéta antarmuka audio dina STM32Cube, dimana kaluaran audio tiasa dianggo via SAI (Serial Audio Interface) sinkron sareng input audio (Kuring henteu ngartos detilna, tapi tétéla aranjeunna ngabagi jam umum sareng nalika kaluaran audio ieu initialized, audio kumaha bae napel eta lawang). Nyaéta, anjeun moal tiasa ngajalankeunana nyalira, janten kami ngalakukeun ieu - input audio sareng kaluaran audio salawasna jalan (kaasup interrupts dihasilkeun). Tapi nalika teu aya anu dimaénkeun dina sistem, maka urang ngan saukur nyelapkeun panyangga kosong kana kaluaran audio, sareng nalika playback dimimitian, urang jujur ​​​​ngawitan ngeusian éta.

Salajengna, urang mendakan kanyataan yén sora nalika ngarékam sora sepi pisan. Ieu alatan kanyataan yén mikropon MEMS dina STM32F7-Papanggihan kumaha bae teu dianggo ogé dina frékuénsi handap 16000 Hz. Kituna, urang nyetel 16000 Hz, sanajan 8000 Hz datang. Pikeun ngalakukeun ieu, sanaos, anjeun kedah nambihan konvérsi parangkat lunak tina hiji frékuénsi ka anu sanés.

Salajengna, kuring kedah ningkatkeun ukuran tumpukan, anu aya dina RAM. Numutkeun itungan kami, pjsip diperlukeun ngeunaan 190 KB, sarta kami ngan boga ngeunaan 100 KB ditinggalkeun. Di dieu kuring kungsi ngagunakeun sababaraha memori éksternal - SDRAM (kira-kira 128 KB).

Saatos sadaya éditan ieu, kuring ningali bungkusan munggaran antara Linux sareng Embox, sareng kuring nguping sora! Tapi sora éta pikareueuseun, teu sakabehna sarua dina QEMU, éta teu mungkin pikeun nyieun kaluar nanaon. Lajeng urang mikir ngeunaan naon bisa jadi masalah. Debugging nunjukkeun yén Embox ngan saukur teu gaduh waktos ngeusian / ngabongkar panyangga audio. Bari pjsip ieu ngolah hiji pigura, 2 interrupts kungsi waktos lumangsung ngeunaan parantosan processing panyangga, nu teuing. Pikiran munggaran pikeun speed éta optimasi compiler, tapi ieu geus kaasup dina PJSIP. Anu kadua nyaéta titik ngambang hardware, kami parantos ngobrol ngeunaan éta artikel. Tapi sakumaha prakték geus ditémbongkeun, FPU teu masihan kanaékan signifikan dina speed. Lengkah saterusna nya éta prioritas threads. Embox boga strategi scheduling béda, sarta kuring geus kaasup hiji nu ngarojong prioritas tur nyetel aliran audio kana prioritas pangluhurna. Ieu ogé henteu ngabantosan.

Gagasan salajengna nyaéta yén urang damel sareng mémori éksternal sareng langkung saé pikeun mindahkeun struktur anu sering diaksés. Kuring ngalakukeun analisa awal iraha sareng dina naon simple_pjsua allocates memori. Tétéla tina 190 Kb, 90 Kb munggaran dialokasikeun pikeun kabutuhan internal PJSIP sareng henteu sering diakses. Salajengna, dina mangsa telepon asup, pjsua_call_answer disebut fungsi, nu buffers lajeng dialokasikeun pikeun gawé bareng pigura asup jeung kaluar. Ieu masih ngeunaan 100 Kb. Lajeng urang ngalakukeun di handap. Nepi ka momen panggero, urang nempatkeun data dina mémori éksternal. Pas nelepon, urang langsung ngaganti numpuk jeung nu sejen - dina RAM. Ku kituna, sadaya data "panas" ditransfer ka memori gancang sarta leuwih bisa diprediksi.

Hasilna, sadaya ieu babarengan ngamungkinkeun pikeun ngajalankeun simple_pjsua jeung nelepon ngaliwatan server Anjeun. Lajeng ngaliwatan server séjén kayaning sip.linphone.org.

papanggihan

Hasilna, éta mungkin pikeun ngajalankeun simple_pjsua kalawan transmisi sora dina duanana arah ngaliwatan server. Masalah sareng tambahan spent 128 KB of SDRAM bisa direngsekeun ku ngagunakeun rada leuwih kuat Cortex-M7 (Contona, STM32F769NI kalawan 512 KB RAM), tapi dina waktos anu sareng, urang masih teu nyerah harepan pikeun meunangkeun kana 256. KB 🙂 Urang bakal bungah lamun batur museurkeun, Atawa hadé acan, coba eta. Sadaya sumber, sapertos biasa, aya dina kami repositories.

sumber: www.habr.com

Tambahkeun komentar