SIP telpon ing STM32F7-Discovery

Halo kabeh.

Sawetara wektu kepungkur kita wrote babagan carane kita bisa mbukak telpon SIP ing STM32F4-Discovery kanthi 1 MB ROM lan 192 KB RAM) adhedhasar Embox. Ing kene kudu dikandhakake manawa versi kasebut minimal lan nyambungake rong telpon langsung tanpa server lan transmisi swara mung ing siji arah. Mulane, kita mutusaké kanggo miwiti telpon luwih lengkap karo telpon liwat server, transmisi swara ing loro arah, nanging ing wektu sing padha tetep ing ukuran memori paling cilik.


Kanggo telpon, diputusake milih aplikasi prasaja_pjsua minangka bagéan saka perpustakaan PJSIP. Iki minangka aplikasi minimal sing bisa ndhaptar ing server, nampa lan njawab telpon. Ing ngisor iki aku bakal langsung menehi katrangan babagan cara mbukak ing STM32F7-Discovery.

Carane miwiti

  1. Konfigurasi Embox
    make confload-platform/pjsip/stm32f7cube
  2. Setel akun SIP sing dibutuhake ing file conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ngendi server yaiku server SIP (contone, sip.linphone.org), jeneng panganggo и sandi - jeneng pangguna lan sandhi akun.

  3. Nglumpukake Embox minangka tim nggawe. Babagan perangkat kukuh Papan kita duwe ing wiki lan ing artikel.
  4. Jalanake printah "simple_pjsua_imported" ing 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. Akhire, iku tetep kanggo masang speaker utawa headphone menyang output audio, lan ngandika menyang loro mikropon MEMS cilik jejere tampilan. Kita nelpon saka Linux liwat aplikasi simple_pjsua, pjsua. Inggih, utawa sampeyan bisa nggunakake jinis linphone liyane.

Kabeh iki diterangake ing kita wiki.

Kepiye carane kita tekan kono

Dadi, wiwitan pitakonan muncul babagan milih platform hardware. Wiwit iku cetha sing STM32F4-Discovery ora pas saka memori, STM32F7-Discovery dipilih. Dheweke duwe 1 MB flash drive lan 256 KB RAM (+ 64 memori cepet khusus, sing uga bakal digunakake). Uga ora akeh kanggo telpon liwat server, nanging kita mutusaké kanggo nyoba kanggo pas.

Sarat kanggo awake dhewe, tugas kasebut dipérang dadi sawetara tahapan:

  • Mlaku PJSIP ing QEMU. Iku trep kanggo debugging, plus kita wis support kanggo codec AC97 ana.
  • Rekaman swara lan puter maneh ing QEMU lan ing STM32.
  • Porting aplikasi prasaja_pjsua saka PJSIP. Iki ngidini sampeyan ndhaptar ing server SIP lan nelpon.
  • Pasang server basis Asterisk sampeyan dhewe lan coba, banjur coba server eksternal kayata sip.linphone.org

Swara ing Embox dianggo liwat Portaudio, sing uga digunakake ing PISIP. Masalah pisanan muncul ing QEMU - WAV diputer kanthi apik ing 44100 Hz, nanging ing 8000 ana sing salah. Iku nguripake metu sing prakara nyetel frekuensi - minangka standar 44100 ing peralatan, lan iki ora ngganti programmatically.

Kene, mbok menawa, iku worth nerangake sethitik carane swara diputer ing umum. Kertu swara bisa disetel menyang sawetara pitunjuk menyang memori sing pengin diputer utawa direkam ing frekuensi sing wis ditemtokake. Sawise buffer rampung, interupsi digawe lan eksekusi terus karo buffer sabanjure. Kasunyatane yaiku buffer kasebut kudu diisi sadurunge nalika sing sadurunge lagi diputer. Kita bakal ngadhepi masalah iki luwih ing STM32F7.

Sabanjure, kita nyewa server lan masang Asterisk ing. Wiwit iku perlu kanggo debug akeh, nanging aku ora pengin ngomong menyang mikropon akeh, iku perlu kanggo muter maneh otomatis lan ngrekam. Kanggo nindakake iki, kita nambal simple_pjsua supaya sampeyan bisa nyelehake file tinimbang piranti audio. Ing PJSIP, iki ditindakake kanthi gampang, amarga padha duwe konsep port, sing bisa dadi piranti utawa file. Lan port iki bisa disambungake kanthi fleksibel menyang port liyane. Sampeyan bisa ndeleng kode ing pjsip kita repositori. Akibaté, skema kasebut kaya ing ngisor iki. Ing server Asterisk, aku miwiti rong akun - kanggo Linux lan kanggo Embox. Sabanjure, printah kasebut dieksekusi ing Embox simple_pjsua_imported, Embox ndhaptar ing server, sawise kita nelpon Embox saka Linux. Ing wayahe sambungan, kita mriksa ing server Asterisk sambungan wis ditetepake, lan sawise sawetara wektu kita kudu krungu swara saka Linux ing Embox, lan ing Linux nyimpen file sing diputer saka Embox.

Sawise makarya ing QEMU, kita pindhah menyang porting kanggo STM32F7-Discovery. Masalah pisanan iku padha ora pas menyang 1 MB ROM tanpa Optimization compiler aktif "-Os" kanggo ukuran gambar. Mulane kita kalebu "-Os". Luwih, tembelan dipatèni support kanggo C ++, supaya iku perlu mung kanggo pjsua, lan kita nggunakake simple_pjsua.

Sawise diselehake prasaja_pjsua, mutusake yen saiki ana kesempatan kanggo miwiti. Nanging pisanan iku perlu kanggo menehi hasil karo rekaman lan puter maneh swara. Pitakonan iku ngendi kanggo nulis? Kita milih memori eksternal - SDRAM (128 MB). Sampeyan bisa nyoba iki dhewe:

Nggawe WAV stereo kanthi frekuensi 16000 Hz lan durasi 10 detik:


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

Kita kalah:


play -m C0000000

Ana rong masalah ing kene. Pisanan karo codec - WM8994 digunakake, lan wis bab kuwi minangka slot , lan ana 4 saka slot iki, dadi, minangka standar, yen iki ora diatur, banjur nalika muter audio ana puter maneh ing kabeh papat slot. . Mulane, kanthi frekuensi 16000 Hz, kita nampa 8000 Hz, nanging kanggo 8000 Hz, puter maneh mung ora bisa. Nalika mung slot 0 lan 2 kapilih, makarya minangka ngirim. Masalah liyane yaiku antarmuka audio ing STM32Cube, sing output audio bisa digunakake liwat SAI (Serial Audio Interface) bebarengan karo input audio (Aku ora ngerti rincian, nanging ternyata padha nuduhake jam umum lan nalika output audio wis initialized, audio piye wae ditempelake menyang mlebu). Yaiku, sampeyan ora bisa mbukak kanthi kapisah, mula kita nindakake ing ngisor iki - input audio lan output audio mesthi bisa digunakake (kalebu interrupts digawe). Nanging nalika ora ana sing dimainake ing sistem kasebut, mula kita mung nyelehake buffer kosong menyang output audio, lan nalika puter maneh diwiwiti, mula kanthi jujur ​​kita ngisi.

Salajengipun, kita nemoni kasunyatan manawa swara nalika ngrekam swara sepi banget. Iki amarga kasunyatan sing mikropon MEMS ing STM32F7-Discovery Piye wae ora bisa uga ing frekuensi ngisor 16000 Hz. Mulane, kita nyetel 16000 Hz, sanajan 8000 Hz teka. Nanging, kanggo nindakake iki, sampeyan kudu nambah konversi piranti lunak saka frekuensi siji menyang frekuensi liyane.

Sabanjure, aku kudu nambah ukuran tumpukan, sing ana ing RAM. Miturut petungan kita, pjsip mbutuhake udakara 190 KB, lan kita mung duwe 100 KB. Kene aku kudu nggunakake sawetara memori external - SDRAM (bab 128 KB).

Sawise kabeh suntingan iki, aku weruh paket pisanan antarane Linux lan Embox, lan aku krungu swara! Nanging swara iku elek, ora ing kabeh padha QEMU, iku mokal kanggo nggawe metu apa-apa. Banjur kita mikir babagan apa sing bisa kedadeyan. Debugging nuduhake manawa Embox ora duwe wektu kanggo ngisi / mbongkar buffer audio. Nalika pjsip ngolah siji pigura, 2 interrupts wis wektu kanggo kedaden bab completion saka Processing buffer, kang kakehan. Pikiran pisanan kanggo kacepetan yaiku optimasi kompiler, nanging wis kalebu ing PJSIP. Kapindho iku titik ngambang hardware, kita ngedika bab ing artikel. Nanging minangka laku wis ditampilake, FPU ora menehi Tambah pinunjul ing kacepetan. Langkah sabanjure yaiku prioritas utas. Embox duwe strategi jadwal sing beda-beda, lan aku wis kalebu siji sing ndhukung prioritas lan nyetel stream audio menyang prioritas paling dhuwur. Iki uga ora mbantu.

Ide sabanjure yaiku yen kita nggarap memori eksternal lan luwih becik mindhah struktur ing kana sing asring diakses. Aku nindakake analisis awal babagan kapan lan miturut apa prasaja_pjsua allocates memori. Pranyata saka 190 Kb, 90 Kb pisanan dialokasikan kanggo kabutuhan internal PJSIP lan ora asring diakses. Salajengipun, sajrone telpon mlebu, fungsi pjsua_call_answer diarani, ing ngendi buffer banjur dialokasikan kanggo nggarap pigura mlebu lan metu. Iku isih watara 100 Kb. Banjur kita nindakake ing ngisor iki. Nganti wayahe telpon, kita nyelehake data ing memori eksternal. Sanalika telpon, kita langsung ngganti tumpukan karo liyane - ing RAM. Mangkono, kabeh data "panas" ditransfer menyang memori sing luwih cepet lan bisa ditebak.

Akibaté, kabeh iki bebarengan bisa kanggo miwiti prasaja_pjsua lan nelpon liwat server sampeyan. Banjur liwat server liyane kayata sip.linphone.org.

temonan

Akibaté, bisa diluncurake prasaja_pjsua karo transmisi swara ing loro arah liwat server. Masalah karo tambahan ngginakaken 128 KB saka SDRAM bisa ditanggulangi kanthi nggunakake rada luwih kuat Cortex-M7 (contone, STM32F769NI karo 512 KB RAM), nanging ing wektu sing padha, kita isih durung menehi munggah pangarep-arep kanggo njaluk menyang 256. KB 🙂 Kita bakal bungah yen ana sing kasengsem, Utawa luwih apik, nyoba. Kabeh sumber, kaya biasane, ana ing kita repositori.

Source: www.habr.com

Add a comment