STM32F7-Discovery дээрх SIP утас

Бүгдээрээ сайн байцгаана уу.

Хэсэг хугацааны өмнө бид бичсэн 32 MB ROM, 4 KB RAM-тай STM1F192-Discovery дээр бид SIP утсыг хэрхэн гаргаж чадсан тухай) Embox. Энэ хувилбар нь хамгийн бага байсан бөгөөд хоёр утсыг сервергүйгээр шууд холбож, зөвхөн нэг чиглэлд дуу хоолойгоор дамжуулдаг гэж хэлэх ёстой. Тиймээс бид серверээр дамжуулан дуудлага хийх, дуу хоолойг хоёр чиглэлд дамжуулах, гэхдээ хамгийн бага санах ойн багтаамжтай илүү бүрэн утсыг гаргахаар шийдсэн.


Утасны хувьд програм сонгохоор шийдсэн энгийн_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. 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 дээр дуу бичлэг хийх, тоглуулах.
  • Програмыг зөөвөрлөх энгийн_pjsua PJSIP-ээс. Энэ нь танд SIP сервер дээр бүртгүүлж, дуудлага хийх боломжийг олгоно.
  • Өөрийн од дээр суурилсан серверийг байрлуулж, түүн дээр туршиж үзээд sip.linphone.org гэх мэт гадны серверүүдийг туршиж үзээрэй.

Embox дахь дуу нь PISIP-д бас ашиглагддаг Portaudio-ээр дамжуулан ажилладаг. Эхний асуудлууд QEMU дээр гарч ирэв - WAV 44100 Гц дээр сайн тоглосон боловч 8000 дээр ямар нэг зүйл буруу болсон. Энэ нь давтамжийг тохируулах асуудал байсан - анхдагчаар энэ нь тоног төхөөрөмжид 44100 байсан бөгөөд энэ нь программын хувьд өөрчлөгдөөгүй юм.

Энд магадгүй ерөнхийдөө дууг хэрхэн тоглуулж байгааг бага зэрэг тайлбарлах нь зүйтэй болов уу. Дууны картыг урьдчилан тогтоосон давтамжтайгаар тоглуулах эсвэл бичихийг хүссэн санах ойн хэсэг рүү заагч болгон тохируулж болно. Буфер дууссаны дараа тасалдал үүсч дараагийн буферээр гүйцэтгэл үргэлжилнэ. Үнэн хэрэгтээ эдгээр буферийг өмнөхийг нь тоглож байх үед урьдчилан бөглөх шаардлагатай. Бид цаашид STM32F7 дээр энэ асуудалтай тулгарах болно.

Дараа нь бид сервер түрээслээд түүн дээр Asterisk суулгасан. Маш их дибаг хийх шаардлагатай байсан ч микрофон руу нэг их ярихыг хүсээгүй тул автоматаар тоглуулах, бичлэг хийх шаардлагатай болсон. Үүнийг хийхийн тулд бид simple_pjsua засвар хийсэн бөгөөд ингэснээр та аудио төхөөрөмжийн оронд файлуудыг гулсуулж болно. PJSIP-д үүнийг маш энгийнээр хийдэг, учир нь тэдгээр нь төхөөрөмж эсвэл файл байж болох порт гэсэн ойлголттой байдаг. Мөн эдгээр портуудыг бусад портуудтай уян хатан холбож болно. Та кодыг манай pjsip дээрээс харж болно агуулахууд. Үүний үр дүнд схем нь дараах байдалтай байв. Asterisk сервер дээр би Линукс болон Embox-т зориулсан хоёр бүртгэл эхлүүлсэн. Дараа нь тушаалыг Embox дээр гүйцэтгэнэ simple_pjsua_импортолсон, Embox сервер дээр бүртгүүлдэг бөгөөд үүний дараа бид Линуксээс Embox гэж нэрлэдэг. Холболт хийх үед бид Asterisk сервер дээр холболт хийгдсэн эсэхийг шалгаж, хэсэг хугацааны дараа бид Linux-аас Embox-д байгаа дууг сонсож, Линукс дээр Embox-оос тоглуулсан файлыг хадгалдаг.

Энэ нь QEMU дээр ажиллаж дууссаны дараа бид STM32F7-Discovery руу шилжих болсон. Эхний асуудал бол зургийн хэмжээн дэх хөрвүүлэгчийн оновчтой хувилбар болох "-Os"-гүй бол тэдгээр нь 1 МБ ROM-д багтахгүй байсан явдал юм. Тиймээс бид "-Os"-ыг оруулсан. Цаашилбал, засвар нь C ++-ийн дэмжлэгийг идэвхгүй болгосон тул энэ нь зөвхөн pjsua-д хэрэгтэй бөгөөд бид simple_pjsua-г ашигладаг.

Байрлуулсны дараа энгийн_pjsua, одоо үүнийг эхлүүлэх боломж байна гэж шийдсэн. Гэхдээ эхлээд дууг бичих, тоглуулах асуудлыг шийдэх шаардлагатай байв. Асуулт бол хаана бичих вэ? Бид гадаад санах ойг сонгосон - SDRAM (128 MB). Та үүнийг өөрөө оролдож болно:

16000 Гц давтамжтай, 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 Гц-ээс доош давтамжтай ямар нэгэн байдлаар сайн ажилладаггүйтэй холбоотой юм. Тиймээс бид 16000 Гц ирсэн ч 8000 Гц-ийг тохируулсан. Үүнийг хийхийн тулд нэг давтамжийг нөгөө рүү хөрвүүлэх програм хангамжийг нэмэх шаардлагатай байв.

Дараа нь би RAM-д байрлах овоолгын хэмжээг нэмэгдүүлэх шаардлагатай болсон. Бидний тооцоолсноор pjsip нь ойролцоогоор 190 КБ шаардлагатай бөгөөд бидэнд ердөө 100 КБ л үлдсэн. Энд би зарим гадаад санах ой - SDRAM (ойролцоогоор 128 КБ) ашиглах шаардлагатай болсон.

Эдгээр бүх засварын дараа би Linux болон Embox-ын хоорондох анхны багцуудыг хараад дууг нь сонссон! Гэхдээ дуу нь аймшигтай байсан, QEMU-тэй огт адилгүй, юу ч ялгах боломжгүй байв. Дараа нь бид юу байж болох талаар бодсон. Дибаг хийх нь Embox-д аудио буферийг бөглөх / буулгах цаг байхгүй болохыг харуулсан. Pjsip нь нэг фрейм боловсруулж байх үед буфер боловсруулалтыг дуусгахтай холбоотой 2 тасалдал гарсан бөгөөд энэ нь хэтэрхий их юм. Хурдны талаархи хамгийн анхны бодол бол хөрвүүлэгчийн оновчлол байсан боловч PJSIP-д аль хэдийн орсон байсан. Хоёр дахь нь техник хангамжийн хөвөгч цэг бөгөөд бид энэ тухай ярьсан нийтлэл. Гэхдээ практикээс харахад FPU хурдыг төдийлөн нэмэгдүүлээгүй. Дараагийн алхам бол хэлхээг эрэмбэлэх явдал байв. Embox нь өөр өөр хуваарийн стратегитай бөгөөд би тэргүүлэх чиглэлийг дэмжиж, аудио урсгалыг хамгийн чухал ач холбогдолтой болгож тохируулсан стратегийг оруулсан. Энэ ч бас тус болсонгүй.

Дараагийн санаа бол бид гадаад санах ойтой ажиллаж байгаа бөгөөд маш олон удаа ханддаг бүтцийг тийш нь шилжүүлэх нь сайхан байх болно. Хэзээ, юуны дор байна вэ гэсэн урьдчилсан дүн шинжилгээ хийсэн энгийн_pjsua санах ойг хуваарилдаг. 190 Кб-аас эхний 90 Кб нь PJSIP-ийн дотоод хэрэгцээнд зориулагдсан байдаг бөгөөд тэдгээрт тийм ч их ханддаггүй. Цаашилбал, ирж буй дуудлагын үед pjsua_call_answer функц дуудагддаг бөгөөд энэ нь ирж буй болон гарч буй фреймүүдтэй ажиллахад буферүүдийг хуваарилдаг. Энэ нь 100 Kb орчим байсан. Тэгээд бид дараах зүйлийг хийсэн. Дуудлага хийх мөч хүртэл бид өгөгдлийг гадаад санах ойд байрлуулдаг. Дуудлага дуусмагц бид овоолгыг RAM-д нэн даруй өөр нэгээр солино. Тиймээс бүх "халуун" өгөгдлийг илүү хурдан бөгөөд урьдчилан таамаглах боломжтой санах ой руу шилжүүлэв.

Үүний үр дүнд энэ бүхэн хамтдаа хөөргөх боломжтой болсон энгийн_pjsua болон серверээр дамжуулан залгана уу. Дараа нь sip.linphone.org зэрэг бусад серверүүдээр дамжуулан.

үр дүн нь

Үүний үр дүнд хөөргөх боломжтой болсон энгийн_pjsua серверээр дамжуулан хоёр чиглэлд дуу хоолой дамжуулах боломжтой. Нэмэлт зарцуулсан 128 КБ SDRAM-тай холбоотой асуудлыг арай илүү хүчирхэг Cortex-M7 (жишээлбэл, 32 КБ RAM-тай STM769F512NI) ашиглан шийдэж болох боловч үүнтэй зэрэгцэн бид 256-д орох итгэл найдвараа алдаагүй хэвээр байна. KB 🙂 Хэрэв хэн нэгэн сонирхож байвал бид баяртай байх болно, эсвэл үүнийг туршиж үзээрэй. Бүх эх сурвалжууд ердийнх шигээ манайд байдаг агуулахууд.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх