SIP telefon pada STM32F7-Discovery

Helo semua.

Beberapa ketika yang lalu kami писали tentang cara kami berjaya melancarkan telefon SIP pada STM32F4-Discovery dengan 1 MB ROM dan 192 KB RAM) berdasarkan Embox. Di sini mesti dikatakan bahawa versi itu adalah minimum dan menghubungkan dua telefon secara langsung tanpa pelayan dan dengan penghantaran suara hanya dalam satu arah. Oleh itu, kami memutuskan untuk melancarkan telefon yang lebih lengkap dengan panggilan melalui pelayan, penghantaran suara dalam kedua-dua arah, tetapi pada masa yang sama mengekalkan saiz memori yang paling kecil.


Untuk telefon, ia telah memutuskan untuk memilih aplikasi simple_pjsua sebagai sebahagian daripada perpustakaan PJSIP. Ini adalah aplikasi minimum yang boleh mendaftar di pelayan, menerima dan menjawab panggilan. Di bawah saya akan segera memberikan penerangan tentang cara menjalankannya pada STM32F7-Discovery.

Bagaimana hendak berlari

  1. Mengkonfigurasi Embox
    make confload-platform/pjsip/stm32f7cube
  2. Tetapkan akaun SIP yang diperlukan dalam fail conf/mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    mana server ialah pelayan SIP (contohnya, sip.linphone.org), nama pengguna ΠΈ kata laluan - nama pengguna dan kata laluan akaun.

  3. Memasang Embox sebagai satu pasukan membuat. Mengenai perisian tegar papan yang kami ada wiki dan artikel.
  4. Jalankan arahan "simple_pjsua_imported" dalam 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. Akhirnya, ia kekal untuk memasukkan pembesar suara atau fon kepala ke dalam output audio, dan bercakap ke dalam dua mikrofon MEMS kecil di sebelah paparan. Kami memanggil dari Linux melalui aplikasi simple_pjsua, pjsua. Nah, atau anda boleh menggunakan mana-mana jenis linphone lain.

Semua ini diterangkan pada kami wiki.

Bagaimana kami sampai ke sana

Jadi, pada mulanya timbul persoalan tentang memilih platform perkakasan. Memandangkan jelas bahawa STM32F4-Discovery tidak akan muat dari ingatan, STM32F7-Discovery telah dipilih. Dia mempunyai pemacu kilat 1 MB dan 256 KB RAM (+ 64 memori pantas khas, yang juga akan kami gunakan). Juga tidak banyak untuk panggilan melalui pelayan, tetapi kami memutuskan untuk cuba menyesuaikan diri.

Secara bersyarat untuk diri mereka sendiri, tugas itu dibahagikan kepada beberapa peringkat:

  • Menjalankan PJSIP di QEMU. Ia mudah untuk penyahpepijatan, dan kami sudah pun mempunyai sokongan untuk codec AC97 di sana.
  • Rakaman suara dan main balik pada QEMU dan pada STM32.
  • Memindahkan aplikasi simple_pjsua daripada PJSIP. Ia membolehkan anda mendaftar pada pelayan SIP dan membuat panggilan.
  • Gunakan pelayan berasaskan Asterisk anda sendiri dan uji padanya, kemudian cuba yang luaran seperti sip.linphone.org

Bunyi dalam Embox berfungsi melalui Portaudio, yang juga digunakan dalam PISIP. Masalah pertama muncul pada QEMU - WAV dimainkan dengan baik pada 44100 Hz, tetapi pada 8000 sesuatu jelas berlaku. Ternyata ia adalah masalah menetapkan kekerapan - secara lalai ia adalah 44100 dalam peralatan, dan ini tidak berubah secara pemrograman.

Di sini, mungkin, ia patut menerangkan sedikit bagaimana bunyi itu dimainkan secara umum. Kad bunyi boleh ditetapkan kepada beberapa penunjuk kepada sekeping memori yang anda ingin mainkan atau rakam pada frekuensi yang telah ditetapkan. Selepas penimbal tamat, gangguan dijana dan pelaksanaan diteruskan dengan penimbal seterusnya. Hakikatnya ialah penimbal ini perlu diisi terlebih dahulu semasa yang sebelumnya sedang dimainkan. Kami akan menghadapi masalah ini lebih jauh mengenai STM32F7.

Seterusnya, kami menyewa pelayan dan menggunakan Asterisk padanya. Memandangkan anda perlu banyak menyahpepijat, tetapi saya tidak mahu bercakap banyak ke dalam mikrofon, anda perlu membuat main balik dan rakaman automatik. Untuk melakukan ini, kami menampal simple_pjsua supaya anda boleh menyelitkan fail dan bukannya peranti audio. Dalam PJSIP, ini dilakukan dengan agak mudah, kerana mereka mempunyai konsep port, yang boleh menjadi sama ada peranti atau fail. Dan port ini boleh disambungkan secara fleksibel ke port lain. Anda boleh melihat kod dalam pjsip kami repositori. Hasilnya, skim tersebut adalah seperti berikut. Pada pelayan Asterisk, saya memulakan dua akaun - untuk Linux dan untuk Embox. Seterusnya, arahan itu dilaksanakan pada Embox simple_pjsua_imported, Embox mendaftar pada pelayan, selepas itu kami memanggil Embox dari Linux. Pada masa sambungan, kami menyemak pada pelayan Asterisk bahawa sambungan telah diwujudkan, dan selepas beberapa ketika kami akan mendengar bunyi dari Linux dalam Embox, dan di Linux kami menyimpan fail yang dimainkan dari Embox.

Selepas ia berfungsi pada QEMU, kami beralih ke pemindahan ke STM32F7-Discovery. Masalah pertama ialah mereka tidak sesuai dengan 1 MB ROM tanpa pengoptimuman pengkompil yang didayakan "-Os" untuk saiz imej. Itulah sebabnya kami memasukkan "-Os". Selanjutnya, tampung melumpuhkan sokongan untuk C ++, jadi ia hanya diperlukan untuk pjsua, dan kami menggunakan simple_pjsua.

Selepas diletakkan simple_pjsua, memutuskan bahawa kini ada peluang untuk melancarkannya. Tetapi pertama sekali adalah perlu untuk menangani rakaman dan main semula suara. Persoalannya di mana hendak menulis? Kami memilih memori luaran - SDRAM (128 MB). Anda boleh mencuba ini sendiri:

Mencipta WAV stereo dengan frekuensi 16000 Hz dan tempoh 10 saat:


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

Kita kalah:


play -m C0000000

Terdapat dua masalah di sini. Yang pertama dengan codec - WM8994 digunakan, dan ia mempunyai perkara seperti slot, dan terdapat 4 daripada slot ini. Jadi, secara lalai, jika ini tidak dikonfigurasikan, maka apabila memainkan audio, main semula berlaku dalam keempat-empat slot . Oleh itu, pada frekuensi 16000 Hz, kami menerima 8000 Hz, tetapi untuk 8000 Hz, main semula tidak berfungsi. Apabila hanya slot 0 dan 2 dipilih, ia berfungsi sebagaimana mestinya. Masalah lain ialah antara muka audio dalam STM32Cube, di mana output audio berfungsi melalui SAI (Antara Muka Audio Bersiri) serentak dengan input audio (saya tidak memahami butirannya, tetapi ternyata mereka berkongsi jam biasa dan apabila output audio dimulakan, audio entah bagaimana dilampirkan pada pintu masuknya). Iaitu, anda tidak boleh menjalankannya secara berasingan, jadi kami melakukan perkara berikut - input audio dan output audio sentiasa berfungsi (termasuk gangguan dijana). Tetapi apabila tiada apa-apa yang dimainkan dalam sistem, maka kami hanya memasukkan penimbal kosong ke dalam output audio, dan apabila main balik bermula, kami secara jujur ​​mula mengisinya.

Selanjutnya, kami menemui fakta bahawa bunyi semasa rakaman suara adalah sangat senyap. Ini disebabkan oleh fakta bahawa mikrofon MEMS pada STM32F7-Discovery entah bagaimana tidak berfungsi dengan baik pada frekuensi di bawah 16000 Hz. Oleh itu, kami menetapkan 16000 Hz, walaupun 8000 Hz datang. Untuk melakukan ini, bagaimanapun, adalah perlu untuk menambah penukaran perisian dari satu frekuensi kepada yang lain.

Seterusnya, saya terpaksa meningkatkan saiz timbunan, yang terletak dalam RAM. Mengikut pengiraan kami, pjsip memerlukan kira-kira 190 KB, dan kami hanya mempunyai lebih kurang 100 KB lagi. Di sini saya terpaksa menggunakan beberapa memori luaran - SDRAM (kira-kira 128 KB).

Selepas semua pengeditan ini, saya melihat pakej pertama antara Linux dan Embox, dan saya mendengar bunyinya! Tetapi bunyi itu mengerikan, sama sekali tidak sama seperti di QEMU, adalah mustahil untuk melihat apa-apa. Kemudian kami berfikir tentang apa yang boleh berlaku. Penyahpepijatan menunjukkan bahawa Embox tidak mempunyai masa untuk mengisi / memunggah penimbal audio. Semasa pjsip memproses satu bingkai, 2 gangguan sempat berlaku mengenai penyiapan pemprosesan penimbal, yang terlalu banyak. Pemikiran pertama untuk kelajuan ialah pengoptimuman pengkompil, tetapi ia telah dimasukkan ke dalam PJSIP. Yang kedua ialah titik terapung perkakasan, kami membincangkannya artikel. Tetapi seperti yang ditunjukkan oleh amalan, FPU tidak memberikan peningkatan yang ketara dalam kelajuan. Langkah seterusnya ialah mengutamakan benang. Embox mempunyai strategi penjadualan yang berbeza, dan saya telah menyertakan strategi yang menyokong keutamaan dan menetapkan strim audio kepada keutamaan tertinggi. Ini juga tidak membantu.

Idea seterusnya ialah kami sedang bekerja dengan memori luaran dan adalah bagus untuk memindahkan struktur ke sana yang boleh diakses dengan kerap. Saya melakukan analisis awal tentang bila dan di bawah apa simple_pjsua memperuntukkan ingatan. Ternyata daripada 190 Kb, 90 Kb pertama diperuntukkan untuk keperluan dalaman PJSIP dan ia tidak begitu kerap diakses. Selanjutnya, semasa panggilan masuk, fungsi pjsua_call_answer dipanggil, di mana penimbal kemudiannya diperuntukkan untuk bekerja dengan bingkai masuk dan keluar. Ia masih kira-kira 100 Kb. Dan kemudian kami melakukan perkara berikut. Sehingga saat panggilan, kami meletakkan data dalam memori luaran. Sebaik sahaja panggilan, kami segera menggantikan timbunan dengan satu lagi - dalam RAM. Oleh itu, semua data "panas" telah dipindahkan ke memori yang lebih pantas dan lebih boleh diramal.

Akibatnya, semua ini bersama-sama memungkinkan untuk dilancarkan simple_pjsua dan hubungi melalui pelayan anda. Dan kemudian melalui pelayan lain seperti sip.linphone.org.

Penemuan

Akibatnya, adalah mungkin untuk dilancarkan simple_pjsua dengan penghantaran suara dalam kedua-dua arah melalui pelayan. Masalah dengan tambahan menghabiskan 128 KB SDRAM boleh diselesaikan dengan menggunakan Cortex-M7 yang lebih berkuasa sedikit (contohnya, STM32F769NI dengan 512 KB RAM), tetapi pada masa yang sama, kami masih tidak berputus asa untuk masuk ke 256 KB πŸ™‚ Kami akan gembira jika seseorang berminat, Atau lebih baik lagi, cuba. Semua sumber, seperti biasa, ada dalam kami repositori.

Sumber: www.habr.com

Tambah komen