SIP telefons uz STM32F7-Discovery

Visiem sveiciens.

Pirms kāda laika mēs rakstÄ«ja par to, kā mums izdevās palaist SIP tālruni uz STM32F4-Discovery ar 1 MB ROM un 192 KB RAM, balstÄ«tu uz Embox. Å eit jāsaka, ka tā versija bija minimāla un savienoja divus telefons tieÅ”i bez servera un ar balss pārsÅ«tīŔanu tikai vienā virzienā. Tāpēc mēs nolēmām palaist pilnvērtÄ«gāku tālruni ar zvanu caur serveri, balss pārsÅ«tīŔanu abos virzienos, bet tajā paŔā laikā centāmies iekļauties pēc iespējas mazākā atmiņas apjomā.

Atskaņot video

Tālrunim tika nolemts izvēlēties lietotnes simple_pjsua , kas ir PJSIP bibliotēkas sastāvdaļa. Tā ir minimāla lietotne, kas spēj reÄ£istrēties serverÄ«, pieņemt un atbildēt uz zvaniem. Zemāk es nekavējoties sniegÅ”u aprakstu, kā to palaist uz STM32F7-Discovery.

Kā palaist

  1. Konfigurējam Embox
    make confload-platform/pjsip/stm32f7cube
  2. Failā conf/mods.config iestatām nepiecieŔamo SIP kontu.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    kur serveris — tas ir SIP serveris (piemēram, sip.linphone.org), username un password — lietotājvārds un parole no konta.

  3. Sasmalcinām Embox ar komandu make. Par programmaparatūras palaiŔanu mums ir informācija uz viki un rakstā.
  4. Palaidiet konsolē Embox komandu ā€œsimple_pjsua_importedā€
    
    00:00:12.870    pjsua_acc.c  ....SIP ārējā statuss acc 0 nav aktīvs
    00:00:12.884    pjsua_acc.c  ....sip:alexk2222@sip.linphone.org: reģistrācija veiksmīga, statuss=200 (Reģistrācija veiksmīga
    00:00:12.911    pjsua_acc.c  ....SaglabāŔanas taimeris uzsākts akountam 0, galamērÄ·is:91.121.209.194:5060, intervāls:15s
    

  5. Beidzot, atliek ievietot skaļruņus vai austiņas audio izejā un runāt diviem maziem MEMS mikrofoniem blakus ekrānam. Zvani no Linux caur lietotni simple_pjsua, pjsua. Nu, arī var izmantot jebkuru citu, piemēram, linphone.

Par to viss ir aprakstīts mūsu viki.

Kā mēs nonācām līdz tam

Tātad, sākotnēji tika uzdots jautājums par aparatūras platformas izvēli. Tā kā bija skaidrs, ka STM32F4-Discovery nebūs pietiekami atmiņas, tika izvēlēta STM32F7-Discovery. Tam ir 1 MB zibatmiņa un 256 KB RAM (+ 64 speciālās ātrās atmiņas, ko arī izmantosim). Arī tas nav daudz zvaniem caur serveri, bet nolēmām pamēģināt piestāt.

Nosacīti uzdevumu sadalījām vairākos posmos:

  • PJSIP palaiÅ”ana QEMU. Tas bija ērti atkļūdot, plus mums jau bija atbalsts AC97 kodekam.
  • Balss ierakstīŔana un atskaņoÅ”ana QEMU un uz STM32.
  • Lietotnes portēŔana simple_pjsua no PJSIP sastāva. Tā ļauj reÄ£istrēties SIP serverÄ« un zvanÄ«t.
  • Izveidot savu serveri uz Asterisk bāzes un testēt uz tā, pēc tam izmēģināt ārējos, piemēram, sip.linphone.org

Embox skaņa darbojas caur Portaudio, kas tiek izmantots arÄ« PISIP. QEMU parādÄ«jās pirmās problēmas — WAV faili uz 44100 Hz atskaņojās labi, bet uz 8000 Hz kaut kas acÄ«mredzami nebija kārtÄ«bā. IzrādÄ«jās, ka problēma bija frekvences iestatÄ«jumā — pēc noklusējuma aparatÅ«rā bija 44100, un mēs to programmatiskā veidā nemainÄ«jām.

Å eit, iespējams, ir vērts nedaudz paskaidrot, kā vispār notiek skaņas atskaņoÅ”ana. Skaņas kartei var iestatÄ«t kādu rādÄ«tāju uz atmiņas gabalu, no kura jāatskaņo vai jāraksta iepriekÅ” noteiktā frekvencē. Pēc tam, kad buferis beidzas, tiek izsists pārtraukums, un izpilde turpinās ar nākamo buferi. Problēma ir tāda, ka Å”os buferus ir jāspēj iepriekÅ” aizpildÄ«t, kamēr tiek atskaņots iepriekŔējais. Ar Å”o problēmu mēs vēl sastapsimies turpmāk STM32F7.

Pēc tam mēs nomājām serveri un uz tā uzstādÄ«jām Asterisk. Tā kā bija nepiecieÅ”ams daudz atkļūdot, un runāt mikrofonā nevēlējās, bija jāveido automātiska atskaņoÅ”ana un ieraksts. Tāpēc mēs labojām simple_pjsua, lai varētu pievienot failus vietā, kur parasti ir audio ierÄ«ces. PJSIP to izdara diezgan vienkārÅ”i, jo viņiem ir jēdziens ports, kas var bÅ«t gan ierÄ«ce, gan fails. Un Å”os portus var elastÄ«gi pieslēgt citiem portiem. Kodu var skatÄ«t mÅ«su pjsip. repozitorijā. Rezultātā shēma bija Ŕāda. Asterisk serverÄ« es izveidoju divus kontus — vienu Linux un vienu Embox. Tālāk, uz Embox tiek izpildÄ«ta komanda simple_pjsua_imported, Embox reÄ£istrējas serverÄ«, pēc tam no Linux zvana uz Embox. Savienojuma brÄ«dÄ« pārbaudām Asterisk serverÄ«, vai viss savienojums ir izveidots, un pēc kāda laika mums jādzird skaņa no Linux uz Embox, kamēr Linux saglabā to failu, kas tiek atskaņots no Embox.

Pēc tam, kad tas darbojas uz QEMU, mēs pārgājām uz portēŔanu uz STM32F7-Discovery. Pirmā problēma — mēs nepatilpām 1 MB ROM bez kompilatora optimizācijas ā€˜-Os’ attēla izmēra dēļ. Tāpēc ieslēdzām ā€˜-Os’. Pēc tam ar patch mēs atslēdzām C++ atbalstu, jo tas nepiecieÅ”ams tikai pjsua, bet mēs izmantojam simple_pjsua.

Pēc tam, kad mēs iekļāvāmies simple_pjsua, mēs nolēmām, ka Å”obrÄ«d ir iespēja to palaist. Bet vispirms bija jānoskaidro ar ierakstīŔanu un skaņas reprodukciju. Jautājums — kur ierakstÄ«t? Mēs izvēlējāmies ārējo atmiņu — SDRAM (128 MB). JÅ«s varat to izmēģināt paÅ”i:

Izveidos stereo WAV ar frekvenci 16000 Hz un ilgumu 10 sekundes:


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

Atskaņojam:


play -m C0000000

Å eit radās divas problēmas. Pirmais ir ar kodeku — tiek izmantots WM8994, un tajā ir tāds jēdziens kā slots, un Å”o slotu ir 4. Tātad, pēc noklusējuma, ja to nenosaka, tad, atskaņojot audio, atskaņoÅ”ana notiek visos četros slotos. Tāpēc pie 16000 Hz mēs saņēmām 8000 Hz, bet 8000 Hz atskaņoÅ”ana vienkārÅ”i nedarbojās. Kad izvēlējāmies tikai slotus 0 un 2, tad darbojās kā vajag. Vēl viena problēma bija audio interfeiss STM32Cube, kurā audio izeja darbojas caur SAI (Serial Audio Interface) sinhroni ar audio ieeju (nedziļinājos detaļās, bet iznāk, ka viņi dalās ar kopēju pulksteni, un, inicializējot audio izeju, tā kaut kā piesaistās audio ieejai). Tas nozÄ«mē, ka palaist tos atseviŔķi nevar, tāpēc izdarÄ«jām Ŕādi — vienmēr darbojas (tostarp tiek Ä£enerētas pārtraukumi) audio ieeja un audio izeja. Bet, kad sistēmā nekas netiek atskaņots, mēs vienkārÅ”i ievietojam audio izejai tukÅ”u buferi, bet kad sākas atskaņoÅ”ana, tad godÄ«gi sākam to piepildÄ«t.

Tālāk saskārāmies ar to, ka skaņa ierakstot balsi bija ļoti klusa. Tas notiek tāpēc, ka MEMS mikrofonu uz STM32F7-Discovery kaut kā slikti strādā pie frekvencēm zem 16000 Hz. Tāpēc iestata 16000 Hz, ja arÄ« nāk 8000 Hz. Tam patiesÄ«bā bija jāpapildina programmatÅ«ras pārvērÅ”ana no vienas frekvences uz citu.

Tālāk nācās palielināt kaudzes izmēru, kas atrodas RAM. Pēc mÅ«su aprēķiniem, pjsip prasÄ«ja apmēram 190 kB, bet mums palika tikai apmēram 100 kB. Te nācās iesaistÄ«t nedaudz ārējās atmiņas — SDRAM (apmēram 128 kB).

Pēc visām Ŕīm izmaiņām es redzēju pirmos paketus starp Linux un Embox un dzirdēju skaņu! Bet skaņa bija briesmÄ«ga, gluži tāda kā QEMU, neko nevarēja saprast. Tādējādi mēs aizdomājāmies, kāda varētu bÅ«t problēma. Debatējot, parādÄ«jās, ka Embox vienkārÅ”i neveic laiku, lai piepildÄ«tu/izsÅ«tÄ«tu audio buferus. Kamēr pjsip apstrādā vienu kadru, notika 2 pārtraukumi par buferu apstrādes pabeigÅ”anu, kas ir pārāk daudz. Pirmā doma par paātrināŔanu bija kompaktā optimizācija, bet tā jau bija ieslēgta PJSIP. Otrā - aparatÅ«ras peldoŔā punkta, par to mēs stāstÄ«jām rakstā. Taču, kā parādÄ«jusi prakse, FPU nesniedza bÅ«tisku ātruma palielinājumu. Nākamais solis bija plÅ«smu prioritāŔu noteikÅ”ana. Embox ir dažādas plānoÅ”anas stratēģijas, un es iekļāvu to, kas atbalsta prioritātes, un noteicu visaugstāko prioritāti audio plÅ«smām. Tas arÄ« nepalÄ«dzēja.

Nākamā ideja bija, ka mēs strādājam ar ārējo atmiņu, un bÅ«tu labi tur pārvietot struktÅ«ras, kurām piekļuve notiek ļoti bieži. Es veicu pirmotnēju analÄ«zi par to, kad un kāpēc simple_pjsua notiek atmiņas pieŔķirÅ”ana. IzrādÄ«jās, ka no 190 Kb pirmie 90 Kb tiek izmantoti iekŔējām PJSIP vajadzÄ«bām, un piekļuve tiem notiek ne ļoti bieži. Turpinājumā, ienākoŔā zvana laikā tiek izsaukta funkcija pjsua_call_answer, kurā tad tiek pieŔķirti buferi darbam ar ienākoÅ”ajiem un izejoÅ”ajiem kadriem. Tas bija vēl apmēram 100 Kb. Un Å”eit mēs rÄ«kojāmies Ŕādi. LÄ«dz zvana brÄ«dim datus novietojam ārējā atmiņā. TiklÄ«dz zvans — uzreiz nomainām kaudzi uz citu — RAM. Tādējādi visi ā€œkarstieā€ dati tika pārvietoti ātrākā un paredzamākā atmiņā.

Tādējādi viss kopā ļāva palaist simple_pjsua un piezvanīt caur savu serveri. Un pēc tam jau arī caur citiem serveriem, piemēram, sip.linphone.org.

Secinājumi

Tādējādi izdevās palaist simple_pjsua ar balss pārsÅ«tīŔanu abos virzienos caur serveri. Problēmu ar papildu patērētajiem 128 Kb SDRAM var atrisināt, izmantojot nedaudz jaudÄ«gāku Cortex-M7 (piemēram, STM32F769NI ar 512 Kb RAM), taču tajā paŔā laikā mēs vēl arvien neesam zaudējuÅ”i cerÄ«bas iekļauties 256 Kb šŸ™‚ Mums bÅ«tu prieks, ja kāds interesētos, bet vēl labāk — izmēģinātu. Visi avoti, kā parasti, ir mÅ«su repozitorijā.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster