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. ایک ٹیم کے طور پر 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 مائکروفونز میں بولنا باقی ہے۔ ہم لینکس سے درخواست 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 میں ساؤنڈ پورٹوڈیو کے ذریعے کام کرتا ہے، جو PISIP میں بھی استعمال ہوتا ہے۔ پہلے مسائل QEMU پر نمودار ہوئے - WAV 44100 Hz پر اچھی طرح سے کھیلا، لیکن 8000 پر کچھ واضح طور پر غلط ہو گیا۔ پتہ چلا کہ یہ فریکوئنسی سیٹ کرنے کا معاملہ تھا - پہلے سے طے شدہ طور پر یہ سامان میں 44100 تھا، اور یہ پروگرام کے لحاظ سے تبدیل نہیں ہوا۔

یہاں، شاید، یہ تھوڑا سا وضاحت کرنے کے قابل ہے کہ آواز عام طور پر کیسے چلائی جاتی ہے. ساؤنڈ کارڈ کو میموری کے ایک ٹکڑے پر کچھ پوائنٹر پر سیٹ کیا جا سکتا ہے جس سے آپ پہلے سے طے شدہ فریکوئنسی پر چلانا یا ریکارڈ کرنا چاہتے ہیں۔ بفر ختم ہونے کے بعد، ایک رکاوٹ پیدا ہوتی ہے اور اگلے بفر کے ساتھ عملدرآمد جاری رہتا ہے۔ حقیقت یہ ہے کہ ان بفروں کو پہلے سے بھرنے کی ضرورت ہے جبکہ پچھلا کھیلا جا رہا ہے۔ ہمیں STM32F7 پر مزید اس مسئلے کا سامنا کرنا پڑے گا۔

اگلا، ہم نے ایک سرور کرائے پر لیا اور اس پر نجمہ لگا دیا۔ چونکہ بہت کچھ ڈیبگ کرنا ضروری تھا، لیکن میں مائیکروفون میں زیادہ بات نہیں کرنا چاہتا تھا، اس لیے خودکار پلے بیک اور ریکارڈنگ کرنا ضروری تھا۔ ایسا کرنے کے لیے، ہم نے simple_pjsua کو پیچ کیا تاکہ آپ آڈیو ڈیوائسز کی بجائے فائلوں کو سلپ کر سکیں۔ PJSIP میں، یہ بالکل سادہ کیا جاتا ہے، کیونکہ ان کے پاس پورٹ کا تصور ہے، جو یا تو ایک ڈیوائس یا فائل ہو سکتی ہے۔ اور ان بندرگاہوں کو لچکدار طریقے سے دوسری بندرگاہوں سے جوڑا جا سکتا ہے۔ آپ ہمارے pjsip میں کوڈ دیکھ سکتے ہیں۔ ذخیرے. نتیجے کے طور پر، سکیم مندرجہ ذیل تھی. Asterisk سرور پر، میں نے دو اکاؤنٹس شروع کیے - لینکس کے لیے اور Embox کے لیے۔ اگلا، کمانڈ Embox پر عمل میں لایا جاتا ہے۔ simple_pjsua_imported، Embox سرور پر رجسٹرڈ ہے، جس کے بعد ہم لینکس سے Embox کو کال کرتے ہیں۔ کنکشن کے وقت، ہم Asterisk سرور پر چیک کرتے ہیں کہ کنکشن قائم ہو گیا ہے، اور تھوڑی دیر کے بعد ہمیں Embox میں Linux سے آواز سنائی دے گی، اور Linux میں ہم Embox سے چلائی جانے والی فائل کو محفوظ کرتے ہیں۔

QEMU پر کام کرنے کے بعد، ہم STM32F7-Discovery پر پورٹ کرنے کے لیے آگے بڑھے۔ پہلا مسئلہ یہ ہے کہ وہ تصویر کے سائز کے لیے فعال کمپائلر آپٹیمائزیشن "-Os" کے بغیر ROM کے 1 MB میں فٹ نہیں ہوتے تھے۔ اسی لیے ہم نے "-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 ہرٹز کی فریکوئنسی پر، ہمیں 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

نیا تبصرہ شامل کریں