STM32F7-Discoveryдеги SIP телефону

Баарына салам.

Бир аз мурун биз жазган 32 МБ ROM жана 4 КБ оперативдүү эс тутум менен STM1F192-Discoveryде SIP телефонун кантип ишке киргизгенибиз жөнүндө) Embox. Бул жерде айта кетчү нерсе, ал версия минималдуу болгон жана эки телефонду түз серверсиз жана бир гана багытта үн берүү менен туташтырган. Ошондуктан, биз сервер аркылуу чалуу, эки тарапка үн берүү, бирок ошол эле учурда эстутумдун эң кичине көлөмүн сактоо менен толук телефонду ишке киргизүүнү чечтик.


Телефон үчүн колдонмону тандоо чечими кабыл алынды simple_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")
    

    кайда Server SIP сервери (мисалы, sip.linphone.org), колдонуучунун аты и купуя сөз - каттоо эсебинин колдонуучу аты жана сырсөз.

  3. Эмбоксту команда катары чогултуу жасоо. Бизде бар тактанын микропрограммасы жөнүндө wiki жана макала.
  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 микрофондоруна сүйлөшүү керек. Биз Linux'тан simple_pjsua, pjsua тиркемеси аркылуу чалабыз. Ооба, же сиз линфондун башка түрүн колдоно аласыз.

Мунун баары биздин сайтта баяндалат wiki.

Биз ал жакка кантип жеттик

Ошентип, алгач аппараттык платформаны тандоо жөнүндө суроо пайда болду. STM32F4-Discovery эстутумга туура келбей турганы анык болгондуктан, STM32F7-Discovery тандалды. Анын 1 МБ флеш-диск жана 256 КБ оперативдүү эс тутуму бар (+ 64 атайын тез эс тутуму, биз аны да колдонобуз). Ошондой эле сервер аркылуу чалуулар үчүн көп эмес, бирок биз туура келүүнү чечтик.

Шарттуу түрдө өздөрү үчүн тапшырма бир нече этаптарга бөлүнгөн:

  • QEMUде PJSIP иштеп жатат. Бул мүчүлүштүктөрдү оңдоо үчүн ыңгайлуу болгон, плюс бизде AC97 кодегин колдоо бар болчу.
  • QEMU жана STM32де үн жаздыруу жана ойнотуу.
  • Колдонмону көчүрүү simple_pjsua PJSIPден. Ал SIP серверинде катталып, чалууларды жасоого мүмкүндүк берет.
  • Өзүңүздүн жылдызчага негизделген сервериңизди орнотуп, аны сынап көрүңүз, андан кийин sip.linphone.org сыяктуу тышкы серверлерди сынап көрүңүз.

Embox ичиндеги үн Portaudio аркылуу иштейт, ал PISIPде да колдонулат. Биринчи көйгөйлөр QEMUде пайда болду - WAV 44100 Гцде жакшы ойноду, бирок 8000дө бир нерсе туура эмес болуп кетти. Көрсө, кеп жыштыкты орнотуу маселеси экен - демейки боюнча ал жабдууларда 44100 болгон жана бул программалык түрдө өзгөргөн эмес.

Бул жерде, балким, бул үн жалпы ойнолот, бир аз түшүндүрүү керек. Үн картасын сиз алдын ала белгиленген жыштыкта ​​ойноткуңуз же жазгыңыз келген эстутумдун бир бөлүгүнө көрсөткүчкө коюуга болот. Буфер аяктагандан кийин үзгүлтүк түзүлөт жана аткаруу кийинки буфер менен уланат. Чындыгында, бул буферлерди мурунку ойноп жатканда алдын ала толтуруу керек. Бул көйгөйгө STM32F7де дагы туш болобуз.

Андан кийин биз серверди ижарага алып, ага Жылдызчаны орноттук. Көптөгөн мүчүлүштүктөрдү оңдоо керек болгондуктан, микрофонго көп сүйлөгүм келген жок, автоматтык түрдө ойнотуу жана жаздыруу керек болчу. Бул үчүн, биз simple_pjsua түзмөгүн түздүк, андыктан сиз аудио түзмөктөрдүн ордуна файлдарды сүрүп алсаңыз болот. PJSIPде бул жөн эле жасалат, анткени алар порт түшүнүгүнө ээ, ал аппарат же файл болушу мүмкүн. Жана бул портторду ийкемдүү түрдө башка портторго туташтырууга болот. Кодду биздин pjsipден көрө аласыз репозиторийлер. Натыйжада, схема төмөнкүдөй болгон. Жылдызча серверинде мен эки каттоо эсебин баштадым - Linux жана Embox үчүн. Андан кийин, буйрук Embox боюнча аткарылат simple_pjsua_imported, Embox серверде регистрацияланат, андан кийин биз Linuxдан Embox деп атабыз. Туташуу учурунда биз Жылдызча серверинде байланыш орнотулганын текшеребиз жана бир аз убакыт өткөндөн кийин биз Embox ичинде Linux үнүн угушубуз керек, ал эми Linuxда Embox'тан ойнотулган файлды сактайбыз.

Ал QEMUде иштегенден кийин, биз STM32F7-Discoveryге өтүүгө өттүк. Биринчи көйгөй, алар сүрөттүн өлчөмү үчүн иштетилген компиляторду оптималдаштыруу "-Os" жок ROM 1 МБ туура келген эмес. Ошон үчүн “-Ос” дегенди киргиздик. Андан тышкары, патч C++ үчүн колдоону өчүргөн, ошондуктан ал pjsua үчүн гана керек жана биз simple_pjsua колдонобуз.

жайгаштыргандан кийин simple_pjsua, эми аны ишке киргизүүгө мүмкүнчүлүк бар деп чечти. Бирок адегенде үнүн жаздыруу жана ойнотуу менен алектениш керек болчу. Суроо кайда жазуу керек? Биз тышкы эстутумду тандап алдык - SDRAM (128 МБ). Сиз муну өзүңүз аракет кылсаңыз болот:

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дегидей эмес, эч нерсени аныктоо мүмкүн эмес болчу. Анан эмне болушу мүмкүн деп ойлодук. Мүчүлүштүктөрдү оңдоо Эмбокстун аудио буферлерди толтурууга/түшүрүүгө убактысы жок экенин көрсөттү. Pjsip бир кадрды иштетип жатканда, буферди иштетүү аяктагандан кийин 2 үзгүлтүккө учураган убакыт болгон, бул өтө көп. Ылдамдык үчүн биринчи ойлор компиляторду оптималдаштыруу болгон, бирок ал PJSIPке киргизилген. Экинчиси - аппараттык калкыма чекит, биз бул жөнүндө сүйлөштүк макала. Бирок практика көрсөткөндөй, FPU ылдамдыгын олуттуу жогорулатуу берген эмес. Кийинки кадам жиптерге артыкчылык берүү болду. Embox ар кандай пландаштыруу стратегияларына ээ жана мен артыкчылыктарды колдогон жана аудио агымдарды эң жогорку артыкчылыкка койгон стратегияны киргиздим. Бул да жардам берген жок.

Кийинки идея, биз тышкы эс тутум менен иштеп жатабыз жана ал жакка өтө көп кирүүчү структураларды жылдырсак жакшы болмок. Качан, эмненин астында алдын ала анализ жасадым simple_pjsua эс бөлөт. Көрсө, 190 Кбтын ичинен биринчи 90 Кб PJSIPдин ички муктаждыктары үчүн бөлүнгөн жана аларга көп кирүүгө болбойт. Андан ары, кирген чалуу учурунда pjsua_call_answer функциясы чакырылат, мында буферлер кирүүчү жана чыгуучу кадрлар менен иштөө үчүн бөлүнөт. Ал дагы эле 100 Кб эле. Анан биз төмөндөгүлөрдү жасадык. Чалуу учуруна чейин биз маалыматтарды тышкы эс тутумга жайгаштырабыз. Чалуу болгондон кийин, биз дароо үймөктү башкасына алмаштырабыз - RAMдагы. Ошентип, бардык "ысык" маалыматтар тезирээк жана болжолдуу эстутумга өткөрүлүп берилди.

Натыйжада, мунун баары чогуу ишке киргизүүгө мүмкүндүк берди simple_pjsua жана сервериңиз аркылуу чалыңыз. Анан sip.linphone.org сыяктуу башка серверлер аркылуу.

табылгалары

Натыйжада ишке киргизүүгө мүмкүн болду simple_pjsua сервер аркылуу эки багытта үн берүү менен. Кошумча сарпталган 128 КБ SDRAM көйгөйүн бир аз күчтүүрөөк Cortex-M7 (мисалы, 32 КБ оперативдүү эс тутуму бар STM769F512NI) колдонуу менен чечсе болот, бирок ошол эле учурда биз дагы эле 256га кирүү үмүтүн үзө элекпиз. KB 🙂 Эгер кимдир бирөө кызыкдар болсо, биз кубанабыз, же андан да жакшысы, аракет кылып көрүңүз. Бардык булактар, адаттагыдай эле, биздин репозиторийлер.

Source: www.habr.com

Комментарий кошуу