SIP tālrunis uz STM32F7-Discovery

Sveiki visiem

Pirms kāda laika mēs ŠæŠøсŠ°Š»Šø par to, kā mums izdevās palaist SIP tālruni STM32F4-Discovery ar 1 MB ROM un 192 KB RAM), pamatojoties uz Embox. Te gan jāsaka, ka tā versija bija minimāla un savienoja divus telefonus tieÅ”i bez servera un ar balss pārraidi tikai vienā virzienā. Tāpēc nolēmām laist klajā pilnÄ«gāku telefonu ar zvanu caur serveri, balss pārraidi abos virzienos, bet tajā paŔā laikā iekļaujoties pēc iespējas mazākā atmiņas apjomā.


Tika nolemts telefonam izvēlēties aplikāciju simple_pjsua kā daļa no PJSIP bibliotēkas. Å Ä« ir minimāla lietojumprogramma, kas var reÄ£istrēties serverÄ«, saņemt un atbildēt uz zvaniem. Zemāk es nekavējoties sniegÅ”u aprakstu par to, kā to palaist STM32F7-Discovery.

Kā palaist

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

    kur serveris ir SIP serveris (piemēram, sip.linphone.org), lietotājvārds Šø parole ā€” konta lietotājvārds un parole.

  3. Mēs komplektējam Embox ar komandu padarīt. Mums ir informācija par plates programmaparatūru vietnē wiki un raksts.
  4. Palaidiet komandu ā€œsimple_pjsua_importedā€ Embox konsolē
    
    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. Visbeidzot, atliek tikai ievietot skaļruņus vai austiņas audio izvadē un runāt divos mazos MEMS mikrofonos, kas atrodas blakus displejam. Mēs zvanām no Linux, izmantojot lietojumprogrammu simple_pjsua, pjsua. Nu, vai arī varat izmantot jebkura cita veida linphone.

Tas viss ir aprakstīts mūsu wiki.

Kā mēs te nokļuvām

Tātad, sākotnēji radās jautājums par aparatūras platformas izvēli. Tā kā bija skaidrs, ka STM32F4-Discovery nederēs atmiņai, tika izvēlēts STM32F7-Discovery. Viņai ir 1 MB zibatmiņa un 256 KB RAM (+ 64 speciālā ātrā atmiņa, ko arī izmantosim). Tas arī nav daudz zvaniem caur serveri, taču mēs nolēmām mēģināt iekļūt.

Parasti uzdevums tika sadalīts vairākos posmos:

  • Palaiž PJSIP uz QEMU. Tas bija ērti atkļūdoÅ”anai, turklāt mums jau bija atbalsts AC97 kodekam.
  • Balss ierakstÄ«Å”ana un atskaņoÅ”ana QEMU un STM32.
  • Lietojumprogrammas pārneÅ”ana simple_pjsua no PJSIP. Tas ļauj reÄ£istrēties SIP serverÄ« un veikt zvanus.
  • Izvietojiet savu serveri, pamatojoties uz Asterisk, un pārbaudiet to, un pēc tam izmēģiniet ārējos, piemēram, sip.linphone.org

Skaņa pakalpojumā Embox darbojas, izmantojot Portaudio, kas tiek izmantota arÄ« PISIP. Pirmās problēmas parādÄ«jās QEMU - WAV tika atskaņoti labi ar 44100 Hz, bet pie 8000 kaut kas acÄ«mredzami nogāja greizi. IzrādÄ«jās, ka problēma bija frekvences iestatÄ«Å”anā - pēc noklusējuma aprÄ«kojumā tā bija 44100, un mēs to nemainÄ«jām programmatÅ«rā.

Å eit, iespējams, ir vērts nedaudz paskaidrot, kā skaņa tiek atskaņota kopumā. Skaņas karte var iestatÄ«t kādu rādÄ«tāju uz atmiņas daļu, no kuras tā ir jāatskaņo vai jāieraksta iepriekÅ” noteiktā frekvencē. Kad buferis beidzas, tiek Ä£enerēts pārtraukums un izpilde turpinās no nākamā bufera. Lieta tāda, ka Å”ie buferi ir jāaizpilda iepriekÅ”, kamēr tiek atskaņots iepriekŔējais. Ar Å”o problēmu mēs saskarsimies tālāk STM32F7.

Pēc tam mēs noÄ«rējām serveri un izvietojām tajā Asterisk. Tā kā bija jāveic daudz atkļūdoÅ”anas un es negribēju daudz runāt mikrofonā, bija nepiecieÅ”ams veikt automātisku atskaņoÅ”anu un ierakstÄ«Å”anu. Lai to izdarÄ«tu, mēs ielāpējām simple_pjsua, lai audio ierīču vietā varētu ievietot failus. PJSIP tas tiek darÄ«ts pavisam vienkārÅ”i, jo tiem ir porta jēdziens, kas var bÅ«t gan ierÄ«ce, gan fails. Un Å”os portus var elastÄ«gi savienot ar citiem portiem. JÅ«s varat apskatÄ«t kodu mÅ«su pjsip krātuves. Rezultātā shēma bija Ŕāda. Es izveidoju divus kontus Asterisk serverÄ« - Linux un Embox. Pēc tam komanda tiek izpildÄ«ta Embox simple_pjsua_imported, Embox reÄ£istrējas serverÄ«, pēc tam mēs izsaucam Embox no Linux. Savienojuma brÄ«dÄ« mēs pārbaudām Asterisk serverÄ«, vai viss savienojums ir izveidots, un pēc kāda laika mums vajadzētu dzirdēt skaņu no Linux Embox, un Linux mēs saglabājam failu, kas tiek atskaņots no Embox.

Kad tas strādāja ar QEMU, mēs pārgājām uz tā pārneÅ”anu uz STM32F7-Discovery. Pirmā problēma bija tāda, ka mēs nevarējām iekļauties 1 MB ROM, ja nebija iespējota ā€œ-Osā€ kompilatora optimizācija attēla izmēram. Tāpēc mēs iekļāvām ā€œ-Osā€. Pēc tam ielāps atspējoja C++ atbalstu, tāpēc tas ir nepiecieÅ”ams tikai pjsua, un mēs izmantojam simple_pjsua.

Pēc ievietoÅ”anas simple_pjsua, nolēma, ka tagad ir iespēja to palaist. Bet vispirms mums bija jāizdomā, kā ierakstÄ«t un atskaņot balsis. Jautājums - kur rakstÄ«t? Mēs izvēlējāmies ārējo atmiņu - SDRAM (128 MB). To varat izmēģināt pats:

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


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

Mēs zaudējam:


play -m C0000000

Å eit bija divas problēmas. Pirmais ir ar kodeku - tiek izmantots WM8994, un tam ir tāda lieta kā slots, un Å”ie sloti ir 4. Tātad pēc noklusējuma, ja tas nav konfigurēts, tad atskaņojot audio, atskaņoÅ”ana notiek visos četras slots. Tāpēc ar frekvenci 16000 Hz mēs saņēmām 8000 Hz, bet 8000 Hz atskaņoÅ”anai vienkārÅ”i nedarbojās. Kad mēs atlasÄ«jām tikai 0 un 2 slotus, tas darbojās, kā paredzēts. Vēl viena problēma bija audio interfeiss STM32Cube, kurā audio izvade darbojas caur SAI (Serial Audio Interface) sinhroni ar audio ievadi (sÄ«kāku informāciju nesapratu, bet izrādās, ka viņiem ir kopÄ«gs pulkstenis un inicializējot audio izeja, audio kaut kādā veidā ir saistÄ«ts ar tā ieeju). Tas ir, nav iespējams tos palaist atseviŔķi, tāpēc mēs rÄ«kojāmies Ŕādi - audio ieeja un audio izeja vienmēr darbojas (arÄ« tiek Ä£enerēti pārtraukumi). Bet, kad sistēmā nekas netiek atskaņots, mēs vienkārÅ”i ieslidinām tukÅ”u buferi audio izvadē, un, kad sākas atskaņoÅ”ana, mēs godÄ«gi sākam to aizpildÄ«t.

Tad mēs saskārāmies ar faktu, ka skaņa, ierakstot balsi, bija ļoti klusa. Tas ir saistÄ«ts ar faktu, ka STM32F7-Discovery MEMS mikrofoni kaut kā nedarbojas labi frekvencēs, kas zemākas par 16000 Hz. Tāpēc mēs to iestatām uz 16000 Hz, pat ja pienāk 8000 Hz. Tomēr, lai to izdarÄ«tu, bija jāpievieno programmatÅ«ras vienas frekvences konvertÄ“Å”ana uz citu.

Tālāk mums bija jāpalielina kaudzes izmērs, kas atrodas RAM. Pēc mÅ«su aprēķiniem, pjsip vajadzēja apmēram 190 KB, un mums bija palikuÅ”i tikai aptuveni 100 KB. Å eit mums bija jāizmanto nedaudz ārējās atmiņas - SDRAM (apmēram 128 KB).

Pēc visiem Å”iem labojumiem es redzēju pirmās pakotnes starp Linux un Embox un dzirdēju skaņu! Bet skaņa bija briesmÄ«ga, nepavisam ne tāda kā QEMU, neko nevarēja dzirdēt. Tad mēs domājām, kas varētu bÅ«t par lietu. AtkļūdoÅ”ana parādÄ«ja, ka Embox vienkārÅ”i nav laika aizpildÄ«t/izlādēt audio buferus. Kamēr pjsip apstrādā vienu kadru, ir notikuÅ”i 2 pārtraukumi saistÄ«bā ar bufera apstrādes pabeigÅ”anu, kas ir pārāk daudz. Mana pirmā doma par paātrinājumu bija kompilatora optimizācija, taču tā jau bija iekļauta PJSIP. Otrais ir aparatÅ«ras peldoÅ”ais punkts, mēs par to runājām raksts. Bet, kā liecina prakse, FPU nenodroÅ”ināja ievērojamu ātruma pieaugumu. Nākamais solis bija pavedienu prioritāŔu noteikÅ”ana. Embox ir dažādas plānoÅ”anas stratēģijas, un es iespējoju to, kas atbalsta prioritātes un pieŔķīra audio straumēm visaugstāko prioritāti. Tas arÄ« nepalÄ«dzēja.

Nākamā doma bija tāda, ka mēs strādājam ar ārējo atmiņu un bÅ«tu labi tur pārvietot struktÅ«ras, kurām piekļūst ārkārtÄ«gi bieži. Es veicu iepriekŔēju analÄ«zi par to, kad un saskaņā ar ko simple_pjsua pieŔķir atmiņu. IzrādÄ«jās, ka no 190 KB pirmie 90 KB tiek atvēlēti PJSIP iekŔējām vajadzÄ«bām un tiem netiek piekļūts pārāk bieži. Tālāk ienākoŔā zvana laikā tiek izsaukta funkcija pjsua_call_answer, kurā pēc tam tiek pieŔķirti buferi darbam ar ienākoÅ”ajiem un izejoÅ”ajiem kadriem. Tas joprojām bija aptuveni 100 KB. Un tad mēs rÄ«kojāmies Ŕādi. LÄ«dz zvana veikÅ”anai dati tiek saglabāti ārējā atmiņā. TiklÄ«dz zvans zvana, mēs nekavējoties nomainām kaudzi ar citu RAM. Tādējādi visi ā€œkarstieā€ dati tika pārsÅ«tÄ«ti uz ātrāku un paredzamāku atmiņu.

Rezultātā tas viss kopā ļāva mums startēt simple_pjsua un zvaniet caur savu serveri. Un tad caur citiem serveriem, piemēram, sip.linphone.org.

Atzinumi

Beigās bija iespējams palaist simple_pjsua ar balss pārraidi abos virzienos caur serveri. Problēma ar papildus 128 KB SDRAM atrisināma, izmantojot nedaudz jaudÄ«gāku Cortex-M7 (piemēram, STM32F769NI ar 512 KB RAM), taču vēl neesam atmetuÅ”i cerÄ«bas ietilpināt 256 KB :) priecājies, ja kādu interesē, vai vēl labāk ā€“ pamēģini. Visi avoti, kā parasti, ir mÅ«su krātuves.

Avots: www.habr.com

Pievieno komentāru