STM32F7-Discovery-də SIP telefonu

Salam.

Bir müddət əvvəl biz писали 32 MB ROM və 4 KB RAM ilə STM1F192-Discovery-də SIP telefonunu necə işə salmağı bacardığımız haqqında) Emboks. Burada demək lazımdır ki, o versiya minimal idi və iki telefonu birbaşa serversiz və yalnız bir istiqamətdə səs ötürməsi ilə birləşdirdi. Buna görə də, biz server vasitəsilə zəng, hər iki istiqamətdə səs ötürülməsi ilə daha dolğun bir telefonu işə salmaq qərarına gəldik, lakin eyni zamanda mümkün olan ən kiçik yaddaş ölçüsündə saxladıq.


Telefon üçün bir proqram seçmək qərara alındı sadə_pjsua PJSIP kitabxanasının bir hissəsi kimi. Bu serverdə qeydiyyatdan keçə, zəngləri qəbul edə və cavablandıra bilən minimal proqramdır. Aşağıda onu STM32F7-Discovery-də necə işə salmağın təsvirini dərhal verəcəyəm.

Necə qaçmaq

  1. Embox konfiqurasiya edilir
    make confload-platform/pjsip/stm32f7cube
  2. Conf/mods.config faylında tələb olunan SIP hesabını təyin edin.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    hara server SIP serverdir (məsələn, sip.linphone.org), istifadəçi adı и parol - hesabın istifadəçi adı və şifrəsi.

  3. Embox-un komanda şəklində yığılması etmək. Bizdə olan lövhənin proqram təminatı haqqında wikiməqalə.
  4. Embox konsolunda “simple_pjsua_imported” əmrini işə salın
    
    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. Nəhayət, səs çıxışına dinamikləri və ya qulaqlıqları daxil etmək və ekranın yanında iki kiçik MEMS mikrofonu ilə danışmaq qalır. Linux-dan simple_pjsua, pjsua proqramı vasitəsilə zəng edirik. Yaxşı, ya da hər hansı digər növ telefondan istifadə edə bilərsiniz.

Bütün bunlar bizim səhifəmizdə təsvir edilmişdir wiki.

Biz ora necə gəldik

Beləliklə, əvvəlcə bir hardware platformasının seçilməsi ilə bağlı sual yarandı. STM32F4-Discovery-nin yaddaşa sığmayacağı aydın olduğu üçün STM32F7-Discovery seçildi. Onun 1 MB flash sürücüsü və 256 KB RAM (+ 64 xüsusi sürətli yaddaş, biz də istifadə edəcəyik) var. Həm də server vasitəsilə zənglər üçün çox deyil, amma uyğunlaşmağa çalışmaq qərarına gəldik.

Şərti olaraq özləri üçün tapşırıq bir neçə mərhələyə bölündü:

  • QEMU-da PJSIP işləyir. Sazlama üçün rahat idi, üstəlik, orada AC97 kodek üçün artıq dəstəyimiz var idi.
  • QEMU və STM32-də səs yazma və oxutma.
  • Tətbiqin daşınması sadə_pjsua PJSIP-dən. Bu, SIP serverində qeydiyyatdan keçməyə və zənglər etməyə imkan verir.
  • Öz Asterisk əsaslı serverinizi yerləşdirin və onu sınaqdan keçirin, sonra sip.linphone.org kimi xarici serverləri sınayın.

Embox-dakı səs PISIP-də də istifadə olunan Portaudio vasitəsilə işləyir. İlk problemlər QEMU-da ortaya çıxdı - WAV 44100 Hz-də yaxşı oynadı, lakin 8000-də bir şey səhv getdi. Məlum oldu ki, söhbət tezliyi təyin etməkdən gedir - standart olaraq avadanlıqda 44100 idi və bu, proqram baxımından dəyişmədi.

Burada, bəlkə də, ümumiyyətlə səsin necə çalındığını bir az izah etməyə dəyər. Səs kartı əvvəlcədən müəyyən edilmiş tezlikdə oynamaq və ya yazmaq istədiyiniz yaddaş parçasına müəyyən göstəriciyə təyin oluna bilər. Bufer bitdikdən sonra fasilə yaradılır və icra növbəti buferlə davam edir. Fakt budur ki, bu buferlər əvvəlkisi oynanarkən əvvəlcədən doldurulmalıdır. STM32F7-də bu problemlə daha da qarşılaşacağıq.

Sonra bir server icarəyə götürdük və ona Asterisk yerləşdirdik. Çox debug etmək lazım olduğundan, amma mikrofona çox danışmaq istəmədiyim üçün avtomatik oxutma və qeyd etmək lazım idi. Bunu etmək üçün biz simple_pjsua-nı yamaqladıq ki, audio cihazları yerinə faylları sürüşdürə biləsiniz. PJSIP-də bu, olduqca sadə şəkildə edilir, çünki onlar ya cihaz, ya da fayl ola biləcək port anlayışına malikdirlər. Və bu portlar digər portlara çevik şəkildə qoşula bilər. Kodu pjsipimizdə görə bilərsiniz depolar. Nəticədə sxem aşağıdakı kimi oldu. Asterisk serverində iki hesaba başladım - Linux və Embox üçün. Sonra, əmr Embox-da yerinə yetirilir simple_pjsua_imported, Embox serverdə qeydiyyatdan keçib, bundan sonra Linux-dan Embox-a zəng edirik. Qoşulma anında biz Asterisk serverində əlaqənin qurulduğunu yoxlayırıq və bir müddət sonra Embox-da Linux-dan səs eşitməliyik, Linux-da isə Embox-dan səsləndirilən faylı saxlayırıq.

QEMU üzərində işlədikdən sonra biz STM32F7-Discovery-ə keçidə keçdik. Birinci problem odur ki, onlar təsvirin ölçüsü üçün “-Os” kompilyator optimallaşdırması olmadan 1 MB ROM-a sığmadı. Buna görə də biz "-O"ları daxil etdik. Bundan əlavə, yamaq C ++ dəstəyini dayandırdı, buna görə də yalnız pjsua üçün lazımdır və biz simple_pjsua istifadə edirik.

Yerləşdirildikdən sonra sadə_pjsua, qərara gəldi ki, indi onu işə salmaq şansı var. Ancaq əvvəlcə səsin yazılması və səsləndirilməsi ilə məşğul olmaq lazım idi. Sual odur ki, hara yazmaq olar? Xarici yaddaşı seçdik - SDRAM (128 MB). Bunu özünüz sınaya bilərsiniz:

16000 Hz tezliyi və 10 saniyə davam edən stereo WAV yaradır:


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

Biz itiririk:


play -m C0000000

Burada iki problem var. Kodek ilə birincisi - WM8994 istifadə olunur və onun slot kimi bir xüsusiyyəti var və bu yuvalardan 4-ü var.Beləliklə, standart olaraq, bu konfiqurasiya edilməyibsə, səs oxuduqda, bütün dörd yuvada oxutma baş verir. . Buna görə də, 16000 Hz tezliyində 8000 Hz aldıq, lakin 8000 Hz üçün oxutma sadəcə işləmədi. Yalnız slot 0 və 2 seçildikdə o, lazım olduğu kimi işləyirdi. Başqa bir problem STM32Cube-da audio interfeys idi, burada audio çıxışı audio girişi ilə sinxron şəkildə SAI (Serial Audio Interface) vasitəsilə işləyir (mən təfərrüatları başa düşmədim, lakin məlum oldu ki, onlar ümumi saatı paylaşırlar və audio çıxışı işə salınır, audio bir şəkildə onun girişinə əlavə olunur). Yəni, siz onları ayrı-ayrılıqda işlədə bilməzsiniz, ona görə də biz aşağıdakıları etdik - audio girişi və audio çıxışı həmişə işləyir (kesintilər də daxil olmaqla). Ancaq sistemdə heç bir şey səsləndirilmədikdə, biz sadəcə olaraq səs çıxışına boş bir bufer qoyuruq və oxutma başlayanda onu vicdanla doldurmağa başlayırıq.

Bundan əlavə, səs yazısı zamanı səsin çox sakit olması faktı ilə qarşılaşdıq. Bu, STM32F7-Discovery-dəki MEMS mikrofonlarının 16000 Hz-dən aşağı tezliklərdə yaxşı işləməməsi ilə əlaqədardır. Buna görə də 16000 Hz gəlsə belə, 8000 Hz təyin etdik. Bunu etmək üçün bir tezlikin digərinə proqram konvertasiyasını əlavə etmək lazım idi.

Sonra RAM-da olan yığının ölçüsünü artırmalı oldum. Hesablamalarımıza görə, pjsip üçün təxminən 190 KB tələb olunur və bizdə cəmi 100 KB qalıb. Burada bəzi xarici yaddaşdan - SDRAM-dan (təxminən 128 KB) istifadə etməli oldum.

Bütün bu redaktələrdən sonra Linux və Embox arasında ilk paketləri gördüm və səsi eşitdim! Ancaq səs dəhşətli idi, QEMU-dakı kimi deyil, heç nə ayırd etmək mümkün deyildi. Sonra nəyin ola biləcəyini düşündük. Sazlama göstərdi ki, Embox-un sadəcə audio buferləri doldurmağa / boşaltmağa vaxtı yoxdur. Pjsip bir kadrı emal edərkən, buferin işlənməsinin başa çatması ilə bağlı 2 kəsilmənin baş verməsi üçün vaxt var idi ki, bu da həddən artıq çoxdur. Sürət üçün ilk fikir kompilyatorun optimallaşdırılması idi, lakin o, artıq PJSIP-ə daxil edilmişdir. İkincisi, hardware üzən nöqtəsidir, biz bu barədə danışdıq məqalə. Ancaq təcrübə göstərdiyi kimi, FPU sürətdə əhəmiyyətli bir artım vermədi. Növbəti addım mövzulara üstünlük vermək idi. Embox-un müxtəlif planlaşdırma strategiyaları var və mən prioritetləri dəstəkləyən və audio axınları ən yüksək prioritetə ​​təyin edən birini daxil etmişəm. Bu da kömək etmədi.

Növbəti ideya ondan ibarət idi ki, biz xarici yaddaşla işləyirik və çox tez-tez daxil olan strukturları ora köçürsək yaxşı olardı. Nə vaxt və nə ilə bağlı ilkin təhlil apardım sadə_pjsua yaddaş ayırır. Məlum oldu ki, 190 Kb-dan ilk 90 Kb PJSIP-in daxili ehtiyacları üçün ayrılır və onlara çox da daxil olmur. Bundan əlavə, daxil olan zəng zamanı pjsua_call_answer funksiyası çağırılır, bu funksiyada gələn və gedən çərçivələrlə işləmək üçün buferlər ayrılır. Hələ təxminən 100 Kb idi. Və sonra aşağıdakıları etdik. Zəng anına qədər məlumatları xarici yaddaşa yerləşdiririk. Zəng edən kimi dərhal yığını başqası ilə əvəz edirik - RAM-də. Beləliklə, bütün "qaynar" məlumatlar daha sürətli və daha proqnozlaşdırıla bilən yaddaşa köçürüldü.

Nəticədə bütün bunlar birlikdə işə salınmağa imkan verdi sadə_pjsua və serveriniz vasitəsilə zəng edin. Və sonra sip.linphone.org kimi digər serverlər vasitəsilə.

Tapıntılar

Nəticədə işə salmaq mümkün oldu sadə_pjsua server vasitəsilə hər iki istiqamətdə səs ötürülməsi ilə. Əlavə xərclənmiş 128 KB SDRAM ilə bağlı problem bir az daha güclü Cortex-M7 (məsələn, 32 KB RAM ilə STM769F512NI) istifadə etməklə həll edilə bilər, lakin eyni zamanda, biz hələ də 256-ya daxil olmaq ümidini itirməmişik. KB 🙂 Kimsə maraqlandırsa, şad olarıq və ya daha yaxşısı, cəhd edin. Bütün mənbələr, həmişə olduğu kimi, bizimdir depolar.

Mənbə: www.habr.com

Добавить комментарий