STM32F7-Discovery वर SIP फोन

नमस्कार.

थोड्या वेळापूर्वी आम्ही लिहिले STM32F4-Discovery वर 1 MB ROM आणि 192 KB RAM सह SIP फोन लाँच करण्यात आम्ही कसे व्यवस्थापित केले याबद्दल) आधारित एम्बॉक्स. येथे असे म्हटले पाहिजे की ती आवृत्ती कमीतकमी होती आणि दोन फोन थेट सर्व्हरशिवाय आणि फक्त एकाच दिशेने व्हॉईस ट्रान्समिशनसह जोडलेले होते. म्हणून, आम्ही सर्व्हरद्वारे कॉलसह अधिक संपूर्ण फोन लॉन्च करण्याचा निर्णय घेतला, दोन्ही दिशांमध्ये व्हॉइस ट्रान्समिशन, परंतु त्याच वेळी शक्य तितक्या लहान मेमरी आकारात ठेवा.


फोनसाठी, अॅप्लिकेशन निवडण्याचा निर्णय घेण्यात आला simple_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-Discovery मेमरीमध्ये बसणार नाही हे स्पष्ट असल्याने, STM32F7-Discovery निवडण्यात आली. तिच्याकडे 1 MB फ्लॅश ड्राइव्ह आणि 256 KB RAM (+ 64 स्पेशल फास्ट मेमरी, जी आम्ही देखील वापरू). तसेच सर्व्हरद्वारे कॉलसाठी खूप काही नाही, परंतु आम्ही बसण्याचा प्रयत्न करण्याचा निर्णय घेतला.

स्वत: साठी सशर्त, कार्य अनेक टप्प्यात विभागले गेले:

  • QEMU वर PJSIP चालवत आहे. हे डीबगिंगसाठी सोयीचे होते, तसेच आमच्याकडे आधीपासूनच AC97 कोडेकसाठी समर्थन आहे.
  • QEMU आणि STM32 वर व्हॉइस रेकॉर्डिंग आणि प्लेबॅक.
  • अनुप्रयोग पोर्ट करणे simple_pjsua PJSIP कडून. हे तुम्हाला SIP सर्व्हरवर नोंदणी करण्यास आणि कॉल करण्यास अनुमती देते.
  • तुमचा स्वतःचा एस्टेरिस्क-आधारित सर्व्हर तैनात करा आणि त्यावर चाचणी करा, नंतर 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, एम्बॉक्स सर्व्हरवर नोंदणीकृत आहे, त्यानंतर आम्ही लिनक्सवरून एम्बॉक्सला कॉल करतो. कनेक्शनच्या क्षणी, आम्ही Asterisk सर्व्हरवर तपासतो की कनेक्शन स्थापित झाले आहे, आणि थोड्या वेळाने आम्हाला एम्बॉक्समध्ये लिनक्समधून आवाज ऐकू येईल आणि लिनक्समध्ये आम्ही एम्बॉक्समधून प्ले केलेली फाइल जतन करतो.

QEMU वर काम केल्यानंतर, आम्ही STM32F7-Discovery वर पोर्ट करण्यासाठी पुढे गेलो. पहिली समस्या अशी आहे की प्रतिमेच्या आकारासाठी सक्षम कंपाइलर ऑप्टिमायझेशन "-Os" शिवाय ते 1 MB ROM मध्ये बसत नाहीत. म्हणूनच आम्ही "-Os" समाविष्ट केले. पुढे, पॅचने C++ साठी समर्थन अक्षम केले आहे, म्हणून ते फक्त pjsua साठी आवश्यक आहे, आणि आम्ही simple_pjsua वापरतो.

ठेवल्यानंतर simple_pjsua, ठरवले की आता ते सुरू करण्याची संधी आहे. परंतु प्रथम आवाजाचे रेकॉर्डिंग आणि प्लेबॅक हाताळणे आवश्यक होते. प्रश्न असा आहे की लिहायचे कुठे? आम्ही बाह्य मेमरी निवडली - SDRAM (128 MB). आपण हे स्वतः प्रयत्न करू शकता:

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 आला तरीही. हे करण्यासाठी, तथापि, एका वारंवारतेचे दुसर्‍यामध्ये सॉफ्टवेअर रूपांतरण जोडणे आवश्यक होते.

पुढे, मला रॅममध्ये असलेल्या ढिगाचा आकार वाढवावा लागला. आमच्या गणनेनुसार, pjsip ला सुमारे 190 KB आवश्यक आहे आणि आमच्याकडे फक्त 100 KB शिल्लक आहे. येथे मला काही बाह्य मेमरी वापरावी लागली - SDRAM (सुमारे 128 KB).

या सर्व संपादनांनंतर, मी Linux आणि Embox मधील पहिले पॅकेज पाहिले आणि मला आवाज ऐकू आला! पण आवाज भयंकर होता, QEMU सारखाच नव्हता, काहीही काढणे अशक्य होते. मग काय प्रकरण असू शकते याचा विचार केला. डीबगिंगने दर्शविले की एम्बॉक्सकडे ऑडिओ बफर भरण्यासाठी / अनलोड करण्यासाठी वेळ नाही. pjsip एका फ्रेमवर प्रक्रिया करत असताना, बफर प्रक्रिया पूर्ण होण्याबद्दल 2 व्यत्यय येण्याची वेळ आली, जी खूप जास्त आहे. स्पीडचा पहिला विचार कंपाइलर ऑप्टिमायझेशन होता, परंतु तो आधीपासूनच PJSIP मध्ये समाविष्ट केला गेला होता. दुसरा हार्डवेअर फ्लोटिंग पॉइंट आहे, आम्ही त्याबद्दल बोललो लेख. परंतु सराव दर्शविल्याप्रमाणे, FPU ने वेगात लक्षणीय वाढ दिली नाही. पुढची पायरी म्हणजे थ्रेड्सना प्राधान्य देणे. एम्बॉक्समध्ये भिन्न शेड्युलिंग धोरणे आहेत आणि मी एक समाविष्ट केली आहे जी प्राधान्यांना समर्थन देते आणि ऑडिओ प्रवाह सर्वोच्च प्राधान्यावर सेट करते. याचाही उपयोग झाला नाही.

पुढची कल्पना अशी होती की आम्ही बाह्य मेमरीसह कार्य करत आहोत आणि तेथे खूप वेळा प्रवेश केलेल्या संरचना हलवणे चांगले होईल. मी केव्हा आणि कोणत्या अंतर्गत प्राथमिक विश्लेषण केले 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

एक टिप्पणी जोडा