whale 6 19 августа Опубликовано 19 августа (изменено) · Жалоба Just now, Priest_89 said: время на постройку костылей а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ? Думаю вариант с нопами прокатит. Изменено 19 августа пользователем whale 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 19 августа Опубликовано 19 августа · Жалоба 44 минуты назад, whale сказал: Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ? А чем мой способ не угодил предводителю дворянства? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 19 августа Опубликовано 19 августа · Жалоба 2 hours ago, jcxz said: А чем мой способ не угодил предводителю дворянства? слишком просто и даже переносимо получается. надо сделать что-нибудь вроде void delay(int cycles){ __asm__("add pc, r0"); __asm__("nop"); __asm__("nop"); __asm__("nop"); __asm__("nop"); //... } чтобы потом всё раком встало при "не правильном" переданном значении аргумента функции. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 19 августа Опубликовано 19 августа · Жалоба А чем мой способ не угодил предводителю дворянства? предводителю уездного дворянства Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 24 19 августа Опубликовано 19 августа · Жалоба 5 hours ago, whale said: Вижу только один путь - делаем сто нопов подряд и смещаем указатель команд на нужную строку нопов. Весь вопрос как сместить это указатель (счетчик команд) на нужную величину с минимальными потерями, тк смещение от цикла к циклу все время меняется. Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ? Мой преподаватель такое делал. делал он так. внутри функции задержки натравливал указатель на первый ноп. потом инкрементил этот указатель на число нопов в столбце минус нужная задержка. и передавал туда управление. если найду код выложу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 19 августа Опубликовано 19 августа (изменено) · Жалоба Just now, firstvald said: инкрементил этот указатель на число нопов Вот это и есть самый главный секретный вопрос - как инкрементировать указатель команд на нужное значение в stm32 iar В avr все было просто тут хрен разберешь, перерыл всю доку так и не нашел где в каком секретном регистре содержится этот указатель. Изменено 19 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 19 августа Опубликовано 19 августа (изменено) · Жалоба 1 hour ago, _pv said: надо сделать что-нибудь вроде Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс, при cycles = 0,1 значение сдвига одинаковые (те не сдвигает) также такой эффект повторяется далее через пару цифр - 2,3 4,5 итд те между 1 и 2 сдвиг 3кгц между 2 и 3 сдвиг ноль. между 3 и 4 сдвиг3кгц между 4 и 5 сдвиг ноль. итд может что то с длинной pc связано, в принципе можно сдвиг умножать на два ) void delay(char cycles){ asm("add pc, r0"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); Изменено 19 августа пользователем whale 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Priest_89 8 19 августа Опубликовано 19 августа · Жалоба 35 minutes ago, whale said: где в каком секретном регистре содержится этот указатель. В регистре PC (R15) (Cortex-M0 Technical Reference Manual, п.3.5) 5 hours ago, whale said: а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ? Решать, безусловно, Вам, но.. Плата - насколько я понял из ваших постов, у Вас макетная версия, которая все равно требует переделки. Серии STM и их клонов полностью или с небольшими оговорками совместимы по пинам. Так что из переделок - 4 перемычки на выходы таймеров, а если повезет - то и их не понадобится. Программа - опять же, рабочая программа на Си переносится без особых проблем, с небольшими изменениями в работе периферии и перенастройкой делителей в таймерах и интерфейсах. В то же время, если оставлять старый контроллер, любая доработка/модификация в будущем приведет к возврату к обсуждаемому геморрою, либо ресурсов не хватит в принципе и опять же придется менять контроллер. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 19 августа Опубликовано 19 августа · Жалоба если так хочется делать ногодрыгами и НОПами, я бы сделал по-другому: создал бы с десяток функций void f1() { asm("nop"); return; } void f2() { asm("nop"); asm("nop"); return; } ... void f10() { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); return; } запихнул бы их адреса в массив указателей на функцию, измерил бы точно сколько они длятся и вызывал бы так, что f10() вызывается в цикле сколько надо раз, а потом управление попадает на одну из тех, что в массиве. Тогда при точном измерении длительности такого извращения можно с точностью до такта настроить такую задержку. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
НЕХ 7 19 августа Опубликовано 19 августа · Жалоба Может проще приспособить копеечный синтезатор ? Видел, применяется в китайских лазерных рулетках. https://www.compel.ru/infosheet/RUIMENG/MS5351M Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 19 августа Опубликовано 19 августа · Жалоба А что с прерываниями делать? Насколько независимое управление нужно? Там же трёхфазный таймер, можно по фазе на мост и одна фаза запасная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 19 августа Опубликовано 19 августа · Жалоба 41 minutes ago, whale said: Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс, это clang аргумент в r0 передаёт, и вроде ничего больше не делает, судя по godbolt.org, что именно там делает iar в прологе если фунция не naked объявлена это в листинг смотреть надо. инструкция nop вроде как два байта занимает, и почему при сдвиге на нечётный адрес он вообще в какой-нибудь hard fault не улетает я не очень понимаю. jcxz на первой странице нормальный вариант на С через switch привёл. Да, за компилятором в листинг поглядывать надо, потому что при разных уровнях оптимизации он вероятно может и в цепочку ifов скомпилировать, но такие вещи либо целиком на ассемблере, либо бороться с оптимизатоциями компилятора без каких-либо гарантий. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 19 августа Опубликовано 19 августа (изменено) · Жалоба Just now, _pv said: switch switch if и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал, единственный рабочий вариант это ваш получился. Если ноп два байта тогда понятно, думаю меньше шаг уже не получить. Изменено 19 августа пользователем whale Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 78 19 августа Опубликовано 19 августа · Жалоба 2 minutes ago, whale said: switch if и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал, листинг в студию. clang для арма из предложенного jcxz свича сам делает ровно такую же последовательность нопов и инкремент pc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
whale 6 19 августа Опубликовано 19 августа · Жалоба Just now, _pv said: clang для арма iar видимо делает по другому, поискать надо, может завтра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться