په STM32F7-Discovery کې د SIP تلیفون

ټولو ته سلام.

یو څه دمخه موږ لیکلی د دې په اړه چې موږ څنګه په STM32F4-Discovery کې د 1 MB ROM او 192 KB RAM سره د SIP تلیفون په لاره اچولو توان درلود) پر بنسټ. ایمبکس. دلته باید وویل شي چې دا نسخه لږترلږه وه او دوه تلیفونونه په مستقیم ډول له سرور پرته او یوازې په یو لوري کې د غږ لیږد سره وصل شوي. له همدې امله ، موږ پریکړه وکړه چې د سرور له لارې د زنګ سره یو بشپړ تلیفون پیل کړو ، په دواړو لوریو کې د غږ لیږد ، مګر په ورته وخت کې د حافظې ترټولو کوچنۍ اندازې کې وساتو.


د تلیفون لپاره، پریکړه وشوه چې یو غوښتنلیک غوره کړئ ساده_pjsua د PJSIP کتابتون د یوې برخې په توګه. دا یو لږ تر لږه غوښتنلیک دی چې کولی شي په سرور کې راجستر شي، تلیفونونه ترلاسه او ځواب ورکړي. لاندې به زه سمدلاسه توضیحات ورکړم چې دا څنګه په STM32F7-Discovery کې پرمخ وړم.

څنګه چلول

  1. د ایمبکس ترتیب کول
    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. په 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 کې د غږ ثبت کول او پلے بیک.
  • د غوښتنلیک پورټ کول ساده_pjsua د PJSIP څخه. دا تاسو ته اجازه درکوي چې د SIP سرور کې راجستر شئ او تلیفونونه وکړئ.
  • خپل د اسټریسک پراساس سرور ځای په ځای کړئ او په دې باندې ازموینه وکړئ ، بیا بهرني هڅه وکړئ لکه sip.linphone.org

په ایمبکس کې غږ د پورټوډیو له لارې کار کوي، کوم چې په PISIP کې هم کارول کیږي. لومړۍ ستونزې په QEMU کې څرګندې شوې - WAV په 44100 Hz کې ښه لوبه وکړه ، مګر په 8000 کې یو څه په روښانه ډول غلط شو. دا معلومه شوه چې دا د فریکونسۍ تنظیم کولو مسله وه - په ډیفالټ کې دا په تجهیزاتو کې 44100 وه ، او دا په برنامه کې بدلون نه و.

دلته، شاید، دا د یو څه تشریح کولو ارزښت لري چې څنګه په عمومي توګه غږ غږول کیږي. ساؤنډ کارت د حافظې یوې برخې ته ځینې پوائنټر ته ټاکل کیدی شي له کوم څخه چې تاسو غواړئ په یوه ټاکل شوي فریکونسۍ کې لوبې یا ثبت کړئ. د بفر پای ته رسیدو وروسته، یو مداخله رامینځته کیږي او اجرا کول د راتلونکي بفر سره دوام لري. حقیقت دا دی چې دا بفرونه باید مخکې له مخکې ډک شي پداسې حال کې چې پخوانی لوبه کیږي. موږ به د دې ستونزې سره نور هم په STM32F7 کې مخ شو.

بیا، موږ یو سرور کرایه کړ او په هغې کې یې ستوری ځای پرځای کړ. له هغه ځایه چې دا خورا ډیبګ کول اړین و ، مګر زه نه غواړم په مایکروفون کې ډیرې خبرې وکړم ، نو دا اړینه وه چې اتوماتیک پلے بیک او ریکارډ جوړ کړئ. د دې کولو لپاره ، موږ ساده_pjsua پیچ کړ ترڅو تاسو د آډیو وسیلو پرځای فایلونه سلیپ کړئ. په PJSIP کې، دا په ساده ډول ترسره کیږي، ځکه چې دوی د بندر مفهوم لري، کوم چې کیدای شي وسیله یا فایل وي. او دا بندرونه د انعطاف وړ نورو بندرونو سره وصل کیدی شي. تاسو کولی شئ زموږ په pjsip کې کوډ وګورئ ذخیره. د پایلې په توګه، سکیم په لاندې ډول و. د Asterisk سرور کې، ما دوه حسابونه پیل کړل - د لینکس لپاره او د ایمبکس لپاره. بیا، کمانډ په Embox کې اجرا کیږي simple_pjsua_imported، Embox په سرور کې راجستر شوی، له هغې وروسته موږ له لینکس څخه Embox ته زنګ وهو. د پیوستون په وخت کې، موږ د Asterisk سرور ته ګورو چې اړیکه جوړه شوې، او یو څه وروسته موږ باید په ایمبکس کې د لینکس څخه غږ واورو، او په لینکس کې موږ هغه فایل خوندي کوو چې د ایمبکس څخه پلی کیږي.

وروسته له هغه چې دا په QEMU کې کار وکړ، موږ STM32F7-Discovery ته پورټینګ ته لاړ. لومړۍ ستونزه دا ده چې دوی د عکس اندازې لپاره د فعال کمپیلر اصلاح کولو "-Os" پرته د ROM 1 MB کې نه و. له همدې امله موږ "-Os" شامل کړل. سربیره پردې ، پیچ د C ++ لپاره ملاتړ غیر فعال کړی ، نو دا یوازې د pjsua لپاره اړین دی ، او موږ ساده_pjsua کاروو.

د کیښودلو وروسته ساده_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).

د دې ټولو ترمیمونو وروسته ، ما د لینکس او ایمباکس ترمینځ لومړی کڅوړې ولیدلې ، او ما غږ واورېد! مګر غږ ډارونکی و ، په QEMU کې ورته نه و ، د هیڅ شی رامینځته کول ناممکن وو. بیا موږ فکر وکړ چې څه شی کیدی شي. Debugging وښودله چې Embox په ساده ډول د آډیو بفرونو ډکولو / پورته کولو لپاره وخت نلري. پداسې حال کې چې pjsip یو چوکاټ پروسس کوي، 2 مداخلې د بفر پروسس بشپړولو په اړه وخت درلود، کوم چې خورا ډیر دی. د سرعت لپاره لومړی فکر د کمپیلر اصلاح و ، مګر دا دمخه په PJSIP کې شامل شوی و. دوهم د هارډویر فلوټینګ ټکی دی ، موږ یې په اړه خبرې وکړې مقالې. مګر لکه څنګه چې تمرین ښودلی، FPU په سرعت کې د پام وړ زیاتوالی ندی ورکړی. بل ګام د تارونو لومړیتوب و. Embox د مهالویش مختلف ستراتیژیانې لري، او ما یو پکې شامل کړی چې د لومړیتوبونو ملاتړ کوي او د آډیو سټریمونه لوړ لومړیتوب ته ټاکي. دا هم مرسته ونه کړه.

بله نظریه دا وه چې موږ د بهرني حافظې سره کار کوو او دا به ښه وي چې هلته جوړښتونه حرکت وکړو چې ډیری وختونه ورته لاسرسی کیږي. ما یو ابتدايي تحلیل ترسره کړ چې کله او د څه لاندې ساده_pjsua حافظه تخصیص کوي. دا معلومه شوه چې د 190 Kb څخه، لومړی 90 Kb د PJSIP داخلي اړتیاو لپاره تخصیص شوي او ډیری وختونه ورته لاسرسی نه کیږي. برسېره پردې، د راتلونکی کال په جریان کې، pjsua_call_answer فنکشن ویل کیږي، په کوم کې چې بیا بفرونه د راتلونکو او وتلو چوکاټونو سره کار کولو لپاره تخصیص شوي. دا لاهم د 100 Kb په اړه و. او بیا موږ لاندې کار وکړ. د زنګ وهلو تر وخته پورې، موږ ډاټا په بهرني حافظه کې ځای په ځای کوو. هرڅومره ژر چې زنګ ووهئ ، موږ سمدلاسه ډډ د بل سره ځای په ځای کوو - په رام کې. په دې توګه، ټول "ګرم" ډاټا ګړندي او ډیر اټکل وړ حافظې ته لیږدول شوي.

د پایلې په توګه، دا ټول یوځای د پیل کولو امکان برابر کړ ساده_pjsua او د خپل سرور له لارې زنګ ووهئ. او بیا د نورو سرورونو له لارې لکه sip.linphone.org.

موندنو

د پایلې په توګه، دا ممکنه وه چې پیل شي ساده_pjsua د سرور له لارې په دواړو لورو کې د غږ لیږد سره. د اضافي مصرف شوي 128 KB SDRAM سره ستونزه د یو څه ډیر قوي Cortex-M7 په کارولو سره حل کیدی شي (د مثال په توګه ، STM32F769NI د 512 KB رام سره) ، مګر په ورته وخت کې ، موږ لاهم 256 ته د رسیدو امید نه دی پریښی. KB 🙂 موږ به خوښ شو که څوک علاقه لري، یا لا تر اوسه ښه، هڅه وکړئ. ټولې سرچینې، د معمول په څیر، زموږ کې دي ذخیره.

سرچینه: www.habr.com

Add a comment