هاتف SIP على STM32F7-Discovery

مرحبا.

منذ فترة نحن писали حول كيفية تمكنا من إطلاق هاتف SIP على STM32F4-Discovery مع ذاكرة قراءة فقط 1 ميجا بايت وذاكرة وصول عشوائي 192 كيلو بايت) استنادًا إلى امبوكس. هنا يجب أن يقال أن هذا الإصدار كان ضئيلًا ومتصلًا بهاتفين مباشرة بدون خادم وبإرسال صوتي في اتجاه واحد فقط. لذلك ، قررنا إطلاق هاتف أكثر اكتمالاً بمكالمة من خلال الخادم ، ونقل صوتي في كلا الاتجاهين ، ولكن في نفس الوقت احتفظ بأصغر حجم ذاكرة ممكن.


بالنسبة للهاتف ، تقرر اختيار أحد التطبيقات simple_pjsua كجزء من مكتبة PJSIP. هذا هو تطبيق بسيط يمكنه التسجيل على الخادم واستقبال المكالمات والرد عليها. أدناه سأقدم على الفور وصفًا لكيفية تشغيله على STM32F7-Discovery.

كيف تركض

  1. تكوين Embox
    make confload-platform/pjsip/stm32f7cube
  2. قم بتعيين حساب SIP المطلوب في ملف conf / mods.config.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    حيث الخادم هو خادم SIP (على سبيل المثال ، sip.linphone.org) ، اسم المستخدم и كلمه السر - اسم المستخدم وكلمة المرور للحساب.

  3. تجميع Embox كفريق جعل. حول البرامج الثابتة مجلس لدينا вики و مقالة.
  4. قم بتشغيل الأمر “simple_pjsua_imported” في وحدة التحكم Embox
    
    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 ميجا بايت و 256 كيلو بايت من ذاكرة الوصول العشوائي (+ 64 ذاكرة سريعة خاصة ، والتي سنستخدمها أيضًا). أيضًا ليس كثيرًا للمكالمات عبر الخادم ، لكننا قررنا محاولة التوافق.

تم تقسيم المهمة بشكل مشروط إلى عدة مراحل:

  • تشغيل PJSIP على QEMU. كان مناسبًا للتصحيح ، بالإضافة إلى أننا حصلنا بالفعل على دعم لبرنامج الترميز AC97 هناك.
  • تسجيل الصوت وتشغيله على QEMU وعلى STM32.
  • نقل تطبيق simple_pjsua من PJSIP. يسمح لك بالتسجيل في خادم SIP وإجراء المكالمات.
  • انشر الخادم الخاص بك المستند إلى النجمة واختبره ، ثم جرب الخوادم الخارجية مثل sip.linphone.org

يعمل Sound in Embox من خلال Portaudio ، والذي يستخدم أيضًا في PISIP. ظهرت المشكلات الأولى على QEMU - لعبت WAV أداءً جيدًا عند 44100 هرتز ، ولكن عند 8000 حدث خطأ ما بشكل واضح. اتضح أن الأمر يتعلق بتعيين التردد - افتراضيًا كان 44100 في الجهاز ، وهذا لم يتغير برمجيًا.

هنا ، ربما ، من المفيد أن نوضح قليلاً كيف يتم تشغيل الصوت بشكل عام. يمكن ضبط بطاقة الصوت على مؤشر ما على قطعة من الذاكرة تريد تشغيلها أو تسجيلها بتردد محدد مسبقًا. بعد انتهاء المخزن المؤقت ، يتم إنشاء مقاطعة ويستمر التنفيذ مع المخزن المؤقت التالي. الحقيقة هي أن هذه المخازن المؤقتة تحتاج إلى أن يتم ملؤها مسبقًا أثناء تشغيل السابق. سنواجه هذه المشكلة أكثر على STM32F7.

بعد ذلك ، استأجرنا خادمًا ونشرنا علامة النجمة عليه. نظرًا لأنه كان من الضروري تصحيح الأخطاء كثيرًا ، لكنني لم أرغب في التحدث في الميكروفون كثيرًا ، كان من الضروري إجراء التشغيل والتسجيل التلقائي. للقيام بذلك ، قمنا بتصحيح simple_pjsua بحيث يمكنك إخراج الملفات بدلاً من أجهزة الصوت. في PJSIP ، يتم ذلك بكل بساطة ، نظرًا لأن لديهم مفهوم المنفذ ، والذي يمكن أن يكون جهازًا أو ملفًا. ويمكن توصيل هذه المنافذ بمرونة بمنافذ أخرى. يمكنك رؤية الكود في ملف pjsip الخاص بنا مستودعات. نتيجة لذلك ، كان المخطط على النحو التالي. على خادم Asterisk ، بدأت حسابين - لنظامي Linux و Embox. بعد ذلك ، يتم تنفيذ الأمر على Embox simple_pjsua_imported، Embox مسجل على الخادم ، وبعد ذلك نسمي Embox من Linux. في لحظة الاتصال ، نتحقق من خادم Asterisk من أن الاتصال قد تم إنشاؤه ، وبعد فترة من الوقت يجب أن نسمع صوتًا من Linux في Embox ، وفي Linux نحفظ الملف الذي يتم تشغيله من Embox.

بعد أن عملت على QEMU ، انتقلنا إلى النقل إلى STM32F7-Discovery. المشكلة الأولى هي أنها لا تتناسب مع 1 ميغابايت من ذاكرة القراءة فقط بدون تمكين تحسين المترجم "-Os" لحجم الصورة. لهذا السبب قمنا بتضمين "-Os". علاوة على ذلك ، تم تعطيل دعم التصحيح لـ C ++ ، لذلك فهو مطلوب فقط لـ pjsua ، ونحن نستخدم simple_pjsua.

بعد وضعه simple_pjsua، قررت أن هناك الآن فرصة لإطلاقه. لكن كان من الضروري أولاً التعامل مع تسجيل الصوت وتشغيله. السؤال هو أين تكتب؟ اخترنا الذاكرة الخارجية - SDRAM (128 ميجابايت). يمكنك أن تجرب هذا بنفسك:

ينشئ WAV استريو بتردد 16000 هرتز ومدة 10 ثوانٍ:


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

نخسر:


play -m C0000000

هناك مشكلتان هنا. الأول مع برنامج الترميز - يتم استخدام WM8994 ، وله ما يسمى بفتحة ، وهناك 4 من هذه الفتحات. لذلك ، بشكل افتراضي ، إذا لم يتم تكوين هذا ، فعند تشغيل الصوت ، يحدث التشغيل في جميع الفتحات الأربع . لذلك ، بتردد 16000 هرتز ، تلقينا 8000 هرتز ، ولكن بالنسبة إلى 8000 هرتز ، لم يعمل التشغيل ببساطة. عندما تم تحديد الفتحتين 0 و 2 فقط ، فقد عملت كما ينبغي. كانت هناك مشكلة أخرى تتمثل في واجهة الصوت في STM32Cube ، حيث يعمل إخراج الصوت عبر SAI (واجهة الصوت التسلسلي) بشكل متزامن مع إدخال الصوت (لم أفهم التفاصيل ، لكن اتضح أنهم يشتركون في ساعة مشتركة ومتى يتم تهيئة إخراج الصوت ، ويتم إرفاق الصوت بطريقة ما بمدخله). أي أنه لا يمكنك تشغيلها بشكل منفصل ، لذلك قمنا بما يلي - يعمل إدخال الصوت وإخراج الصوت دائمًا (بما في ذلك المقاطعات التي يتم إنشاؤها). ولكن عندما لا يتم تشغيل أي شيء في النظام ، فإننا نقوم ببساطة بإدخال مخزن مؤقت فارغ في إخراج الصوت ، وعندما يبدأ التشغيل ، نبدأ بصدق في ملئه.

علاوة على ذلك ، واجهنا حقيقة أن الصوت أثناء التسجيل الصوتي كان هادئًا للغاية. هذا يرجع إلى حقيقة أن ميكروفونات MEMS على STM32F7-Discovery بطريقة ما لا تعمل بشكل جيد عند ترددات أقل من 16000 هرتز. لذلك ، قمنا بتعيين 16000 هرتز ، حتى لو جاء 8000 هرتز. للقيام بذلك ، على الرغم من ذلك ، كان من الضروري إضافة تحويل برنامج من تردد إلى آخر.

بعد ذلك ، اضطررت إلى زيادة حجم الكومة الموجودة في ذاكرة الوصول العشوائي. وفقًا لحساباتنا ، تطلب pjsip حوالي 190 كيلوبايت ، ولم يتبق لدينا سوى حوالي 100 كيلوبايت. هنا اضطررت إلى استخدام بعض الذاكرة الخارجية - SDRAM (حوالي 128 كيلوبايت).

بعد كل هذه التعديلات ، رأيت الحزم الأولى بين Linux و Embox ، وسمعت الصوت! لكن الصوت كان فظيعًا ، وليس كما هو الحال في QEMU ، كان من المستحيل إخراج أي شيء. ثم فكرنا فيما يمكن أن يكون الأمر. أظهر تصحيح الأخطاء أن Embox ليس لديه الوقت لملء / تفريغ مخازن الصوت. أثناء معالجة pjsip لإطار واحد ، كان هناك وقت لمقاطعتين عند اكتمال معالجة المخزن المؤقت ، وهو عدد كبير جدًا. كانت الفكرة الأولى للسرعة هي تحسين المترجم ، ولكن تم تضمينه بالفعل في PJSIP. والثاني هو نقطة عائمة للأجهزة ، تحدثنا عنها في مقالة. ولكن كما أظهرت الممارسة ، لم تقدم FPU زيادة كبيرة في السرعة. كانت الخطوة التالية هي تحديد أولويات المواضيع. لدى Embox استراتيجيات جدولة مختلفة ، وقد قمت بتضمين واحدة تدعم الأولويات وتعيين تدفقات الصوت على أعلى أولوية. هذا لم يساعد أيضا.

كانت الفكرة التالية هي أننا نعمل مع ذاكرة خارجية وسيكون من الجيد نقل الهياكل التي يتم الوصول إليها كثيرًا. لقد أجريت تحليلًا أوليًا لوقت وتحت ماذا simple_pjsua يخصص الذاكرة. اتضح أنه من أصل 190 كيلوبايت ، تم تخصيص أول 90 كيلوبايت للاحتياجات الداخلية لبرنامج PJSIP ولا يتم الوصول إليها كثيرًا. علاوة على ذلك ، أثناء مكالمة واردة ، يتم استدعاء وظيفة pjsua_call_answer ، حيث يتم تخصيص المخازن المؤقتة للعمل مع الإطارات الواردة والصادرة. كان لا يزال حوالي 100 كيلو بايت. وبعد ذلك قمنا بما يلي. حتى لحظة المكالمة ، نضع البيانات في الذاكرة الخارجية. بمجرد المكالمة ، نقوم على الفور باستبدال الكومة بأخرى - في ذاكرة الوصول العشوائي. وبالتالي ، تم نقل جميع البيانات "الساخنة" إلى ذاكرة أسرع وأكثر قابلية للتنبؤ.

نتيجة لذلك ، جعل كل هذا معًا من الممكن الإطلاق simple_pjsua واتصل من خلال الخادم الخاص بك. ثم من خلال خوادم أخرى مثل sip.linphone.org.

النتائج

نتيجة لذلك ، كان من الممكن الإطلاق simple_pjsua مع الإرسال الصوتي في كلا الاتجاهين من خلال الخادم. يمكن حل مشكلة 128 كيلوبايت من SDRAM المستنفدة بشكل إضافي باستخدام Cortex-M7 أقوى قليلاً (على سبيل المثال ، STM32F769NI مع 512 كيلوبايت من ذاكرة الوصول العشوائي) ، ولكن في الوقت نفسه ، ما زلنا لم نفقد الأمل في الوصول إلى 256 KB 🙂 سنكون سعداء إذا كان شخص ما مهتمًا ، أو الأفضل من ذلك ، جربه. جميع المصادر ، كالعادة ، موجودة في موقعنا مستودعات.

المصدر: www.habr.com

إضافة تعليق