STM32F7-Discovery मा SIP फोन

सबैलाई नमस्कार।

केही समयअघि हामीले लेखियो हामीले STM32F4-Discovery मा 1 MB ROM र 192 KB RAM भएको SIP फोन कसरी लन्च गर्न व्यवस्थित गर्यौं भन्ने बारेमा) Embox। यहाँ यो भन्नु पर्छ कि त्यो संस्करण न्यूनतम थियो र दुई फोनहरू सीधा सर्भर बिना र केवल एक दिशामा आवाज प्रसारणको साथ जडान गरिएको थियो। तसर्थ, हामीले सर्भर मार्फत कलको साथ थप पूर्ण फोन सुरु गर्ने निर्णय गर्‍यौं, दुबै दिशामा भ्वाइस ट्रान्समिशन, तर एकै समयमा सानो सम्भावित मेमोरी साइज भित्र राख्नुहोस्।


फोनको लागि, यो एउटा अनुप्रयोग छनौट गर्ने निर्णय गरियो simple_pjsua PJSIP पुस्तकालयको भागको रूपमा। यो एक न्यूनतम अनुप्रयोग हो जुन सर्भरमा दर्ता गर्न, कल प्राप्त गर्न र जवाफ दिन सक्छ। तल म यसलाई STM32F7-Discovery मा कसरी चलाउने भनेर तुरुन्तै विवरण दिनेछु।

कसरी चलाउने

  1. Embox कन्फिगर गर्दै
    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 माइक्रोफोनहरूमा बोल्नुहोस्। हामी लिनक्सबाट सिम्पल_pjsua, pjsua एप्लिकेसन मार्फत कल गर्छौं। ठीक छ, वा तपाइँ कुनै पनि अन्य प्रकारको लिनफोन प्रयोग गर्न सक्नुहुन्छ।

यो सबै हाम्रो मा वर्णन गरिएको छ विकी.

हामी कसरी त्यहाँ पुग्यौं

त्यसोभए, सुरुमा हार्डवेयर प्लेटफर्म छनौट गर्ने बारे प्रश्न उठ्यो। यो स्पष्ट थियो कि STM32F4-Discovery मेमोरीबाट फिट हुँदैन, STM32F7-Discovery छनोट गरियो। उनीसँग 1 MB फ्ल्यास ड्राइभ र 256 KB RAM छ (+ 64 विशेष द्रुत मेमोरी, जुन हामीले पनि प्रयोग गर्नेछौं)। साथै सर्भर मार्फत कलहरूको लागि धेरै होइन, तर हामीले फिट गर्न प्रयास गर्ने निर्णय गर्यौं।

आफ्नो लागि सशर्त, कार्य धेरै चरणहरूमा विभाजित गरिएको थियो:

  • QEMU मा PJSIP चलाउँदै। यो डिबगिङको लागि सुविधाजनक थियो, साथै हामीसँग पहिले नै त्यहाँ AC97 कोडेकको लागि समर्थन थियो।
  • QEMU र STM32 मा आवाज रेकर्डिङ र प्लेब्याक।
  • एउटा अनुप्रयोग पोर्ट गर्दै simple_pjsua PJSIP बाट। यसले तपाईंलाई SIP सर्भरमा दर्ता गर्न र कल गर्न अनुमति दिन्छ।
  • तपाईंको आफ्नै Asterisk-आधारित सर्भर प्रयोग गर्नुहोस् र यसमा परीक्षण गर्नुहोस्, त्यसपछि sip.linphone.org जस्ता बाह्यहरू प्रयास गर्नुहोस्।

Embox मा ध्वनि Portaudio मार्फत काम गर्दछ, जुन PISIP मा पनि प्रयोग गरिन्छ। QEMU मा पहिलो समस्याहरू देखा पर्यो - WAV ले 44100 Hz मा राम्रो खेलेको थियो, तर 8000 मा केहि स्पष्ट रूपमा गलत भयो। यो निस्कियो कि यो आवृत्ति सेटिङ को कुरा थियो - पूर्वनिर्धारित रूपमा यो उपकरण मा 44100 थियो, र यो कार्यक्रम परिवर्तन भएन।

यहाँ, सायद, यो एक सानो व्याख्या गर्न लायक छ कि ध्वनि कसरी सामान्य मा बजाइन्छ। ध्वनि कार्डलाई मेमोरीको टुक्रामा केही सूचकमा सेट गर्न सकिन्छ जसबाट तपाइँ प्ले गर्न वा पूर्वनिर्धारित फ्रिक्वेन्सीमा रेकर्ड गर्न चाहनुहुन्छ। बफर समाप्त भएपछि, एक अवरोध उत्पन्न हुन्छ र अर्को बफरसँग कार्यान्वयन जारी रहन्छ। तथ्य यो हो कि यी बफरहरू पहिले नै भरिनु पर्छ जब अघिल्लो बजाइन्छ। हामी STM32F7 मा यस समस्याको सामना गर्नेछौं।

अर्को, हामीले एउटा सर्भर भाडामा लियौं र यसमा Asterisk तैनात गर्यौं। किनकि यो धेरै डिबग गर्न आवश्यक थियो, तर म माइक्रोफोनमा धेरै कुरा गर्न चाहन्न, स्वचालित प्लेब्याक र रेकर्डिङ गर्न आवश्यक थियो। यो गर्नको लागि, हामीले simple_pjsua प्याच गर्यौं ताकि तपाईंले अडियो यन्त्रहरूको सट्टा फाइलहरू स्लिप गर्न सक्नुहुन्छ। PJSIP मा, यो एकदम सरल रूपमा गरिन्छ, किनकि तिनीहरूसँग पोर्टको अवधारणा छ, जुन कि त उपकरण वा फाइल हुन सक्छ। र यी पोर्टहरू लचिलो रूपमा अन्य पोर्टहरूमा जडान गर्न सकिन्छ। तपाइँ हाम्रो pjsip मा कोड हेर्न सक्नुहुन्छ भण्डारहरू। फलस्वरूप, योजना निम्नानुसार थियो। Asterisk सर्भरमा, मैले दुईवटा खाताहरू सुरु गरें - Linux र Embox को लागि। अर्को, आदेश Embox मा कार्यान्वयन गरिएको छ simple_pjsua_imported, Embox सर्भरमा दर्ता हुन्छ, त्यसपछि हामी Linux बाट Embox कल गर्छौं। जडानको क्षणमा, हामीले एस्टेरिस्क सर्भरमा जाँच गर्छौं कि जडान स्थापित भएको छ, र केहि समय पछि हामीले एम्बक्समा लिनक्सबाट ध्वनि सुन्नुपर्दछ, र लिनक्समा हामीले इम्बक्सबाट प्ले गरिएको फाइल बचत गर्छौं।

QEMU मा काम गरिसकेपछि, हामी STM32F7-Discovery मा पोर्ट गर्न लाग्यौं। पहिलो समस्या यो हो कि तिनीहरू छविको आकारको लागि सक्षम कम्पाइलर अप्टिमाइजेसन "-Os" बिना ROM को 1 MB मा फिट भएनन्। त्यसैले हामीले "-Os" समावेश गर्यौं। यसबाहेक, प्याचले C ++ को लागि समर्थन असक्षम पारेको छ, त्यसैले यो pjsua को लागि मात्र आवश्यक छ, र हामी simple_pjsua प्रयोग गर्छौं।

राखेपछि simple_pjsua, निर्णय गरे कि अब यसलाई सुरु गर्ने मौका छ। तर पहिले यो आवाज को रेकर्डिङ र प्लेब्याक संग सम्झौता गर्न आवश्यक थियो। प्रश्न कहाँ लेख्ने ? हामीले बाह्य मेमोरी - SDRAM (128 एमबी) रोज्यौं। तपाईं यसलाई आफैं प्रयास गर्न सक्नुहुन्छ:

16000 Hz को फ्रिक्वेन्सी र 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 हर्ट्ज आउँछ भने। यो गर्नको लागि, यद्यपि, एक फ्रिक्वेन्सीको अर्कोमा सफ्टवेयर रूपान्तरण थप्न आवश्यक थियो।

अर्को, मैले हिपको साइज बढाउनु पर्ने थियो, जुन RAM मा अवस्थित छ। हाम्रो गणना अनुसार, pjsip लाई लगभग 190 KB आवश्यक छ, र हामीसँग लगभग 100 KB मात्र बाँकी छ। यहाँ मैले केहि बाह्य मेमोरी - SDRAM (लगभग 128 KB) प्रयोग गर्नुपर्‍यो।

यी सबै सम्पादन पछि, मैले लिनक्स र Embox बीचको पहिलो प्याकेजहरू देखे, र मैले आवाज सुने! तर आवाज डरलाग्दो थियो, QEMU मा जस्तो थिएन, केहि पनि बनाउन असम्भव थियो। त्यसपछि के हुन सक्छ भनेर सोच्यौं। डिबगिङले देखाएको छ कि एम्बक्ससँग अडियो बफरहरू भर्ने / अनलोड गर्ने समय छैन। जब pjsip ले एउटा फ्रेम प्रशोधन गरिरहेको थियो, 2 अवरोधहरू बफर प्रशोधन पूरा गर्ने बारे समय थियो, जुन धेरै छ। गतिको लागि पहिलो विचार कम्पाइलर अप्टिमाइजेसन थियो, तर यो पहिले नै PJSIP मा समावेश गरिएको थियो। दोस्रो हार्डवेयर फ्लोटिंग पोइन्ट हो, हामीले यसको बारेमा कुरा गर्यौं लेख। तर अभ्यासले देखाएको अनुसार, FPU ले गतिमा उल्लेखनीय वृद्धि दिँदैन। अर्को चरण थ्रेडहरूलाई प्राथमिकता दिनु थियो। Embox सँग विभिन्न समयतालिका रणनीतिहरू छन्, र मैले प्राथमिकताहरूलाई समर्थन गर्ने र अडियो स्ट्रिमहरूलाई उच्चतम प्राथमिकतामा सेट गर्ने एउटा समावेश गरेको छु। यसले पनि मद्दत गरेन।

अर्को विचार यो थियो कि हामी बाह्य मेमोरीसँग काम गर्दैछौं र त्यहाँ धेरै पटक पहुँच गरिएका संरचनाहरू सार्न राम्रो हुनेछ। मैले कहिले र के अन्तर्गत प्रारम्भिक विश्लेषण गरें simple_pjsua मेमोरी आवंटित गर्दछ। यो बाहिरियो कि 190 Kb मध्ये, पहिलो 90 Kb PJSIP को आन्तरिक आवश्यकताहरूको लागि छुट्याइएको छ र तिनीहरू धेरै पटक पहुँच गर्दैनन्। थप रूपमा, आगमन कलको समयमा, pjsua_call_answer प्रकार्यलाई कल गरिन्छ, जसमा बफरहरू आगमन र बाहिर जाने फ्रेमहरूसँग काम गर्नको लागि आवंटित गरिन्छ। यो अझै लगभग 100 Kb थियो। र त्यसपछि हामीले निम्न गर्यौं। कलको क्षण सम्म, हामी डाटालाई बाह्य मेमोरीमा राख्छौं। कल हुने बित्तिकै, हामी तुरुन्तै हिपलाई अर्कोसँग बदल्छौं - RAM मा। यसरी, सबै "तातो" डाटा छिटो र अधिक अनुमानित मेमोरीमा स्थानान्तरण गरिएको थियो।

नतिजाको रूपमा, यी सबै सँगै यो सुरु गर्न सम्भव बनायो simple_pjsua र आफ्नो सर्भर मार्फत कल गर्नुहोस्। र त्यसपछि अन्य सर्भरहरू जस्तै sip.linphone.org मार्फत।

निष्कर्ष

फलस्वरूप, यो सुरु गर्न सम्भव भयो simple_pjsua सर्भर मार्फत दुबै दिशामा आवाज प्रसारणको साथ। थप रूपमा खर्च गरिएको 128 KB SDRAM को समस्या अलि बढी शक्तिशाली Cortex-M7 प्रयोग गरेर समाधान गर्न सकिन्छ (उदाहरणका लागि, 32 KB RAM भएको STM769F512NI), तर एकै समयमा, हामीले अझै पनि 256 मा पुग्ने आशा छोडेका छैनौं। KB 🙂 हामी खुसी हुनेछौं यदि कसैले चासो राख्छ भने, वा अझ राम्रो, प्रयास गर्नुहोस्। सबै स्रोतहरू, सामान्य रूपमा, हाम्रो मा छन् भण्डारहरू.

स्रोत: www.habr.com

एक टिप्पणी थप्न