СИП телефон на СТМ32Ф7-Дисцовери

Поздрав свима.

Малопре смо ми писали о томе како смо успели да покренемо СИП телефон на СТМ32Ф4-Дисцовери са 1 МБ РОМ-а и 192 КБ РАМ-а) на основу Ембок. Овде се мора рећи да је та верзија била минимална и повезивала два телефона директно без сервера и са преносом гласа само у једном правцу. Због тога смо одлучили да лансирамо комплетнији телефон са позивом преко сервера, преносом гласа у оба смера, али у исто време да задржимо најмању могућу величину меморије.


За телефон је одлучено да се изабере апликација симпле_пјсуа у склопу библиотеке ПЈСИП. Ово је минимална апликација која може да се региструје на серверу, прима и одговара на позиве. У наставку ћу одмах дати опис како га покренути на СТМ32Ф7-Дисцовери.

Како трчати

  1. Конфигурисање Ембок-а
    make confload-platform/pjsip/stm32f7cube
  2. Подесите потребан СИП налог у датотеци цонф/модс.цонфиг.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    где сервер је СИП сервер (на пример, сип.линпхоне.орг), корисничко име и лозинка - корисничко име и лозинка налога.

  3. Састављање Ембок-а као тима make (правити). О фирмверу плоче који имамо wiki и Чланак.
  4. Покрените команду „симпле_пјсуа_импортед“ у Ебок конзоли
    
    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. На крају, остаје да у аудио излаз убаците звучнике или слушалице, и говорите у два мала МЕМС микрофона поред екрана. Позивамо из Линук-а преко апликације симпле_пјсуа, пјсуа. Па, или можете користити било коју другу врсту линфона.

Све ово је описано на нашем wiki.

Како смо стигли тамо

Дакле, у почетку се поставило питање о избору хардверске платформе. Пошто је било јасно да СТМ32Ф4-Дисцовери неће стати из меморије, изабран је СТМ32Ф7-Дисцовери. Она има флеш диск од 1 МБ и 256 КБ РАМ-а (+ 64 специјалне брзе меморије, коју ћемо такође користити). Такође није много за позиве преко сервера, али смо одлучили да покушамо да се уклопимо.

Условно за себе, задатак је подељен у неколико фаза:

  • Покретање ПЈСИП-а на КЕМУ. Било је згодно за отклањање грешака, плус тамо смо већ имали подршку за АЦ97 кодек.
  • Снимање и репродукција гласа на КЕМУ и на СТМ32.
  • Преношење апликације симпле_пјсуа из ПЈСИП. Омогућава вам да се региструјете на СИП серверу и упућујете позиве.
  • Поставите свој сервер заснован на Астериск-у и тестирајте на њему, а затим испробајте екстерне као што је сип.линпхоне.орг

Звук у Ембок-у ради преко Портаудио-а, који се такође користи у ПИСИП-у. Први проблеми су се појавили на КЕМУ - ВАВ је добро свирао на 44100 Хз, али на 8000 нешто је очигледно пошло по злу. Испоставило се да је у питању подешавање фреквенције - подразумевано је у опреми била 44100, а то се програмски није променило.

Овде, можда, вреди мало објаснити како се звук уопште репродукује. Звучна картица се може подесити на неки показивач на комад меморије из којег желите да репродукујете или снимате на унапред одређеној фреквенцији. Након што се бафер заврши, генерише се прекид и извршење се наставља са следећим бафером. Чињеница је да ове бафере треба унапред попунити док се игра претходни. Са овим проблемом ћемо се суочити даље на СТМ32Ф7.

Затим смо изнајмили сервер и на њега поставили Астериск. Пошто је било потребно доста дебаговати, али нисам желео много да говорим у микрофон, било је потребно направити аутоматску репродукцију и снимање. Да бисмо то урадили, закрпили смо симпле_пјсуа тако да можете да убаците датотеке уместо аудио уређаја. У ПЈСИП-у се то ради прилично једноставно, пошто имају концепт порта, који може бити или уређај или датотека. И ови портови се могу флексибилно повезати са другим портовима. Код можете видети у нашем пјсип-у спремишта. Као резултат тога, шема је била следећа. На Астериск серверу сам покренуо два налога - за Линук и за Ембок. Затим се команда извршава на Ембок-у симпле_пјсуа_импортед, Ембок се региструје на серверу, након чега позивамо Ембок из Линукса. У тренутку конекције проверавамо на Астериск серверу да је веза успостављена и након неког времена би требало да чујемо звук из Линукса у Ембок-у, ау Линук-у чувамо фајл који се репродукује из Ембок-а.

Након што је прорадио на КЕМУ, прешли смо на пренос на СТМ32Ф7-Дисцовери. Први проблем је што се нису уклапали у 1 МБ РОМ-а без оптимизације компајлера „-Ос“ омогућене за величину слике. Зато смо укључили "-Ос". Даље, закрпа је онемогућила подршку за Ц++, тако да је потребна само за пјсуа, а ми користимо симпле_пјсуа.

Након постављања симпле_пјсуа, одлучио да сада постоји шанса да га покрене. Али прво је било потребно позабавити се снимањем и репродукцијом гласа. Питање је где писати? Изабрали смо екстерну меморију – СДРАМ (128 МБ). Можете и сами да пробате ово:

Прави стерео ВАВ са фреквенцијом од 16000 Хз и трајањем од 10 секунди:


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

Губимо:


play -m C0000000

Овде постоје два проблема. Користи се први са кодеком - ВМ8994, и он има тако нешто као слот, а ова слота има 4. Дакле, подразумевано, ако ово није конфигурисано, онда када се репродукује аудио, репродукција се дешава у сва четири слота . Дакле, на фреквенцији од 16000 Хз добили смо 8000 Хз, али за 8000 Хз репродукција једноставно није функционисала. Када су изабрани само слотови 0 и 2, радило је како треба. Други проблем је био аудио интерфејс у ​​СТМ32Цубе, у којем аудио излаз ради преко САИ (Сериал Аудио Интерфаце) синхроно са аудио улазом (нисам разумео детаље, али се испоставило да деле заједнички сат и када аудио излаз је иницијализован, звук је некако везан за његов улаз). То јест, не можете их покренути одвојено, па смо урадили следеће - аудио улаз и аудио излаз увек раде (укључујући и генерисање прекида). Али када се ништа не репродукује у систему, онда једноставно убацимо празан бафер у аудио излаз, а када репродукција почне, искрено почињемо да га попуњавамо.

Даље, наишли смо на чињеницу да је звук током снимања гласа био веома тих. То је због чињенице да МЕМС микрофони на СТМ32Ф7-Дисцовери некако не раде добро на фреквенцијама испод 16000 Хз. Стога смо поставили 16000 Хз, чак и ако дође 8000 Хз. Да би се то урадило, међутим, било је неопходно додати софтверску конверзију једне фреквенције у другу.

Затим сам морао да повећам величину гомиле која се налази у РАМ-у. Према нашим прорачунима, пјсип је захтевао око 190 КБ, а остало нам је само око 100 КБ. Овде сам морао да користим неку екстерну меморију – СДРАМ (око 128 КБ).

После свих ових измена, видео сам прве пакете између Линук-а и Ембок-а, и чуо сам звук! Али звук је био ужасан, нимало исти као на КЕМУ, било је немогуће било шта разазнати. Онда смо размишљали шта би могло бити у питању. Отклањање грешака је показало да Ембок једноставно нема времена да попуни / испразни аудио бафере. Док је пјсип обрађивао један оквир, 2 прекида су имала времена да се десе око завршетка обраде бафера, што је превише. Прва помисао на брзину била је оптимизација компајлера, али је већ била укључена у ПЈСИП. Други је хардверски покретни зарез, о томе смо разговарали Чланак. Али као што је пракса показала, ФПУ није дао значајно повећање брзине. Следећи корак је био постављање приоритета нити. Ембок има различите стратегије планирања, а ја сам укључио ону која подржава приоритете и поставља аудио стримове на највиши приоритет. Ни ово није помогло.

Следећа идеја је била да радимо са спољном меморијом и било би лепо да тамо преместимо структуре којима се приступа изузетно често. Урадио сам прелиминарну анализу када и под чиме симпле_пјсуа додељује меморију. Испоставило се да је од 190 Кб првих 90 Кб додељено за интерне потребе ПЈСИП-а и да им се не приступа често. Даље, током долазног позива, позива се функција пјсуа_цалл_ансвер, у којој се затим додељују бафери за рад са долазним и одлазним оквирима. И даље је било око 100 Кб. А онда смо урадили следеће. До тренутка позива податке смештамо у екстерну меморију. Чим позив, одмах замењујемо гомилу са другом - у РАМ-у. Тако су сви „врући“ подаци пребачени у бржу и предвидљивију меморију.

Као резултат, све ово заједно омогућило је лансирање симпле_пјсуа и позовите преко свог сервера. А затим преко других сервера као што је сип.линпхоне.орг.

Налази

Као резултат тога, било је могуће лансирати симпле_пјсуа са преносом гласа у оба смера преко сервера. Проблем са додатно потрошеним 128 КБ СДРАМ-а може се решити коришћењем нешто моћнијег Цортек-М7 (на пример, СТМ32Ф769НИ са 512 КБ РАМ-а), али у исто време још увек нисмо изгубили наду да ћемо ући у 256 КБ 🙂 Биће нам драго ако неко буде заинтересован, или још боље, пробајте. Сви извори, као и обично, налазе се у нашој спремишта.

Извор: ввв.хабр.цом

Додај коментар