STM32F7-Discovery પર SIP ફોન

બધા ને નમસ્કાર.

થોડા સમય પહેલા અમે લખ્યું અમે STM32F4-Discovery પર 1 MB ROM અને 192 KB RAM સાથે SIP ફોન કેવી રીતે લોન્ચ કરવામાં વ્યવસ્થાપિત થયા તે વિશે) આધારિત એમ્બોક્સ. અહીં એ કહેવું આવશ્યક છે કે તે સંસ્કરણ ન્યૂનતમ હતું અને સર્વર વિના અને માત્ર એક દિશામાં વૉઇસ ટ્રાન્સમિશન સાથે બે ફોનને સીધા જ કનેક્ટ કર્યા હતા. તેથી, અમે સર્વર દ્વારા કૉલ, બંને દિશામાં વૉઇસ ટ્રાન્સમિશન સાથે વધુ સંપૂર્ણ ફોન લૉન્ચ કરવાનું નક્કી કર્યું, પરંતુ તે જ સમયે શક્ય તેટલી નાની મેમરી કદમાં રાખો.


ફોન માટે, એપ્લિકેશન પસંદ કરવાનું નક્કી કરવામાં આવ્યું હતું સરળ_pjsua PJSIP પુસ્તકાલયના ભાગ રૂપે. આ એક ન્યૂનતમ એપ્લિકેશન છે જે સર્વર પર નોંધણી કરી શકે છે, કૉલ્સ પ્રાપ્ત કરી શકે છે અને જવાબ આપી શકે છે. નીચે હું તરત જ તેને STM32F7-Discovery પર કેવી રીતે ચલાવવું તેનું વર્ણન આપીશ.

કેવી રીતે ચલાવવું

  1. એમ્બૉક્સને ગોઠવી રહ્યું છે
    make confload-platform/pjsip/stm32f7cube
  2. conf/mods.config ફાઇલમાં જરૂરી SIP એકાઉન્ટ સેટ કરો.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    જ્યાં સર્વર SIP સર્વર છે (ઉદાહરણ તરીકે, sip.linphone.org), વપરાશકર્તા નામ и પાસવર્ડ - એકાઉન્ટ યુઝરનેમ અને પાસવર્ડ.

  3. એમ્બૉક્સને એક ટીમ તરીકે એસેમ્બલ કરવું બનાવવા. અમારી પાસે જે બોર્ડ ફર્મવેર છે તેના વિશે વિકી અને અંદર લેખ.
  4. Embox કન્સોલમાં "simple_pjsua_imported" આદેશ ચલાવો
    
    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. છેલ્લે, તે ઑડિઓ આઉટપુટમાં સ્પીકર્સ અથવા હેડફોન દાખલ કરવાનું રહે છે, અને ડિસ્પ્લેની બાજુમાં બે નાના MEMS માઇક્રોફોન્સમાં બોલે છે. અમે Linux માંથી એપ્લિકેશન simple_pjsua, pjsua દ્વારા કૉલ કરીએ છીએ. સારું, અથવા તમે અન્ય કોઈપણ પ્રકારના લિનફોનનો ઉપયોગ કરી શકો છો.

આ બધું અમારા પર વર્ણવેલ છે વિકી.

અમે ત્યાં કેવી રીતે પહોંચ્યા

તેથી, શરૂઆતમાં હાર્ડવેર પ્લેટફોર્મ પસંદ કરવા વિશે પ્રશ્ન ઊભો થયો. કારણ કે તે સ્પષ્ટ હતું કે STM32F4-ડિસ્કવરી મેમરીમાંથી ફિટ થશે નહીં, STM32F7-ડિસ્કવરી પસંદ કરવામાં આવી હતી. તેણી પાસે 1 MB ફ્લેશ ડ્રાઇવ અને 256 KB RAM છે (+ 64 વિશેષ ઝડપી મેમરી, જેનો અમે પણ ઉપયોગ કરીશું). સર્વર દ્વારા કૉલ્સ માટે પણ ઘણું નથી, પરંતુ અમે ફિટ થવાનો પ્રયાસ કરવાનું નક્કી કર્યું.

શરતી રીતે પોતાને માટે, કાર્યને ઘણા તબક્કામાં વહેંચવામાં આવ્યું હતું:

  • QEMU પર PJSIP ચાલી રહ્યું છે. તે ડીબગીંગ માટે અનુકૂળ હતું, વત્તા અમારી પાસે પહેલાથી જ ત્યાં AC97 કોડેક માટે સમર્થન હતું.
  • QEMU અને STM32 પર વૉઇસ રેકોર્ડિંગ અને પ્લેબેક.
  • એપ્લિકેશન પોર્ટીંગ સરળ_pjsua PJSIP માંથી. તે તમને SIP સર્વર પર નોંધણી કરવા અને કૉલ્સ કરવાની મંજૂરી આપે છે.
  • તમારા પોતાના ફૂદડી-આધારિત સર્વરનો ઉપયોગ કરો અને તેના પર પરીક્ષણ કરો, પછી sip.linphone.org જેવા બાહ્યને અજમાવો

Embox માં સાઉન્ડ પોર્ટઓડિયો દ્વારા કામ કરે છે, જેનો ઉપયોગ PISIP માં પણ થાય છે. પ્રથમ સમસ્યાઓ QEMU પર દેખાઈ - WAV 44100 Hz પર સારી રીતે રમ્યું, પરંતુ 8000 પર કંઈક સ્પષ્ટ રીતે ખોટું થયું. તે બહાર આવ્યું છે કે તે આવર્તન સેટ કરવાની બાબત છે - ડિફૉલ્ટ રૂપે તે સાધનોમાં 44100 હતું, અને આ પ્રોગ્રામેટિકલી બદલાયું નથી.

અહીં, કદાચ, સામાન્ય રીતે અવાજ કેવી રીતે વગાડવામાં આવે છે તે થોડું સમજાવવા યોગ્ય છે. સાઉન્ડ કાર્ડને મેમરીના ટુકડા માટે અમુક પોઇન્ટર પર સેટ કરી શકાય છે જેમાંથી તમે પૂર્વનિર્ધારિત આવર્તન પર રમવા અથવા રેકોર્ડ કરવા માંગો છો. બફર સમાપ્ત થયા પછી, એક વિક્ષેપ પેદા થાય છે અને આગળના બફર સાથે અમલ ચાલુ રહે છે. હકીકત એ છે કે આ બફરને અગાઉથી ભરવાની જરૂર છે જ્યારે અગાઉનું એક વગાડવામાં આવે છે. અમે STM32F7 પર આગળ આ સમસ્યાનો સામનો કરીશું.

આગળ, અમે સર્વર ભાડે લીધું અને તેના પર એસ્ટરિસ્ક ગોઠવ્યું. કારણ કે તે ઘણું ડીબગ કરવું જરૂરી હતું, પરંતુ હું માઇક્રોફોનમાં વધુ બોલવા માંગતો ન હતો, સ્વચાલિત પ્લેબેક અને રેકોર્ડિંગ કરવું જરૂરી હતું. આ કરવા માટે, અમે સરળ_pjsua ને પેચ કર્યું છે જેથી કરીને તમે ઑડિઓ ઉપકરણોને બદલે ફાઇલોને સ્લિપ કરી શકો. PJSIP માં, આ એકદમ સરળ રીતે કરવામાં આવે છે, કારણ કે તેમની પાસે પોર્ટનો ખ્યાલ છે, જે કાં તો ઉપકરણ અથવા ફાઇલ હોઈ શકે છે. અને આ બંદરોને અન્ય બંદરો સાથે લવચીક રીતે કનેક્ટ કરી શકાય છે. તમે અમારા pjsip માં કોડ જોઈ શકો છો ભંડાર. પરિણામે, યોજના નીચે મુજબ હતી. Asterisk સર્વર પર, મેં બે એકાઉન્ટ્સ શરૂ કર્યા - Linux માટે અને Embox માટે. આગળ, આદેશ Embox પર ચલાવવામાં આવે છે simple_pjsua_imported, Embox સર્વર પર નોંધાયેલ છે, જે પછી અમે Linux માંથી Embox કૉલ કરીએ છીએ. કનેક્શનની ક્ષણે, અમે એસ્ટેરિસ્ક સર્વર પર તપાસ કરીએ છીએ કે કનેક્શન સ્થાપિત થઈ ગયું છે, અને થોડા સમય પછી આપણે એમ્બોક્સમાં લિનક્સમાંથી અવાજ સાંભળવો જોઈએ, અને લિનક્સમાં આપણે એમ્બોક્સથી ચલાવવામાં આવતી ફાઇલને સાચવીએ છીએ.

QEMU પર કામ કર્યા પછી, અમે STM32F7-ડિસ્કવરી પર પોર્ટ કરવા આગળ વધ્યા. પ્રથમ સમસ્યા એ છે કે તેઓ ઈમેજના કદ માટે સક્ષમ કમ્પાઈલર ઓપ્ટિમાઈઝેશન “-Os” વગર 1 MB ROM માં ફિટ થતા નથી. તેથી જ અમે "-Os" નો સમાવેશ કર્યો છે. આગળ, પેચ C++ માટે સપોર્ટને અક્ષમ કરે છે, તેથી તે ફક્ત pjsua માટે જ જરૂરી છે, અને અમે simple_pjsua નો ઉપયોગ કરીએ છીએ.

મૂકવામાં આવ્યા પછી સરળ_pjsua, નક્કી કર્યું કે હવે તેને લોન્ચ કરવાની તક છે. પરંતુ પહેલા અવાજના રેકોર્ડિંગ અને પ્લેબેક સાથે કામ કરવું જરૂરી હતું. પ્રશ્ન એ છે કે ક્યાં લખવું? અમે બાહ્ય મેમરી પસંદ કરી - SDRAM (128 MB). તમે આ જાતે અજમાવી શકો છો:

16000 હર્ટ્ઝની આવર્તન અને 10 સેકન્ડની અવધિ સાથે સ્ટીરિયો WAV બનાવે છે:


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

અમે ગુમાવીએ છીએ:


play -m C0000000

અહીં બે સમસ્યાઓ છે. કોડેક સાથે પ્રથમ - WM8994 નો ઉપયોગ થાય છે, અને તેમાં સ્લોટ જેવી વસ્તુ છે, અને આમાંથી 4 સ્લોટ છે. તેથી, મૂળભૂત રીતે, જો આ ગોઠવેલ ન હોય, તો જ્યારે ઑડિઓ વગાડવામાં આવે છે, ત્યારે ચારેય સ્લોટમાં પ્લેબેક થાય છે. . તેથી, 16000 હર્ટ્ઝની આવર્તન પર, અમને 8000 હર્ટ્ઝ પ્રાપ્ત થયા, પરંતુ 8000 હર્ટ્ઝ માટે, પ્લેબેક ફક્ત કામ કરતું નથી. જ્યારે માત્ર સ્લોટ 0 અને 2 પસંદ કરવામાં આવ્યા હતા, ત્યારે તે જેમ જોઈએ તેમ કામ કરે છે. બીજી સમસ્યા STM32Cube માં ઓડિયો ઈન્ટરફેસ હતી, જેમાં ઓડિયો આઉટપુટ SAI (સીરીયલ ઓડિયો ઈન્ટરફેસ) દ્વારા ઓડિયો ઇનપુટ સાથે સિંક્રનસ રીતે કામ કરે છે (હું વિગતો સમજી શક્યો નથી, પરંતુ તે તારણ આપે છે કે તેઓ એક સામાન્ય ઘડિયાળ શેર કરે છે અને જ્યારે ઓડિયો આઉટપુટ આરંભ થયેલ છે, ઓડિયો કોઈક રીતે તેની સાથે જોડાયેલ છે). એટલે કે, તમે તેમને અલગથી ચલાવી શકતા નથી, તેથી અમે નીચે મુજબ કર્યું - ઑડિઓ ઇનપુટ અને ઑડિઓ આઉટપુટ હંમેશા કાર્ય કરે છે (જેમાં વિક્ષેપો જનરેટ થાય છે). પરંતુ જ્યારે સિસ્ટમમાં કંઈ વગાડવામાં આવતું નથી, ત્યારે અમે ખાલી બફરને ઑડિઓ આઉટપુટમાં સરકી જઈએ છીએ, અને જ્યારે પ્લેબેક શરૂ થાય છે, ત્યારે અમે પ્રમાણિકપણે તેને ભરવાનું શરૂ કરીએ છીએ.

આગળ, અમે એ હકીકતનો સામનો કર્યો કે વૉઇસ રેકોર્ડિંગ દરમિયાન અવાજ ખૂબ જ શાંત હતો. આ એ હકીકતને કારણે છે કે STM32F7-ડિસ્કવરી પરના MEMS માઇક્રોફોન્સ 16000 Hz ની નીચેની ફ્રીક્વન્સીઝ પર સારી રીતે કામ કરતા નથી. તેથી, અમે 16000 Hz સેટ કરીએ છીએ, ભલે 8000 Hz આવે. આ કરવા માટે, જોકે, એક ફ્રિકવન્સીનું બીજી ફ્રીક્વન્સીમાં સોફ્ટવેર કન્વર્ઝન ઉમેરવું જરૂરી હતું.

આગળ, મારે ઢગલાનું કદ વધારવું પડ્યું, જે RAM માં સ્થિત છે. અમારી ગણતરી મુજબ, pjsip ને લગભગ 190 KB ની જરૂર છે, અને અમારી પાસે માત્ર 100 KB બાકી છે. અહીં મારે કેટલીક બાહ્ય મેમરીનો ઉપયોગ કરવો પડ્યો - SDRAM (લગભગ 128 KB).

આ બધા સંપાદનો પછી, મેં Linux અને Embox વચ્ચેના પ્રથમ પેકેજો જોયા, અને મેં અવાજ સાંભળ્યો! પરંતુ અવાજ ભયંકર હતો, QEMU જેવો જ નહોતો, કંઈપણ બનાવવું અશક્ય હતું. પછી અમે વિચાર્યું કે મામલો શું હોઈ શકે. ડીબગીંગ દર્શાવે છે કે Embox પાસે ઓડિયો બફર્સ ભરવા/અનલોડ કરવાનો સમય નથી. જ્યારે pjsip એક ફ્રેમ પર પ્રક્રિયા કરી રહી હતી, ત્યારે બફર પ્રક્રિયા પૂર્ણ થવા અંગે 2 વિક્ષેપો થવાનો સમય હતો, જે ખૂબ જ વધારે છે. ઝડપ માટેનો પ્રથમ વિચાર કમ્પાઇલર ઓપ્ટિમાઇઝેશનનો હતો, પરંતુ તે પહેલાથી જ PJSIP માં સમાવવામાં આવેલ હતો. બીજો હાર્ડવેર ફ્લોટિંગ પોઇન્ટ છે, અમે તેના વિશે વાત કરી લેખ. પરંતુ પ્રેક્ટિસ બતાવે છે તેમ, FPU એ ઝડપમાં નોંધપાત્ર વધારો કર્યો નથી. આગળનું પગલું થ્રેડોને પ્રાથમિકતા આપવાનું હતું. એમ્બૉક્સમાં અલગ-અલગ શેડ્યૂલિંગ વ્યૂહરચના છે, અને મેં એક એવો સમાવેશ કર્યો છે જે પ્રાથમિકતાઓને સપોર્ટ કરે છે અને ઑડિયો સ્ટ્રીમ્સને સર્વોચ્ચ અગ્રતા પર સેટ કરે છે. આ પણ મદદ કરી ન હતી.

આગળનો વિચાર એ હતો કે અમે બાહ્ય મેમરી સાથે કામ કરી રહ્યા છીએ અને ઘણી વાર એક્સેસ કરવામાં આવતા સ્ટ્રક્ચર્સને ત્યાં ખસેડવાનું સારું રહેશે. મેં ક્યારે અને શું હેઠળ પ્રારંભિક વિશ્લેષણ કર્યું સરળ_pjsua મેમરી ફાળવે છે. તે બહાર આવ્યું છે કે 190 Kbમાંથી, પ્રથમ 90 Kb PJSIP ની આંતરિક જરૂરિયાતો માટે ફાળવવામાં આવે છે અને તે ઘણી વાર ઍક્સેસ કરવામાં આવતા નથી. વધુમાં, ઇનકમિંગ કોલ દરમિયાન, pjsua_call_answer ફંક્શનને બોલાવવામાં આવે છે, જેમાં બફર્સ પછી ઇનકમિંગ અને આઉટગોઇંગ ફ્રેમ્સ સાથે કામ કરવા માટે ફાળવવામાં આવે છે. તે હજુ પણ લગભગ 100 Kb હતું. અને પછી અમે નીચે મુજબ કર્યું. કૉલની ક્ષણ સુધી, અમે ડેટાને બાહ્ય મેમરીમાં મૂકીએ છીએ. કૉલ થતાં જ, અમે તરત જ ઢગલાને બીજા એક સાથે બદલીએ છીએ - RAM માં. આમ, તમામ "ગરમ" ડેટા ઝડપી અને વધુ અનુમાનિત મેમરીમાં સ્થાનાંતરિત કરવામાં આવ્યો હતો.

પરિણામે, આ બધા સાથે મળીને લોન્ચ કરવાનું શક્ય બન્યું સરળ_pjsua અને તમારા સર્વર દ્વારા કૉલ કરો. અને પછી sip.linphone.org જેવા અન્ય સર્વર્સ દ્વારા.

તારણો

પરિણામે, લોન્ચ કરવાનું શક્ય બન્યું સરળ_pjsua સર્વર દ્વારા બંને દિશામાં વૉઇસ ટ્રાન્સમિશન સાથે. 128 KB SDRAM સાથેની સમસ્યા થોડી વધુ શક્તિશાળી Cortex-M7 (ઉદાહરણ તરીકે, 32 KB RAM સાથે STM769F512NI) નો ઉપયોગ કરીને ઉકેલી શકાય છે, પરંતુ તે જ સમયે, અમે હજુ પણ 256 માં જવાની આશા છોડી નથી. KB 🙂 જો કોઈને રસ હોય તો અમને આનંદ થશે, અથવા હજી વધુ સારું, તેનો પ્રયાસ કરો. બધા સ્ત્રોતો, હંમેશની જેમ, અમારામાં છે ભંડાર.

સોર્સ: www.habr.com

એક ટિપ્પણી ઉમેરો