STM32F7-Discovery-da SIP telefon

Hammaga salom.

Biroz oldin biz yozgan 32 MB ROM va 4 KB RAMga ega STM1F192-Discovery-da SIP telefonini qanday ishga tushirganimiz haqida) Embox. Bu erda shuni aytish kerakki, bu versiya minimal edi va ikkita telefonni to'g'ridan-to'g'ri serversiz va faqat bitta yo'nalishda ovoz uzatish bilan bog'ladi. Shuning uchun biz server orqali qo'ng'iroq qilish, har ikki yo'nalishda ovoz uzatish, lekin ayni paytda mumkin bo'lgan eng kichik xotira hajmiga mos keladigan yanada to'liq telefonni ishga tushirishga qaror qildik.


Telefon uchun dastur tanlashga qaror qilindi simple_pjsua PJSIP kutubxonasining bir qismi sifatida. Bu serverda ro'yxatdan o'tish, qo'ng'iroqlarni qabul qilish va javob berish mumkin bo'lgan minimal dastur. Quyida men buni STM32F7-Discovery-da qanday ishga tushirishni darhol tasvirlab beraman.

Qanday ishga tushirish kerak

  1. Embox sozlanmoqda
    make confload-platform/pjsip/stm32f7cube
  2. Conf/mods.config faylida biz kerakli SIP hisobini o'rnatamiz.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    qayerda server SIP-server (masalan, sip.linphone.org), username ΠΈ parol β€” hisob uchun foydalanuvchi nomi va parol.

  3. Biz Embox-ni jamoa bilan yig'amiz qilmoq. Bizda plata proshivkasi haqida ma'lumot bor wiki va maqola.
  4. Embox konsolida "simple_pjsua_imported" buyrug'ini ishga tushiring
    
    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. Nihoyat, faqat audio chiqishiga dinamiklar yoki minigarnituralarni kiritish va displey yonidagi ikkita kichik MEMS mikrofoniga gapirish qoladi. Biz Linuxdan simple_pjsua, pjsua ilovasidan foydalanib qo'ng'iroq qilamiz. Xo'sh, yoki siz boshqa har qanday turdagi telefondan foydalanishingiz mumkin.

Bularning barchasi bizning maqolamizda tasvirlangan wiki.

Biz bu erga qanday keldik

Shunday qilib, dastlab apparat platformasini tanlash haqida savol tug'ildi. STM32F4-Discovery xotira uchun mos kelmasligi aniq bo'lgani uchun STM32F7-Discovery tanlandi. U 1 MB flesh-disk va 256 KB RAMga ega (+ 64 maxsus tezkor xotira, biz ham foydalanamiz). Server orqali qo'ng'iroqlar uchun ham unchalik ko'p emas, lekin biz kirishga harakat qilishga qaror qildik.

An'anaviy ravishda vazifa bir necha bosqichlarga bo'lingan:

  • QEMU da PJSIP ishga tushirilmoqda. Bu disk raskadrovka uchun qulay edi, bundan tashqari, bizda allaqachon AC97 kodekni qo'llab-quvvatlagan edik.
  • QEMU va STM32 da ovoz yozish va tinglash.
  • Ilovani ko'chirish simple_pjsua PJSIPdan. Bu sizga SIP-serverda ro'yxatdan o'tish va qo'ng'iroq qilish imkonini beradi.
  • Asterisk asosida o'z serveringizni joylashtiring va uni sinab ko'ring, so'ngra sip.linphone.org kabi tashqi serverlarni sinab ko'ring.

Embox-dagi tovush Portaudio orqali ishlaydi, u PISIP-da ham qo'llaniladi. QEMU-da birinchi muammolar paydo bo'ldi - WAVlar 44100 Gts da yaxshi o'ynaldi, lekin 8000 da nimadir noto'g'ri ketayotgani aniq. Muammo chastotani o'rnatishda ekanligi ma'lum bo'ldi - uskunada sukut bo'yicha u 44100 edi va biz buni dasturiy ta'minotda o'zgartirmadik.

Bu erda, ehtimol, umuman olganda, ovoz qanday ijro etilishi haqida bir oz tushuntirishga arziydi. Ovoz kartasi oldindan belgilangan chastotada ijro etilishi yoki yozib olinishi kerak bo'lgan xotira qismiga ba'zi ko'rsatkichni o'rnatishi mumkin. Bufer tugagach, uzilish hosil bo'ladi va keyingi buferdan bajarish davom etadi. Gap shundaki, bu buferlar avvalgisi o'ynalayotganda oldindan to'ldirilishi kerak. Biz STM32F7 da bu muammoga duch kelamiz.

Keyinchalik, biz serverni ijaraga oldik va unga Asteriskni joylashtirdik. Nosozliklarni tuzatish juda ko'p bo'lgani uchun va men mikrofonga ko'p gapirishni istamaganim uchun, avtomatik ijro etish va yozib olish kerak edi. Buni amalga oshirish uchun audio qurilmalar o'rniga fayllarni kiritishimiz uchun simple_pjsua-ni yamaladik. PJSIP-da bu juda sodda tarzda amalga oshiriladi, chunki ular qurilma yoki fayl bo'lishi mumkin bo'lgan port tushunchasiga ega. Va bu portlar boshqa portlarga moslashuvchan tarzda ulanishi mumkin. Kodni bizning pjsip-da ko'rishingiz mumkin omborlar. Natijada, sxema quyidagicha edi. Men Asterisk serverida ikkita hisob yaratdim - Linux va Embox uchun. Keyinchalik, buyruq Embox-da bajariladi simple_pjsua_imported, Embox serverda registrlar, shundan so'ng biz Linux-dan Embox-ni chaqiramiz. Ulanish vaqtida biz Asterisk serverida butun ulanish o'rnatilganligini tekshiramiz va bir muncha vaqt o'tgach, biz Embox-da Linux-dan ovoz eshitamiz va Linux-da biz Embox-dan o'ynaladigan faylni saqlaymiz.

Bu QEMU-da ishlagandan so'ng, biz uni STM32F7-Discovery-ga ko'chirishga o'tdik. Birinchi muammo shundaki, biz β€œ-Os” kompilyatori tasvir hajmi uchun optimallashtirish yoqilmagan holda 1 MB ROMga sigβ€˜a olmadik. Shuning uchun biz "-O" ni qo'shdik. Keyinchalik, yamoq C++ uchun qo'llab-quvvatlashni o'chirib qo'ydi, shuning uchun u faqat pjsua uchun kerak bo'ladi va biz simple_pjsua dan foydalanamiz.

Joylashgandan keyin simple_pjsua, endi uni ishga tushirish imkoniyati bor deb qaror qildi. Lekin birinchi navbatda biz ovozlarni qanday yozib olish va ijro etishni aniqlashimiz kerak edi. Savol - qaerga yozish kerak? Biz tashqi xotirani tanladik - SDRAM (128 MB). Buni o'zingiz sinab ko'rishingiz mumkin:

16000 Gts chastotali va 10 soniya davom etadigan stereo WAV yaratadi:


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

Biz yo'qotamiz:


play -m C0000000

Bu erda ikkita muammo bor edi. Birinchisi kodek bilan - WM8994 ishlatiladi va u uyasi kabi narsaga ega va bu uyalar 4 tasi bor. Shunday qilib, sukut bo'yicha, agar bu sozlanmagan bo'lsa, u holda ovozni o'ynatishda hamma narsada tinglash sodir bo'ladi. to'rt uyasi. Shuning uchun, 16000 Gts chastotada biz 8000 Gts ni oldik, lekin 8000 Gts uchun ijro etish oddiygina ishlamadi. Biz faqat 0 va 2-uyalarni tanlaganimizda, u kutilganidek ishladi. Yana bir muammo STM32Cube-dagi audio interfeys edi, unda audio chiqishi SAI (Serial Audio Interface) orqali audio kirish bilan sinxron ishlaydi (tafsilotlarni tushunmadim, lekin ular umumiy soatga ega ekanligi ma'lum bo'ldi va ishga tushirilganda. audio chiqishi, audio qandaydir tarzda uning kirishiga bog'langan). Ya'ni, ularni alohida ishga tushirishning iloji yo'q, shuning uchun biz quyidagilarni qildik - audio kirish va audio chiqishi har doim ishlaydi (shu jumladan uzilishlar hosil bo'ladi). Ammo tizimda hech narsa o'ynamasa, biz shunchaki bo'sh buferni audio chiqishiga joylashtiramiz va ijro boshlanganda, biz uni to'ldirishni halollik bilan boshlaymiz.

Keyin biz ovozni yozishda ovoz juda jim bo'lganiga duch keldik. Buning sababi, STM32F7-Discovery-dagi MEMS mikrofonlari qandaydir tarzda 16000 Gts dan past chastotalarda yaxshi ishlamaydi. Shuning uchun, biz uni 16000 Gts ga o'rnatdik, hatto 8000 Gts kelgan bo'lsa ham. Buning uchun, biroq, bir chastotani boshqasiga o'zgartirishni dasturiy ta'minotni qo'shish kerak edi.

Keyinchalik, biz RAMda joylashgan uyum hajmini oshirishimiz kerak edi. Bizning hisob-kitoblarga ko'ra, pjsip uchun taxminan 190 KB kerak edi va bizda atigi 100 KB qoldi. Bu erda biz ozgina tashqi xotiradan foydalanishimiz kerak edi - SDRAM (taxminan 128 KB).

Ushbu tahrirlarning barchasidan so'ng men Linux va Embox o'rtasidagi birinchi paketlarni ko'rdim va ovozni eshitdim! Ammo ovoz dahshatli edi, QEMUdagi kabi emas, hech narsa eshitilmadi. Keyin nima bo'lishi mumkinligini o'ylab qoldik. Nosozliklarni tuzatish shuni ko'rsatdiki, Embox audio buferlarni to'ldirish/tushirish uchun vaqt topa olmaydi. Pjsip bitta kadrni qayta ishlayotganda, buferni qayta ishlash tugallanishi haqida 2 ta uzilish sodir bo'ldi, bu juda ko'p. Tezlashtirish haqidagi birinchi fikrim kompilyatorni optimallashtirish edi, lekin u allaqachon PJSIPga kiritilgan. Ikkinchisi - apparat suzuvchi nuqta, biz bu haqda gaplashdik maqola. Ammo amaliyot shuni ko'rsatadiki, FPU tezlikni sezilarli darajada oshirishni ta'minlamadi. Keyingi qadam mavzu ustuvorliklarini belgilash edi. Embox turli rejalashtirish strategiyalariga ega va men ustuvorliklarni qo'llab-quvvatlaydiganni yoqdim va audio oqimlarga eng yuqori ustuvorlikni berdim. Bu ham yordam bermadi.

Keyingi g'oya shundan iborat ediki, biz tashqi xotira bilan ishlayapmiz va u erga tez-tez kirish mumkin bo'lgan tuzilmalarni ko'chirish yaxshi bo'lar edi. Men qachon va nima ostida dastlabki tahlil o'tkazdim simple_pjsua xotirani ajratadi. Ma'lum bo'lishicha, 190 KBdan birinchi 90 KB PJSIP ichki ehtiyojlari uchun ajratilgan va ular tez-tez ishlatilmaydi. Keyinchalik, kiruvchi qo'ng'iroq paytida pjsua_call_answer funksiyasi chaqiriladi, unda buferlar kiruvchi va chiquvchi kadrlar bilan ishlash uchun ajratiladi. Hali ham taxminan 100 KB edi. Va keyin biz quyidagilarni qildik. Qo'ng'iroq amalga oshirilgunga qadar ma'lumotlar tashqi xotirada saqlanadi. Qo'ng'iroq jiringlashi bilan biz darhol RAMdagi to'plamni boshqasiga almashtiramiz. Shunday qilib, barcha "issiq" ma'lumotlar tezroq va oldindan taxmin qilinadigan xotiraga o'tkazildi.

Natijada, bularning barchasi birgalikda ishga tushirishga imkon berdi simple_pjsua va serveringiz orqali qo'ng'iroq qiling. Va keyin sip.linphone.org kabi boshqa serverlar orqali.

topilmalar

Oxir-oqibat uni ishga tushirish mumkin edi simple_pjsua server orqali har ikki yo'nalishda ovozli uzatish bilan. Qo'shimcha 128 KB SDRAM bilan bog'liq muammoni biroz kuchliroq Cortex-M7 (masalan, 32 KB operativ xotiraga ega STM769F512NI) yordamida hal qilish mumkin, ammo biz hali ham 256 KB ni sig'dirishdan umidimizni uzganimiz yo'q :) Agar kimdir qiziqsa xursand bo'ling yoki undan ham yaxshisi, sinab ko'ring. Barcha manbalar, odatdagidek, bizda omborlar.

Manba: www.habr.com

a Izoh qo'shish