Ну можно занять их "своими" переменными https://gcc.gnu.org/onlinedocs/gcc/Local-Registe...egister-Variables А нафейхуа это нужно? Добавлено: Sun Oct 17, 2021 10:18 am |
когда арм уходит в прерывания, то перед процедурой он ныкает в стек R0-R3 и R12, а после выполнения процедуры достаёт эти регистры обратно и возвращается к выполненной программе. Хотелось чтоб обработчик не трогал регитры, кроме заныканных R0-R3 и R12. У меня частота прерываний 200к в секунду и уже сожрано 80% машинного времени. Да, большего из проца видимо уже не выжать. Простое измерение координат с четырёх резольверов пожалуй хватит Но с генерацией квадратурных импульсов имитации энкодеров костыль - импульсы выдаются пачками с частотой пачек 2 кГц и частотой импульсов до 50 кГц. На более равномерное распределение импульсов у меня просто нет машинных ресурсов. Добавлено: Sun Oct 17, 2021 12:27 pm |
такой кунг-фу только ввиде ассемблера. и сам уже пользую какие нужно регистры. Добавлено: Sun Oct 17, 2021 2:02 pm |
Электромонтёр писал(а): Но с генерацией квадратурных импульсов имитации энкодеров костыль - А кроме оцифровки резольверов там что-то есть? Может туда плисину воткнуть, и будет все параллельно и перпендикулярно? Добавлено: Sun Oct 17, 2021 2:37 pm |
Так резольвер выдает аналоговый сигнал, для ПЛИС нужен будет АЦП (на два канала). И на возбуждение резольвера нужно генерить переменку. Добавлено: Sun Oct 17, 2021 2:47 pm |
Если я не ошибаюсь, то нужно сказать компилятору что функция - обработчик прерывания, тогда он не будет трогать регистры общего назначения https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Fun...er-functions-2886 правда хз будет ли это работать в данном случае... Добавлено: Sun Oct 17, 2021 3:15 pm |
N1X писал(а): А кроме оцифровки резольверов там что-то есть? Оцифровка резольверов и герерация квадратурных импульсов. Вывод на ЖКИ в фоне. N1X писал(а): Может туда плисину воткнуть, и будет все параллельно и перпендикулярно? Да вроде влез в имеющиеся времянки. Правда, 85% процессорного времени в среднем, в пике до 100%, но проц успевает (по осциллографу). Однако, из К1986ВЕ92QI в плане быстродействия выжато почти всё. Николай писал(а): такой кунг-фу только ввиде ассемблера Чёт пока не совсем ясно как на армах ассемблерить. Пока ассемблерные примеры или не собираются или завешивают ядро. Добавлено: Sun Oct 17, 2021 3:29 pm |
Электромонтёр писал(а): стек R0-R3 и R12 убери все "push {r0-r12}\n\t" и достань все "pop {r0-r12}\n\t" __asm__( "push {r0-r12}\n\t" : :: "r0"//,"r1","r2","r3","r4"//,"r5","r6","r7","r8","r9","r10","r11","r12" -- это говорит компилятору что нулевой регистр не использовать. те что открыты, те и не использовать. но все нельзя, иначе он тебя пошлет, ему-то надо как то дальше работать ) Добавлено: Sun Oct 17, 2021 5:50 pm |
А как gcc заставить для cortex-m3 расположить функцию в оперативке? объявлял перед функцией
Добавлено: Sat Oct 23, 2021 1:58 pm |
__ramfunc void Yadro_mem_init(void) { } это в iar. пишем в .с void Yadro_mem_init() __attribute__ ((section(".bootDNAcore"))); а вот так в sdk vivado и пишем в хидере .h Добавлено: Sat Oct 23, 2021 4:34 pm |
Эээ, не совсем понятно, а как функция из флещь копируется в ОЗУ? Добавлено: Sat Oct 23, 2021 5:42 pm |
я уж сейчас не вспомню. но компилятор умный. там только области памяти надо правильно задать. Добавлено: Sat Oct 23, 2021 6:05 pm |
Электромонтёр писал(а): как gcc Warlock_Wolf писал(а): это в iar Отлично поговорили ))) Добавлено: Sat Oct 23, 2021 7:38 pm |
N1X писал(а): Отлично поговорили ))) NIX, у меня CooCox и GCC, но советы для Jar не заработали. Добавлено: Sat Oct 23, 2021 8:25 pm |
Ну так правильно, иар использует свой проприетарный компилятор... Добавлено: Sat Oct 23, 2021 9:14 pm |
так это путь. а дальше поискать в инете. вот для гцц. из инета. void foo (void) __attribute__ ((section(".ramfunc"))); __attribute__ ((section(".data"))); - это для констант размещенных в RAM и я написал, надо празбираться с областями памяти. .ramfunc .data .... какая под константы, какая под переменные. посмотреть адреса прописанные. посмотреть пдф на железку, что куда писать. в xilinx sdk походу gcc . там целый фаил lscript.ld который занимается распределением памяти. это данные для линкера и компилятора. Добавлено: Sat Oct 23, 2021 11:57 pm |
Warlock_Wolf писал(а): __ramfunc GCC ругается на __ramfunc __attribute__ ((section(".ramfunc"))) не помогает Добавлено В GCC... ...отсутствует флаг для получения копии секции. Дополнить LD скрипт <<магическими строками>> так же не удастся. Ладно, отложим покамест. Добавлено: Sun Oct 24, 2021 4:33 am |
По просьбе Миландра тиснул статейку на Хабре. Добавлено: Sun Nov 21, 2021 7:38 pm |
Не вкурю, можно ли (и каким образом) реализовать на AVR аппаратный ШИМ на два канала, на таймере "1" с максимальным счетом (TOP) = 0хFFFF? Почему в базовом варианте для режима ШИМ максимальный счет = 0x03FF, когда счетчик 16-битный? Добавлено: Fri Feb 04, 2022 7:46 pm |
полуаппаратно. со сменой состояния пина в прерывании Добавлено: Fri Feb 04, 2022 11:14 pm |
МК atmega328p, Таймер-1 установлен в Нормальный режим (TOP=0xFFFF). Режим выхода (ножка PB1) установлен в "Clear on compare match", то есть переключение в ноль по достижению счетчиком TCNT1 значения, записанного в OCR1A. В коде, в теле прерывания по переполнению таймера, устанавливаю обратно выходную ножку в высокий уровень (PB1). Она должна быть включена до момента, пока опять не сбросится таймером по достижению счетчиком значения OCR1A. А работает на практике это так: выход PB1 всегда с низким уровнем. Причем если настроить этот выход в противоположный режим "Set on compare match" (и обнулять в прерывании), то PB1 наоборот всегда с высоким уровнем. Почему таймер не дает вручную установить высокий уровень на PB1 в теле прерывания? Зачем тогда этот режим обнуления таймером, если установка потом невозможна? Не догоню Добавлено: Sat Feb 05, 2022 8:29 pm |
Если ты используешь ногодрыг от таймера, это же альтернативная функция вывода вроде. Соответственно, можешь ли ты из прерывания вручную ногу дернуть? Добавлено: Sat Feb 05, 2022 9:38 pm |
Ну вот по факту, получается что не могу. Но вопрос остается: зачем тогда этот режим обнуления таймером, если установка (вручную) потом невозможна? Если возможна, то как ее сделать? Иначе получается, что какая-то одноразовая функция: при первом срабатывании compare match, ножка прижимается к земле, и до конца веков там остается. Если найти вариант как ее поднимать из прерывания, то можно сделать двухканальный 16-битный ШИМ (когда TOP=0xFFFF и дергаются независимо две ножки - по совпадению с OCR1A и с OCR1B). Другого варианта сделать двухканальный 16-бит ШИМ на atmega328p не нашел. Добавлено: Sat Feb 05, 2022 9:53 pm |
Заводишь просто таймер. По его прерыванию делаешь с ногами всё, что тебе нужно. Хоть с одной, хоть с несколькими. Николай тебе об этом говорил. Добавлено: Sat Feb 05, 2022 10:03 pm |
Да и готовых примеров программно-аппаратных многоканальных ШИМов вроде выложено в сети немало. Добавлено: Sat Feb 05, 2022 10:04 pm |
Лицензионное соглашение (c)Flyback.org.ru Российское общество любителей высоких напряжений. Использование материалов с данного сайта и форума возможно только с разрешения администрации. |