STM32F7-ඩිස්කවරි මත SIP දුරකථනය

හැමෝටම ආයුබෝවන්.

ටික කාලෙකට කලින් අපි ලියා 32 MB ROM සහ 4 KB RAM සහිත STM1F192-Discovery මත 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. කණ්ඩායමක් ලෙස Embox එකලස් කිරීම කරන්න. අප සතුව ඇති පුවරු ස්ථිරාංග ගැන විකි හා ඇතුළත ලිපියයි.
  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 මයික්‍රෆෝන දෙකකට කථා කිරීමටත් ඉතිරිව ඇත. අපි සරල_pjsua, pjsua යෙදුම හරහා Linux වෙතින් අමතන්නෙමු. හොඳයි, නැතහොත් ඔබට වෙනත් ඕනෑම ආකාරයේ ලින්ෆෝන් භාවිතා කළ හැකිය.

මේ සියල්ල අපගේ විස්තර කර ඇත විකි.

අපි කොහොමද එතනට ආවේ

එබැවින්, දෘඪාංග වේදිකාවක් තෝරා ගැනීම පිළිබඳ ප්රශ්නය මුලදී මතු විය. STM32F4-Discovery මතකයෙන් නොගැලපෙන බව පැහැදිලි වූ බැවින්, STM32F7-Discovery තෝරා ගන්නා ලදී. ඇය සතුව 1 MB ෆ්ලෑෂ් ඩ්‍රයිව් එකක් සහ 256 KB RAM (+ 64 විශේෂ වේගවත් මතකය, අපි ද භාවිතා කරනු ඇත). එසේම සේවාදායකය හරහා ඇමතුම් සඳහා බොහෝ නොවේ, නමුත් අපි ගැලපෙන ලෙස උත්සාහ කිරීමට තීරණය කළා.

කොන්දේසි සහිතව, කාර්යය අදියර කිහිපයකට බෙදා ඇත:

  • QEMU මත PJSIP ධාවනය කිරීම. එය නිදොස්කරණය සඳහා පහසු විය, තවද අපට දැනටමත් එහි AC97 කෝඩෙක් සඳහා සහය තිබුණි.
  • QEMU සහ STM32 මත හඬ පටිගත කිරීම සහ නැවත ධාවනය.
  • යෙදුමක් පෝට් කිරීම සරල_pjsua PJSIP වෙතින්. SIP සේවාදායකයේ ලියාපදිංචි වීමට සහ ඇමතුම් ලබා ගැනීමට එය ඔබට ඉඩ සලසයි.
  • ඔබේම තරු ලකුණු මත පදනම් වූ සේවාදායකයක් යොදවා එය පරීක්ෂා කරන්න, ඉන්පසු sip.linphone.org වැනි බාහිර ඒවා උත්සාහ කරන්න

එම්බොක්ස් හි ශබ්දය Portaudio හරහා ක්‍රියා කරයි, එය PISIP හි ද භාවිතා වේ. පළමු ගැටළු QEMU මත දිස් විය - WAV 44100 Hz දී හොඳින් වාදනය විය, නමුත් 8000 දී යමක් පැහැදිලිවම වැරදී ඇත. එය සංඛ්‍යාතය සැකසීමේ කාරණයක් බව පෙනී ගියේය - පෙරනිමියෙන් එය උපකරණවල 44100 ක් වූ අතර මෙය ක්‍රමලේඛනාත්මකව වෙනස් නොවීය.

මෙන්න, සමහර විට, ශබ්දය සාමාන්යයෙන් වාදනය කරන ආකාරය ටිකක් පැහැදිලි කිරීම වටී. ශබ්ද කාඩ්පත ඔබට කලින් තීරණය කළ සංඛ්‍යාතයකින් වාදනය කිරීමට හෝ පටිගත කිරීමට අවශ්‍ය මතක කොටසකට කිසියම් දර්ශකයකට සැකසිය හැක. බෆරය අවසන් වූ පසු, බාධාවක් ජනනය වන අතර ඊළඟ බෆරය සමඟ ක්‍රියාත්මක කිරීම දිගටම සිදු වේ. ඇත්ත තමයි කලින් එක play කරනකොට මේ buffers කලින් පුරවන්න ඕන. අපි STM32F7 හි මෙම ගැටලුවට තවදුරටත් මුහුණ දෙන්නෙමු.

ඊළඟට, අපි සේවාදායකයක් කුලියට ගෙන එය මත Asterisk යෙදුවෙමු. බොහෝ දේ දෝෂහරණය කිරීමට අවශ්‍ය වූ නමුත් මයික්‍රෆෝනයට වැඩිය කතා කිරීමට අවශ්‍ය නොවූ බැවින් ස්වයංක්‍රීය නැවත ධාවනය සහ පටිගත කිරීම අවශ්‍ය විය. මෙය සිදු කිරීම සඳහා, අපි ඔබට ශ්‍රව්‍ය උපාංග වෙනුවට ගොනු ලිස්සා යාමට හැකි වන පරිදි simple_pjsua පැච් කළෙමු. PJSIP හි, මෙය ඉතා සරලව සිදු කරනු ලැබේ, මන්ද ඔවුන්ට වරායක් පිළිබඳ සංකල්පය ඇති බැවින් එය උපාංගයක් හෝ ගොනුවක් විය හැකිය. තවද මෙම වරායන් වෙනත් වරායන් සමඟ නම්‍යශීලීව සම්බන්ධ කළ හැක. ඔබට අපගේ pjsip හි කේතය දැකිය හැකිය ගබඩා. එහි ප්රතිඵලයක් වශයෙන්, යෝජනා ක්රමය පහත පරිදි විය. Asterisk සේවාදායකයේ, මම ලිනක්ස් සහ එම්බොක්ස් සඳහා ගිණුම් දෙකක් ආරම්භ කළෙමි. ඊළඟට, විධානය Embox මත ක්රියාත්මක වේ simple_pjsua_imported, එම්බොක්ස් සේවාදායකයේ ලියාපදිංචි වී ඇති අතර, ඉන් පසුව අපි ලිනක්ස් වෙතින් එම්බොක්ස් අමතන්නෙමු. සම්බන්ධතාවයේ මොහොතේදී, අපි Asterisk සේවාදායකයේ සම්බන්ධතාවය තහවුරු කර ඇති අතර, ටික වේලාවකට පසු අපට Embox හි Linux වෙතින් ශබ්දය ඇසෙන අතර, Linux වලදී අපි Embox වෙතින් වාදනය වන ගොනුව සුරකිමු.

එය QEMU මත වැඩ කිරීමෙන් පසුව, අපි STM32F7-Discovery වෙත පෝට් කිරීම වෙත යොමු විය. පළමු ගැටළුව නම්, රූපයේ ප්‍රමාණය සඳහා සක්‍රීය සම්පාදක ප්‍රශස්තිකරණය “-Os” නොමැතිව ඒවා 1 MB ROM වලට නොගැලපීමයි. ඒකයි අපි "-Os" ඇතුලත් කලේ. තවද, පැච් එක C ++ සඳහා සහය අක්‍රිය කර ඇත, එබැවින් එය අවශ්‍ය වන්නේ pjsua සඳහා පමණක් වන අතර අපි simple_pjsua භාවිතා කරමු.

තැබීමෙන් පසු සරල_pjsua, දැන් එය දියත් කිරීමට අවස්ථාවක් ඇති බව තීරණය කළේය. නමුත් මුලින්ම එය හඬ පටිගත කිරීම සහ නැවත ධාවනය කිරීම සමඟ කටයුතු කිරීමට අවශ්ය විය. ප්‍රශ්නය ලිවිය යුත්තේ කොතැනද යන්නයි. අපි බාහිර මතකය තෝරා ගත්තා - SDRAM (128 MB). ඔබට මෙය ඔබම උත්සාහ කළ හැකිය:

16000 Hz සංඛ්යාතයක් සහ තත්පර 10 ක කාලයක් සහිත ස්ටීරියෝ WAV නිර්මාණය කරයි:


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

අපට අහිමි වේ:


play -m C0000000

මෙහි ගැටළු දෙකක් තිබේ. codec එකත් එක්ක පලවෙනි එක - WM8994 භාවිතා කරලා තියෙන්නේ, ඒකට slot එකක් වගේ දෙයක් තියෙනවා, මේ slots 4ක් තියෙනවා ඉතින්, default විදියට, මේක configured කරලා නැත්නම්, audio play කරනකොට, slots හතරේම playback වෙනවා. . එබැවින්, 16000 Hz සංඛ්යාතයේදී, අපට 8000 Hz ලැබුණි, නමුත් 8000 Hz සඳහා, නැවත ධාවනය සරලව ක්රියා කළේ නැත. 0 සහ 2 කට්ට පමණක් තෝරා ගත් විට, එය කළ යුතු පරිදි ක්‍රියා කළේය. තවත් ගැටළුවක් වූයේ STM32Cube හි ශ්‍රව්‍ය අතුරුමුහුණතයි, එහි ශ්‍රව්‍ය ප්‍රතිදානය SAI (Serial Audio Interface) හරහා ශ්‍රව්‍ය ආදානය සමඟ සමමුහුර්තව ක්‍රියා කරයි (මට විස්තර තේරුණේ නැත, නමුත් ඔවුන් පොදු ඔරලෝසුවක් බෙදා ගන්නා බව පෙනේ ශ්‍රව්‍ය ප්‍රතිදානය ආරම්භ කර ඇත, ශ්‍රව්‍ය කෙසේ හෝ එයට ඇතුල් වේ). එනම්, ඔබට ඒවා වෙන වෙනම ක්‍රියාත්මක කළ නොහැක, එබැවින් අපි පහත දේ කළෙමු - ශ්‍රව්‍ය ආදානය සහ ශ්‍රව්‍ය ප්‍රතිදානය සැමවිටම ක්‍රියා කරයි (බාධා කිරීම් උත්පාදනය කිරීම ඇතුළුව). නමුත් පද්ධතිය තුළ කිසිවක් වාදනය නොවන විට, අපි හිස් බෆරයක් ශ්‍රව්‍ය ප්‍රතිදානයට ලිස්සා දමමු, සහ නැවත ධාවනය ආරම්භ වූ විට, අපි එය අවංකව පිරවීමට පටන් ගනිමු.

තවද, හඬ පටිගත කිරීමේදී ශබ්දය ඉතා නිහඬ බව අපට හමු විය. මෙයට හේතුව STM32F7-Discovery හි ඇති MEMS මයික්‍රොෆෝන 16000 Hz ට අඩු සංඛ්‍යාතවල කෙසේ හෝ හොඳින් ක්‍රියා නොකිරීමයි. ඒ නිසා 16000 Hz ආවත් අපි 8000 Hz සෙට් කරනවා. මෙය සිදු කිරීම සඳහා, එක් සංඛ්‍යාතයක් තවත් සංඛ්‍යාතයකට මෘදුකාංග පරිවර්තනයක් එක් කිරීම අවශ්‍ය විය.

ඊළඟට, මට RAM හි පිහිටා ඇති ගොඩේ ප්‍රමාණය වැඩි කිරීමට සිදු විය. අපගේ ගණනය කිරීම් වලට අනුව, pjsip 190 KB පමණ අවශ්ය වන අතර, අපට ඉතිරිව ඇත්තේ 100 KB පමණ වේ. මෙහිදී මට බාහිර මතකයක් භාවිතා කිරීමට සිදු විය - SDRAM (128 KB පමණ).

මෙම සියලු සංස්කරණ වලින් පසුව, මම ලිනක්ස් සහ එම්බොක්ස් අතර පළමු පැකේජ දුටුවෙමි, මට ශබ්දය ඇසුණි! නමුත් ශබ්දය භයානක විය, QEMU හි මෙන් කිසිසේත්ම සමාන නොවේ, කිසිවක් සොයාගත නොහැකි විය. ඊට පස්සේ අපි හිතුවා මොකක් වෙන්න පුළුවන්ද කියලා. නිදොස්කරණයෙන් පෙන්නුම් කළේ එම්බොක්ස් හට ශ්‍රව්‍ය බෆර පිරවීමට / බෑමට කාලය නොමැති බවයි. pjsip එක රාමුවක් සකසන අතරතුර, බෆර සැකසුම් සම්පූර්ණ කිරීම ගැන බාධා කිරීම් 2 ක් සිදු විය, එය ඕනෑවට වඩා වැඩිය. වේගය පිළිබඳ පළමු අදහස වූයේ සම්පාදක ප්‍රශස්තිකරණයයි, නමුත් එය දැනටමත් PJSIP හි ඇතුළත් කර ඇත. දෙවැන්න දෘඩාංග පාවෙන ලක්ෂ්‍යයකි, අපි ඒ ගැන කතා කළෙමු ලිපියයි. නමුත් ප්රායෝගිකව පෙන්වා දී ඇති පරිදි, FPU වේගයෙහි සැලකිය යුතු වැඩි වීමක් ලබා දුන්නේ නැත. ඊළඟ පියවර වූයේ නූල් වලට ප්රමුඛත්වය දීමයි. Embox හට විවිධ උපලේඛනගත කිරීමේ උපාය මාර්ග ඇති අතර, මම ප්‍රමුඛතා සඳහා සහය දක්වන සහ ශ්‍රව්‍ය ප්‍රවාහයන් ඉහළම ප්‍රමුඛතාවයට සකසන එකක් ඇතුළත් කර ඇත. මෙයද උදව් කළේ නැත.

ඊළඟ අදහස වූයේ අපි බාහිර මතකය සමඟ වැඩ කරන අතර බොහෝ විට ප්‍රවේශ වන ව්‍යුහයන් එහි ගෙන යාම සතුටක් බවයි. මම මූලික විශ්ලේෂණයක් කළේ කවදාද සහ කුමක් යටතේද යන්නයි සරල_pjsua මතකය වෙන් කරයි. 190 Kb වලින්, පළමු 90 Kb PJSIP හි අභ්‍යන්තර අවශ්‍යතා සඳහා වෙන් කර ඇති අතර ඒවා බොහෝ විට ප්‍රවේශ නොවන බව පෙනී ගියේය. තවද, පැමිණෙන ඇමතුමක් අතරතුර, pjsua_call_answer ශ්‍රිතය ලෙස හඳුන්වනු ලබන අතර, ඉන් පසුව එන සහ පිටතට යන රාමු සමඟ වැඩ කිරීම සඳහා බෆර වෙන් කරනු ලැබේ. එය තවමත් 100 Kb පමණ විය. ඊට පස්සේ අපි පහත දේ කළා. ඇමතුමේ මොහොත දක්වා, අපි දත්ත බාහිර මතකයේ තබමු. ඇමතුම ලැබුණු විගස, අපි වහාම ගොඩවල් වෙනත් එකක් සමඟ ප්රතිස්ථාපනය කරමු - RAM හි. මේ අනුව, සියලු "උණුසුම්" දත්ත වේගවත් හා වඩා පුරෝකථනය කළ හැකි මතකය වෙත මාරු විය.

එහි ප්රතිඵලයක් වශයෙන්, මේ සියල්ල එක්ව දියත් කිරීමට හැකි විය සරල_pjsua සහ ඔබගේ සේවාදායකය හරහා අමතන්න. ඉන්පසු sip.linphone.org වැනි වෙනත් සේවාදායකයන් හරහා.

සොයා ගැනීම්

එහි ප්රතිඵලයක් වශයෙන්, එය දියත් කිරීමට හැකි විය සරල_pjsua සේවාදායකය හරහා දෙපැත්තටම හඬ සම්ප්රේෂණය සමඟ. අමතර වශයෙන් වැය කරන ලද SDRAM 128 KB සමඟ ඇති ගැටළුව තරමක් බලවත් Cortex-M7 භාවිතා කිරීමෙන් විසඳා ගත හැකිය (උදාහරණයක් ලෙස, STM32F769NI RAM 512 KB සමඟ), නමුත් ඒ සමඟම, අපි තවමත් 256 වෙත පැමිණීමට බලාපොරොත්තු අත්හැර නැත. KB 🙂 යමෙකු උනන්දු වන්නේ නම් අපි සතුටු වන්නෙමු, නැතහොත් වඩා හොඳ, එය උත්සාහ කරන්න. සියලුම මූලාශ්‍ර, සුපුරුදු පරිදි, අපගේ ඇත ගබඩා.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න