የ SIP ስልክ በ STM32F7-ግኝት ላይ

ሰላም.

ከጥቂት ጊዜ በፊት እኛ ፃፈ በSTM32F4-Discovery 1MB ROM እና 192KB 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. ኢምቦክስን በቡድን ማሰባሰብ ማድረግ. እኛ ላይ ስላለን የቦርድ firmware ዊኪ እና ውስጥ ጽሑፍ.
  4. በኤምቦክስ ኮንሶል ውስጥ "ቀላል_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 ማይክሮፎኖች መናገር ይቀራል። ከሊኑክስ በቀላል_pjsua ፣ pjsua አፕሊኬሽኑ እንጠራለን። ደህና፣ ወይም ሌላ ማንኛውንም አይነት ሊንፎን መጠቀም ይችላሉ።

ይህ ሁሉ በእኛ ላይ ተገልጿል ዊኪ.

እዚያ እንዴት ደረስን

ስለዚህ, መጀመሪያ ላይ የሃርድዌር መድረክን ስለመምረጥ ጥያቄው ተነሳ. STM32F4-ግኝት ከማህደረ ትውስታ እንደማይገባ ግልጽ ስለነበር፣ STM32F7-ግኝት ተመርጧል። እሷ 1 ሜባ ፍላሽ አንፃፊ እና 256 ኪባ ራም (+ 64 ልዩ ፈጣን ማህደረ ትውስታ, እኛ ደግሞ እንጠቀማለን). እንዲሁም በአገልጋዩ በኩል ለመደወል ብዙ አይደለም, ነገር ግን ለመግባት ለመሞከር ወሰንን.

እንደ ሁኔታው ​​​​ለራሳቸው ፣ ተግባሩ በበርካታ ደረጃዎች ተከፍሏል-

  • በQEMU ላይ PJSIPን በማሄድ ላይ። ለማረም ምቹ ነበር፣ በተጨማሪም እዚያ ለ AC97 ኮድ ድጋፍ አግኝተናል።
  • በQEMU እና በSTM32 ላይ የድምጽ ቅጂ እና መልሶ ማጫወት።
  • መተግበሪያን በማስተላለፍ ላይ ቀላል_pjsua ከ PJSIP. በ SIP አገልጋይ ላይ እንዲመዘገቡ እና ጥሪዎችን ለማድረግ ያስችልዎታል.
  • የእራስዎን በኮከብ ላይ የተመሰረተ አገልጋይ ያሰማሩ እና በላዩ ላይ ይሞክሩት፣ ከዚያ እንደ sip.linphone.org ያሉ ውጫዊዎችን ይሞክሩ።

በEmbox ውስጥ ያለው ድምጽ በPortaudio በኩል ይሰራል፣ እሱም በPISIP ውስጥም ጥቅም ላይ ይውላል። የመጀመሪያዎቹ ችግሮች በ QEMU ላይ ታይተዋል - WAV በ 44100 Hz ጥሩ ተጫውቷል ፣ ግን በ 8000 አንድ ነገር በግልፅ ተሳስቷል። ድግግሞሹን የማዘጋጀት ጉዳይ ሆኖ ተገኝቷል - በነባሪነት በመሳሪያው ውስጥ 44100 ነበር ፣ እና ይህ በፕሮግራም አልተለወጠም።

እዚህ, ምናልባት, ድምጹ በአጠቃላይ እንዴት እንደሚጫወት ትንሽ ማብራራት ጠቃሚ ነው. የድምጽ ካርዱ አስቀድሞ በተወሰነ ፍሪኩዌንሲ ለመጫወት ወይም ለመቅዳት ወደሚፈልጉበት የማህደረ ትውስታ ክፍል አንዳንድ ጠቋሚ ሊዋቀር ይችላል። ቋቱ ካለቀ በኋላ መቆራረጥ ይፈጠራል እና አፈፃፀም በሚቀጥለው ቋት ይቀጥላል። እውነታው ግን ቀዳሚው እየተጫወተ እያለ እነዚህ ቋቶች አስቀድመው መሙላት አለባቸው። ይህንን ችግር በSTM32F7 ላይ የበለጠ እንጋፈጣለን።

በመቀጠል አገልጋይ ተከራይተን አስሪስክን አሰማርተናል። ብዙ ማረም አስፈላጊ ስለነበር ነገር ግን ወደ ማይክሮፎኑ ብዙ መናገር አልፈልግም, አውቶማቲክ መልሶ ማጫወት እና መቅዳት አስፈላጊ ነበር. ይህንን ለማድረግ በድምጽ መሳሪያዎች ምትክ ፋይሎችን ማንሸራተት እንዲችሉ ቀላል_pjsuaን ለጥፈናል። በPJSIP ውስጥ፣ መሣሪያ ወይም ፋይል ሊሆን የሚችል የወደብ ጽንሰ-ሐሳብ ስላላቸው ይህ በቀላሉ ይከናወናል። እና እነዚህ ወደቦች ከሌሎች ወደቦች ጋር በተለዋዋጭ ሊገናኙ ይችላሉ። ኮዱን በእኛ pjsip ውስጥ ማየት ይችላሉ። ማከማቻዎች. በውጤቱም, መርሃግብሩ እንደሚከተለው ነበር. በአስሪስክ አገልጋይ ላይ ሁለት መለያዎችን ጀመርኩ - ለሊኑክስ እና ለኤምቦክስ። በመቀጠል ትዕዛዙ በኤምቦክስ ላይ ይከናወናል ቀላል_pjsua_ ከውጭ የመጣ, ኢምቦክስ በአገልጋዩ ላይ ተመዝግቧል, ከዚያ በኋላ ኢምቦክስ ከሊኑክስ እንጠራዋለን. በግንኙነት ጊዜ በAsterisk አገልጋይ ላይ ግንኙነቱ መፈጠሩን እናረጋግጣለን እና ከጥቂት ጊዜ በኋላ በኤምቦክስ ውስጥ ከሊኑክስ ድምጽ መስማት አለብን ፣ እና በሊኑክስ ውስጥ የሚጫወተውን ፋይል ከኤምቦክስ እናስቀምጣለን።

በQEMU ላይ ከሰራ በኋላ ወደ STM32F7-Discovery ወደ ማጓጓዝ ሄድን። የመጀመሪያው ችግር ለምስሉ መጠን የነቃው የማጠናከሪያ ማመቻቸት "-Os" ሳይኖር በ 1 ሜባ ROM ውስጥ አልገቡም. ለዚህም ነው "-Os" ያካተትነው። በተጨማሪ፣ patch ለ C ++ ድጋፍን ስለቦዘነ ለ pjsua ብቻ ነው የሚያስፈልገው፣ እና እኛ ቀላል_pjsua እንጠቀማለን።

ከተቀመጠ በኋላ ቀላል_pjsua, አሁን ለማስጀመር እድሉ እንዳለ ወስኗል. ነገር ግን በመጀመሪያ የድምፅ ቅጂውን እና መልሶ ማጫወትን መቋቋም አስፈላጊ ነበር. ጥያቄው የት መጻፍ ነው? ውጫዊ ማህደረ ትውስታን መርጠናል - SDRAM (128 ሜባ)። ይህንን እራስዎ መሞከር ይችላሉ-

የ16000 Hz ድግግሞሽ እና የ10 ሰከንድ ቆይታ ያለው ስቴሪዮ WAV ይፈጥራል፡


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

እናጣለን፡-


play -m C0000000

እዚህ ሁለት ችግሮች አሉ. የመጀመሪያው ከኮዴክ ጋር - WM8994 ጥቅም ላይ ይውላል ፣ እና እንደ ማስገቢያ ያለ ነገር አለው ፣ እና ከእነዚህ ውስጥ 4 ቦታዎች አሉ ። ስለዚህ ፣ በነባሪ ፣ ይህ ካልተዋቀረ ድምጽ ሲጫወት ፣ መልሶ ማጫወት በአራቱም ክፍተቶች ውስጥ ይከሰታል። . ስለዚህ, በ 16000 Hz ድግግሞሽ, 8000 Hz ተቀብለናል, ለ 8000 Hz ግን መልሶ ማጫወት በቀላሉ አልሰራም. ቦታዎች 0 እና 2 ብቻ ሲመረጡ, ልክ እንደነበረው ይሰራል. ሌላው ችግር በ STM32Cube ውስጥ ያለው የኦዲዮ በይነገጽ ነበር ፣የድምጽ ውፅዓት በ SAI (ተከታታይ ኦዲዮ በይነገጽ) ከድምጽ ግብዓት ጋር በተመሳሳይ ጊዜ የሚሰራበት (ዝርዝሩን አልገባኝም ፣ ግን አንድ ጊዜ የሚጋሩት የጋራ ሰዓት እና መቼ ነው) የድምጽ ውፅዓት ተጀምሯል፣ ኦዲዮው በሆነ መንገድ ከመግቢያው ጋር ተያይዟል። ማለትም እነሱን ለየብቻ ማሄድ አይችሉም፣ ስለዚህ እኛ የሚከተለውን አድርገናል - የኦዲዮ ግብዓት እና የድምጽ ውፅዓት ሁልጊዜ ይሰራሉ ​​(ማቋረጥን ጨምሮ)። ነገር ግን በሲስተሙ ውስጥ ምንም ነገር በማይጫወትበት ጊዜ፣ በቀላሉ ባዶ ቋት ወደ የድምጽ ውፅዓት እናስገባዋለን፣ እና መልሶ ማጫወት ሲጀመር በትክክል መሙላት እንጀምራለን።

በተጨማሪም በድምፅ ቀረጻ ወቅት ድምፁ በጣም ጸጥ ያለ የመሆኑን እውነታ አጋጥሞናል። ይህ የሆነበት ምክንያት በ STM32F7-Discovery ላይ ያሉ የ MEMS ማይክሮፎኖች ከ 16000 Hz በታች በሆኑ ድግግሞሽዎች ላይ በጥሩ ሁኔታ የማይሰሩ በመሆናቸው ነው። ስለዚህ, 16000 Hz ቢመጣም, 8000 Hz አዘጋጅተናል. ይህንን ለማድረግ ግን የሶፍትዌር ልወጣን የአንድ ድግግሞሽ ወደ ሌላ ማከል አስፈላጊ ነበር።

በመቀጠልም በ RAM ውስጥ የሚገኘውን ክምር መጠን መጨመር ነበረብኝ. እንደእኛ ስሌት፣ pjsip 190 ኪባ ያህል ይፈልጋል፣ እና 100 ኪባ ያህል ብቻ ነው የቀረን። እዚህ አንዳንድ ውጫዊ ማህደረ ትውስታን መጠቀም ነበረብኝ - SDRAM (ወደ 128 ኪባ)።

ከነዚህ ሁሉ አርትዖቶች በኋላ በሊኑክስ እና በኤምቦክስ መካከል የመጀመሪያዎቹን ፓኬጆች አየሁ እና ድምፁን ሰማሁ! ነገር ግን ድምፁ አስፈሪ ነበር፣ በQEMU ላይ ካለው ጋር ተመሳሳይ አይደለም፣ ምንም ነገር ለመስራት አልተቻለም። ከዚያም ጉዳዩ ምን ሊሆን እንደሚችል አሰብን። ማረም Embox በቀላሉ የድምጽ ማቋረጦችን ለመሙላት/ለማውረድ ጊዜ እንደሌለው ያሳያል። pjsip አንድ ፍሬም በማስኬድ ላይ እያለ፣ 2 ማቋረጦች ስለ ቋት ማቀናበሪያ መጠናቀቅ ጊዜ ነበራቸው፣ ይህም በጣም ብዙ ነው። የፍጥነት የመጀመሪያው ሀሳብ የማጠናከሪያ ማመቻቸት ነበር፣ ግን አስቀድሞ በPJSIP ውስጥ ተካቷል። ሁለተኛው የሃርድዌር ተንሳፋፊ ነጥብ ነው ፣ ስለ እሱ ተነጋገርን። ጽሑፍ. ነገር ግን እንደ ልምምድ እንደሚያሳየው FPU በከፍተኛ ፍጥነት መጨመር አልሰጠም. ቀጣዩ ደረጃ ክሮች ቅድሚያ መስጠት ነበር. ኤምቦክስ የተለያዩ የመርሃግብር አወጣጥ ስልቶች አሉት፣ እና ቅድሚያ የሚሰጣቸውን ነገሮች የሚደግፍ እና የኦዲዮ ዥረቶችን ወደ ከፍተኛ ቅድሚያ የሚይዝ አንዱን አካትቻለሁ። ይህ ደግሞ አልጠቀመም።

የሚቀጥለው ሀሳብ ከውጫዊ ማህደረ ትውስታ ጋር እየሰራን ነው እና በጣም ብዙ ጊዜ የሚደርሱ መዋቅሮችን ወደዚያ ማንቀሳቀስ ጥሩ ነበር። መቼ እና በምን ስር ቀዳሚ ትንታኔ ሰራሁ ቀላል_pjsua ማህደረ ትውስታን ይመድባል. ከ190 ኪባ የመጀመሪያዎቹ 90 ኪባ የሚመደቡት ለPJSIP የውስጥ ፍላጎቶች ነው እና እነሱ ብዙ ጊዜ አይደርሱባቸውም። በተጨማሪም፣ በገቢ ጥሪ ወቅት፣ የpjsua_call_መልስ ተግባር ይባላል፣ በዚህ ጊዜ ቋቶች ከገቢ እና ወጪ ክፈፎች ጋር ለመስራት ይመደባሉ። አሁንም 100 ኪ.ባ. እና ከዚያ የሚከተለውን አደረግን. እስከ ጥሪው ቅጽበት ድረስ ውሂቡን በውጫዊ ማህደረ ትውስታ ውስጥ እናስቀምጠዋለን። ልክ እንደ ጥሪው ወዲያውኑ ክምሩን በሌላ - በ RAM ውስጥ እንተካለን. ስለዚህ, ሁሉም "ትኩስ" ውሂብ ወደ ፈጣን እና የበለጠ ሊተነበይ የሚችል ማህደረ ትውስታ ተላልፏል.

በውጤቱም, ይህ ሁሉ አንድ ላይ ለመጀመር አስችሏል ቀላል_pjsua እና በአገልጋይዎ በኩል ይደውሉ. እና ከዚያ እንደ sip.linphone.org ባሉ ሌሎች አገልጋዮች በኩል።

ግኝቶች

በውጤቱም, ማስጀመር ተችሏል ቀላል_pjsua በአገልጋዩ በኩል በሁለቱም አቅጣጫዎች በድምጽ ማስተላለፊያ. በተጨማሪም 128 ኪባ ኤስዲራም ወጪ የተደረገበት ችግር በትንሹ የበለጠ ኃይለኛ Cortex-M7 በመጠቀም ሊፈታ ይችላል (ለምሳሌ STM32F769NI ከ 512 ኪባ ራም ጋር) ፣ ግን በተመሳሳይ ጊዜ ፣ ​​አሁንም ወደ 256 ለመግባት ተስፋ አልቆረጥንም ። KB 🙂 አንድ ሰው ፍላጎት ካለው ደስ ይለናል, ወይም የተሻለ, ይሞክሩት. ሁሉም ምንጮች, እንደተለመደው, በእኛ ውስጥ ናቸው ማከማቻዎች.

ምንጭ: hab.com

አስተያየት ያክሉ