STM32F7-டிஸ்கவரியில் 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 மைக்ரோஃபோன்களில் பேசவும் உள்ளது. நாங்கள் லினக்ஸிலிருந்து simple_pjsua, pjsua பயன்பாட்டின் மூலம் அழைக்கிறோம். சரி, அல்லது நீங்கள் வேறு எந்த வகை லின்ஃபோனையும் பயன்படுத்தலாம்.

இவை அனைத்தும் எங்கள் மீது விவரிக்கப்பட்டுள்ளன விக்கி.

நாங்கள் எப்படி அங்கு வந்தோம்

எனவே, வன்பொருள் தளத்தைத் தேர்ந்தெடுப்பது பற்றி ஆரம்பத்தில் கேள்வி எழுந்தது. STM32F4-டிஸ்கவரி நினைவகத்திலிருந்து பொருந்தாது என்பது தெளிவாகத் தெரிந்ததால், STM32F7-டிஸ்கவரி தேர்ந்தெடுக்கப்பட்டது. அவளிடம் 1 எம்பி ஃபிளாஷ் டிரைவ் மற்றும் 256 கேபி ரேம் (+ 64 ஸ்பெஷல் ஃபாஸ்ட் மெமரி, நாமும் பயன்படுத்துவோம்). சேவையகம் மூலம் அழைப்புகள் அதிகம் இல்லை, ஆனால் நாங்கள் பொருத்த முயற்சிக்க முடிவு செய்தோம்.

நிபந்தனையுடன், பணி பல நிலைகளாக பிரிக்கப்பட்டது:

  • QEMU இல் PJSIP ஐ இயக்குகிறது. பிழைத்திருத்தத்திற்கு இது வசதியானது, மேலும் AC97 கோடெக்கிற்கு ஏற்கனவே ஆதரவு இருந்தது.
  • QEMU மற்றும் STM32 இல் குரல் பதிவு மற்றும் பிளேபேக்.
  • ஒரு பயன்பாட்டை போர்ட்டிங் எளிய_pjsua PJSIP இலிருந்து. SIP சர்வரில் பதிவு செய்து அழைப்புகளை மேற்கொள்ள இது உங்களை அனுமதிக்கிறது.
  • உங்களின் சொந்த ஆஸ்டிரிக் அடிப்படையிலான சர்வரை வரிசைப்படுத்தி அதைச் சோதித்து, sip.linphone.org போன்ற வெளிப்புறங்களை முயற்சிக்கவும்

எம்பாக்ஸில் உள்ள ஒலி Portaudio மூலம் செயல்படுகிறது, இது PISIP இல் பயன்படுத்தப்படுகிறது. முதல் சிக்கல்கள் QEMU இல் தோன்றின - WAV 44100 Hz இல் நன்றாக விளையாடியது, ஆனால் 8000 இல் ஏதோ தவறாகிவிட்டது. இது அதிர்வெண்ணை அமைப்பதற்கான ஒரு விஷயம் என்று மாறியது - முன்னிருப்பாக இது சாதனத்தில் 44100 ஆக இருந்தது, மேலும் இது நிரல் ரீதியாக மாறவில்லை.

இங்கே, ஒருவேளை, ஒலி பொதுவாக எவ்வாறு இயக்கப்படுகிறது என்பதை கொஞ்சம் விளக்குவது மதிப்பு. ஒலி அட்டையை நீங்கள் இயக்க அல்லது பதிவு செய்ய விரும்பும் நினைவகத்திற்கு சில சுட்டிக்காட்டி அமைக்கலாம். இடையகம் முடிந்ததும், ஒரு குறுக்கீடு உருவாக்கப்பட்டு, அடுத்த இடையகத்துடன் செயல்படுத்தல் தொடர்கிறது. உண்மை என்னவென்றால், முந்தையது விளையாடும்போது இந்த இடையகங்கள் முன்கூட்டியே நிரப்பப்பட வேண்டும். STM32F7 இல் இந்தச் சிக்கலை மேலும் எதிர்கொள்வோம்.

அடுத்து, நாங்கள் ஒரு சேவையகத்தை வாடகைக்கு எடுத்து அதில் ஆஸ்டரிஸ்க்கைப் பயன்படுத்தினோம். நிறைய பிழைத்திருத்தம் செய்ய வேண்டியிருந்தது, ஆனால் நான் மைக்ரோஃபோனில் அதிகம் பேச விரும்பவில்லை என்பதால், தானியங்கி பின்னணி மற்றும் பதிவு செய்ய வேண்டியது அவசியம். இதைச் செய்ய, நாங்கள் simple_pjsua ஐ ஒட்டினோம், இதன் மூலம் நீங்கள் ஆடியோ சாதனங்களுக்குப் பதிலாக கோப்புகளை நழுவ விடலாம். PJSIP இல், இது மிகவும் எளிமையாக செய்யப்படுகிறது, ஏனெனில் அவை ஒரு போர்ட் என்ற கருத்தைக் கொண்டுள்ளன, இது ஒரு சாதனம் அல்லது கோப்பாக இருக்கலாம். மேலும் இந்த போர்ட்களை மற்ற போர்ட்களுடன் நெகிழ்வாக இணைக்க முடியும். எங்கள் pjsip இல் குறியீட்டைக் காணலாம் களஞ்சியங்கள். இதன் விளைவாக, திட்டம் பின்வருமாறு இருந்தது. ஆஸ்டரிஸ்க் சர்வரில், லினக்ஸ் மற்றும் எம்பாக்ஸ் ஆகிய இரண்டு கணக்குகளைத் தொடங்கினேன். அடுத்து, எம்பாக்ஸில் கட்டளை செயல்படுத்தப்படுகிறது simple_pjsua_imported, எம்பாக்ஸ் சர்வரில் பதிவு செய்கிறது, அதன் பிறகு லினக்ஸிலிருந்து எம்பாக்ஸை அழைக்கிறோம். இணைப்பின் தருணத்தில், இணைப்பு நிறுவப்பட்டுள்ளதா என்பதை ஆஸ்டரிஸ்க் சேவையகத்தில் சரிபார்க்கிறோம், சிறிது நேரத்திற்குப் பிறகு எம்பாக்ஸில் லினக்ஸிலிருந்து ஒலியைக் கேட்க வேண்டும், மேலும் எம்பாக்ஸிலிருந்து இயக்கப்படும் கோப்பை லினக்ஸில் சேமிக்கிறோம்.

இது QEMU இல் வேலை செய்த பிறகு, STM32F7-Discovery க்கு போர்ட்டிங்கிற்குச் சென்றோம். முதல் சிக்கல் என்னவென்றால், படத்தின் அளவுக்கான "-Os" என்ற செயலாக்கப்பட்ட கம்பைலர் ஆப்டிமைசேஷன் இல்லாமல் அவை 1 MB ரோமில் பொருந்தவில்லை. அதனால் தான் "-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-Discovery இல் உள்ள MEMS மைக்ரோஃபோன்கள் 16000 Hz க்கும் குறைவான அதிர்வெண்களில் எப்படியோ சரியாக வேலை செய்யாததே இதற்குக் காரணம். எனவே, 16000 ஹெர்ட்ஸ் வந்தாலும் 8000 ஹெர்ட்ஸ் அமைக்கிறோம். இதைச் செய்ய, ஒரு அதிர்வெண்ணின் மென்பொருளை மற்றொரு அதிர்வெண்ணுக்கு மாற்றுவது அவசியம்.

அடுத்து, ரேமில் அமைந்துள்ள குவியலின் அளவை நான் அதிகரிக்க வேண்டியிருந்தது. எங்கள் கணக்கீடுகளின்படி, pjsip க்கு சுமார் 190 KB தேவைப்படுகிறது, மேலும் எங்களிடம் 100 KB மட்டுமே உள்ளது. இங்கே நான் சில வெளிப்புற நினைவகத்தைப் பயன்படுத்த வேண்டியிருந்தது - SDRAM (சுமார் 128 KB).

இந்த திருத்தங்களுக்குப் பிறகு, லினக்ஸ் மற்றும் எம்பாக்ஸ் இடையேயான முதல் தொகுப்புகளைப் பார்த்தேன், ஒலியைக் கேட்டேன்! ஆனால் ஒலி பயங்கரமானது, QEMU இல் இருந்ததைப் போலவே இல்லை, எதையும் உருவாக்குவது சாத்தியமில்லை. பிறகு என்ன விஷயம் என்று யோசித்தோம். எம்பாக்ஸ் ஆடியோ பஃபர்களை நிரப்ப / இறக்குவதற்கு நேரமில்லை என்பதை பிழைத்திருத்தம் காட்டுகிறது. pjsip ஒரு ஃபிரேமைச் செயலாக்கும் போது, ​​இடையகச் செயலாக்கம் முடிவடைவதைப் பற்றி 2 குறுக்கீடுகள் ஏற்பட்டன, இது மிக அதிகம். வேகத்திற்கான முதல் எண்ணம் கம்பைலர் ஆப்டிமைசேஷன் ஆகும், ஆனால் இது ஏற்கனவே PJSIP இல் சேர்க்கப்பட்டுள்ளது. இரண்டாவது ஒரு வன்பொருள் மிதக்கும் புள்ளி, நாங்கள் அதைப் பற்றி பேசினோம் கட்டுரை. ஆனால் நடைமுறையில் காட்டப்பட்டுள்ளபடி, FPU வேகத்தில் குறிப்பிடத்தக்க அதிகரிப்பு கொடுக்கவில்லை. அடுத்த கட்டமாக நூல்களுக்கு முன்னுரிமை கொடுக்கப்பட்டது. எம்பாக்ஸ் வெவ்வேறு திட்டமிடல் உத்திகளைக் கொண்டுள்ளது, மேலும் முன்னுரிமைகளை ஆதரிக்கும் மற்றும் ஆடியோ ஸ்ட்ரீம்களை அதிக முன்னுரிமைக்கு அமைக்கும் ஒன்றைச் சேர்த்துள்ளேன். இதுவும் உதவவில்லை.

அடுத்த யோசனை என்னவென்றால், நாங்கள் வெளிப்புற நினைவகத்துடன் வேலை செய்கிறோம், அடிக்கடி அணுகக்கூடிய கட்டமைப்புகளை அங்கு நகர்த்துவது நல்லது. எப்பொழுது, எதன் கீழ் என்பதை நான் முதற்கட்ட பகுப்பாய்வு செய்தேன் எளிய_pjsua நினைவகத்தை ஒதுக்குகிறது. 190 Kb இல், முதல் 90 Kb PJSIP இன் உள் தேவைகளுக்காக ஒதுக்கப்பட்டுள்ளது மற்றும் அவை அடிக்கடி அணுகப்படுவதில்லை. மேலும், உள்வரும் அழைப்பின் போது, ​​pjsua_call_answer செயல்பாடு அழைக்கப்படுகிறது, இதில் உள்வரும் மற்றும் வெளிச்செல்லும் பிரேம்களுடன் பணிபுரிய இடையகங்கள் ஒதுக்கப்படுகின்றன. அது இன்னும் 100 Kb இருந்தது. பின்னர் நாங்கள் பின்வருவனவற்றைச் செய்தோம். அழைப்பின் தருணம் வரை, தரவை வெளிப்புற நினைவகத்தில் வைக்கிறோம். அழைப்பு வந்தவுடன், உடனடியாக குவியலை வேறொருவருடன் மாற்றுவோம் - ரேமில். இதனால், அனைத்து "சூடான" தரவுகளும் வேகமான மற்றும் கணிக்கக்கூடிய நினைவகத்திற்கு மாற்றப்பட்டன.

இதன் விளைவாக, இவை அனைத்தும் சேர்ந்து தொடங்குவதை சாத்தியமாக்கியது எளிய_pjsua உங்கள் சர்வர் மூலம் அழைக்கவும். பின்னர் sip.linphone.org போன்ற பிற சேவையகங்கள் மூலம்.

கண்டுபிடிப்புகள்

இதன் விளைவாக, ஏவ முடிந்தது எளிய_pjsua சேவையகம் மூலம் இரு திசைகளிலும் குரல் பரிமாற்றத்துடன். கூடுதலாக செலவழித்த 128 KB SDRAM இல் உள்ள சிக்கலை சற்று அதிக சக்தி வாய்ந்த Cortex-M7 (உதாரணமாக, STM32F769NI 512 KB RAM உடன்) பயன்படுத்தி தீர்க்க முடியும், ஆனால் அதே நேரத்தில், 256க்குள் செல்வதற்கான நம்பிக்கையை நாங்கள் இன்னும் கைவிடவில்லை. KB 🙂 யாராவது ஆர்வமாக இருந்தால் நாங்கள் மகிழ்ச்சியடைவோம், அல்லது இன்னும் சிறப்பாக முயற்சி செய்யுங்கள். எல்லா ஆதாரங்களும், வழக்கம் போல், எங்களிடம் உள்ளன களஞ்சியங்கள்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்