STM32F7-Discovery жүйесіндегі SIP телефоны

Всем привет.

Біраз уақыт бұрын біз жазды 32 МБ ROM және 4 КБ жедел жады бар STM1F192-Discovery жүйесінде SIP телефонын қалай іске қосқанымыз туралы) негізінде Эмбокс. Бұл жерде айта кету керек, бұл нұсқа минималды болды және екі телефонды серверсіз және дауысты тек бір бағытта тікелей байланыстырды. Сондықтан, біз сервер арқылы қоңырау шалатын, екі бағытта дауысты таратумен толық телефонды іске қосуды шештік, бірақ сонымен бірге жадтың ең кішкентай өлшемін сақтаймыз.


Телефон үшін қолданбаны таңдау туралы шешім қабылданды 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")
    

    қайда сервер бұл 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_импортталған, Embox серверде тіркелген, содан кейін Linux жүйесінен Embox деп атаймыз. Қосылу сәтінде біз Жұлдызша серверінде қосылымның орнатылғанын тексереміз және біраз уақыттан кейін Linux жүйесінен Embox жүйесінде дыбыс естиміз, ал Linux жүйесінде Embox-тан ойнатылатын файлды сақтаймыз.

Ол QEMU-де жұмыс істегеннен кейін, біз STM32F7-Discovery портына көштік. Бірінші мәселе, олар кескін өлшеміне арналған «-Os» компиляторын оңтайландырусыз 1 МБ ROM-ға сәйкес келмеді. Сондықтан біз «-Os» қостық. Әрі қарай, патч 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 Гц орнаттық. Мұны істеу үшін бір жиілікті екіншісіне бағдарламалық түрлендіруді қосу қажет болды.

Әрі қарай, мен жедел жадта орналасқан үйіндінің өлшемін ұлғайтуға тура келді. Біздің есептеулеріміз бойынша, pjsip шамамен 190 КБ қажет, ал бізде шамамен 100 КБ қалды. Мұнда кейбір сыртқы жадты - SDRAM (шамамен 128 КБ) пайдалануға тура келді.

Осы өңдеулердің барлығынан кейін мен Linux пен Embox арасындағы алғашқы пакеттерді көрдім және дыбысты естідім! Бірақ дыбыс қорқынышты болды, QEMU-дегідей емес, ештеңені анықтау мүмкін болмады. Содан кейін біз не болуы мүмкін екенін ойладық. Түзету Embox-та аудио буферлерді толтыруға/босатуға уақыт жоқ екенін көрсетті. pjsip бір кадрды өңдеп жатқанда, буферді өңдеудің аяқталуына байланысты 2 үзу орын алды, бұл тым көп. Жылдамдық туралы бірінші ой компиляторды оңтайландыру болды, бірақ ол PJSIP-ке енгізілген. Екіншісі - аппараттық өзгермелі нүкте, біз бұл туралы айттық мақала. Бірақ тәжірибе көрсеткендей, FPU жылдамдықты айтарлықтай арттырмады. Келесі қадам ағындарға басымдық беру болды. Embox-тың әртүрлі жоспарлау стратегиялары бар және мен басымдықтарды қолдайтын және аудио ағындарды ең жоғары басымдыққа орнататын біреуін қостым. Бұл да көмектеспеді.

Келесі идея біз сыртқы жадпен жұмыс істеп жатырмыз және оған жиі қол жетімді құрылымдарды жылжыту жақсы болар еді. Мен қашан және ненің астында алдын ала талдау жасадым simple_pjsua жадты бөледі. 190 Кб-тың алғашқы 90 Кб-ы PJSIP-тің ішкі қажеттіліктеріне бөлінген және оларға жиі қол жетімді емес екені белгілі болды. Әрі қарай, кіріс қоңырау кезінде pjsua_call_answer функциясы шақырылады, онда кіріс және шығыс кадрлармен жұмыс істеу үшін буферлер бөлінеді. Ол әлі 100 Кб шамасында болды. Содан кейін біз келесі әрекеттерді орындадық. Қоңырау сәтіне дейін біз деректерді сыртқы жадқа орналастырамыз. Қоңырау шалған бойда біз үйіндіні басқасына ауыстырамыз - ЖЖҚ. Осылайша, барлық «ыстық» деректер жылдамырақ және болжамды жадқа ауыстырылды.

Нәтижесінде мұның бәрі бірге іске қосуға мүмкіндік берді simple_pjsua және сервер арқылы қоңырау шалыңыз. Содан кейін sip.linphone.org сияқты басқа серверлер арқылы.

қорытындылар

Нәтижесінде іске қосу мүмкін болды simple_pjsua сервер арқылы екі бағытта дауысты берумен. Қосымша жұмсалған 128 Кбайт SDRAM мәселесін сәл күштірек Cortex-M7 (мысалы, 32 КБ жедел жады бар STM769F512NI) пайдалану арқылы шешуге болады, бірақ сонымен бірге біз әлі де 256-ға жету үмітін үзген жоқпыз. КБ 🙂 Егер біреу қызықтырса, біз қуанамыз, Немесе жақсырақ, көріңіз. Барлық көздер, әдеттегідей, бізде репозиторийлер.

Ақпарат көзі: www.habr.com

пікір қалдыру