Вопросы начинающих PIC ASM

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

yor писал(а):Это пример идеальной программы?
Для большинства случаев - да. Это ещё и удобно, минимизирует ошибки, реализует модульность, тестирование, упрощает переносимость и т.д. и т.п.

Добавлено after 2 minutes 49 seconds:
[uquote="yor",url="/forum/viewtopic.php?p=4595833#p4595833"]после проверки btfss пройти на два последовательных вызова ПП? После первой не надо вызывать вторую.[/uquote] разве не просто два call подряд? если 0, вызовутся оба, если 1 - nop и второй call
Контактная информация:
Реклама
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Оба подряд никак нельзя. От условия btfss<->Dlvl,D1 зависит, какую вызывать. Или первую, или вторую. Возможно в первой перед return прибавить единицу к РС, чтобы возврат произошёл за вторым вызовом? Пока ничего другого не придумал.
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

а, понял. Мне показалось, что надо либо один вызов, либо два подряд.

Код: Выделить всё

btfss Dlvl,D1
call FwdFront
btfsс Dlvl,D1
call RearFront
лишь бы никто не успел изменить Dlvl,D1
Контактная информация:
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ах ты ж, хлопаю себя по лбу, сто раз так делал)) А всё-таки разобраться для порядку, возможно ли в первой call перед return прибавить единицу к РС (косвенно), чтобы возврат произошёл за вторым вызовом? Выигрыша тут никакого, что там лишняя команда (а может и не одна), что тут, но всё-таки?

Добавлено after 1 hour 7 minutes 48 seconds:
А по размышлению, лучше сделать вызовы обеих процедур не по call, а по goto. Вызываются они всегда из одного этого места, уходят тоже всегда только в одно другое. Так смысл CALL? Правильно?
Это всё вы меня тут сбили с панатлыку))
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15695
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Не мешает посмотреть поведение PCLATH<4:3>...
:roll:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4595879#p4595879"]лучше сделать вызовы обеих процедур не по call, а по goto. Вызываются они всегда из одного этого места, уходят тоже всегда только в одно другое. Так смысл CALL? Правильно?[/uquote]
Нет, не правильно.
Алгоритм должен быть написан так, чтобы функция была максимально изолирована.
Это принцип языков высокого уровня и его так же надо реализовывать в АСМе.
Включите моск и думайте. Подсказывать не буду.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15695
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Прямой доступ к счетчику команд у ПИКовых очень мощная штука.
:hunger:
Только вот работа с PCL требует тщательного анализа и планирования размещения подпрограмм, учитывающего работу связки PCLATH и PCH
:tea:
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4595965#p4595965"]Алгоритм должен быть написан так, чтобы функция была максимально изолирована.[/uquote]Можно объяснить принцип изоляции? Изоляции от чего? Что так, что так они в одной и той же памяти.
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Изоляция от остального кода.
Код в классической реализации с суперлупом-main-ом должен содержать только вызываемые функции и функции обработчиков прерываний. Никаких спагетти из перекрестных переходов быть не должно.
Все. Точка.
В версии с RTOS все тоже самое, но все функции (задачи) вызываются шедулером, который решает кого и когда вызывать. Он же останавливает работу функций (задач), вызывая очередные.
Друг Кота
Аватара пользователя
Сообщения: 15695
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Группируется код в одном месте (в пределах одной страницы ПЗУ), выделяется отдельная группа РОН.
Выделяются регистры для взаимообмена данными с другими программами проекта.
Все дополнительные подпрограммы также размещаем внутри пространства памяти основной программы.
Для ассемблера с небольшими проектами не столь существенно заметно. Разве что в "многофункциональных" самоделках...
К примеру отдельно выполняемая регенерация динамической индикации дисплея по прерываниям от системного таймера в рамках какого - либо устройства.
:roll:
Когда и этого становится маловато переходим уже к ЯВУ (в моем случае к Си/С++ под ардуиноIDE легче получилось)
:tea:
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="BOB51",url="/forum/viewtopic.php?p=4596022#p4596022"]Для ассемблера с небольшими проектами не столь существенно заметно.[/uquote]
Именно для ассемблера это более всего заметно. На Си все эти попытки пресечены инструментами и всеобщим презрением к использующим goto.
Именно в ассемблере код становится спагетти-кодом очень быстро. Патамушта новичок ленится включить моск и создать легко администрируемый код, заменяя его на свои мечущиеся "мысли".
Друг Кота
Аватара пользователя
Сообщения: 15695
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вот тут и не согласен.
Ассемблер требует таки весьма большого внимания (и подсказок от компилятора/ среды разработки заметно меньше).
Плюс "свобода творчества" для ЯВУ недоступная.
8)
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="BOB51",url="/forum/viewtopic.php?p=4596022#p4596022"]ардуиноIDE[/uquote]Если не путаю, мне встречались сведения, что оно и PIC поддерживает, или путаю-таки? Ассемблер PIC?
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="BOB51",url="/forum/viewtopic.php?p=4596035#p4596035"]Плюс "свобода творчества" для ЯВУ недоступная.[/uquote]
Свобода творчества в АСМе должна быть намертво локализована в коде самого нижнего уровня.
Код верхнего уровня должен быть написан по правилам общим для любого языка программирования, потому что в нем должен быть описан общий алгоритм, а не клубок потока сознания.
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Это должно быть написано во всех книжках "Как выучить ... за 21 день".
Контактная информация:
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596018#p4596018"]Изоляция от остального кода.
Код в классической реализации с суперлупом-main-ом должен содержать только вызываемые функции и функции обработчиков прерываний. Никаких спагетти из перекрестных переходов быть не должно.[/uquote]А пример нарушения изоляции в асме среднемладших PIC можно?

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596052#p4596052"]в коде самого нижнего уровня.
Код верхнего уровня должен быть написан[/uquote]В асме среднемладших PIC что за код нижнего и верхнего уровней?
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4596079#p4596079"]пример нарушения изоляции в асме[/uquote] Выход из функции по goto. Это харам. goto как инструкция применяется лишь в локальных ветвлениях кода самого нижнего уровня. И даже там нужно максимально избегать этой инструкции насколько это возможно, прибегая к вызовам call. Понятно, что в самых примитивных basic PIC-ах стек крайне мал и это плохо реализуемо, но насколько возможно это должно быть так.
[uquote="yor",url="/forum/viewtopic.php?p=4596079#p4596079"]что за код нижнего и верхнего уровней?[/uquote]
Любая общая конечная задача реализуемая на МК является задачей верхнего уровня. Она разбивается на отдельные задачи более низкого уровня. А те, в свою очередь, на еще более низкие уровни. И так доходит до примитивов из которых, как из кубиков, складывается общая программа.
yor
Мудрый кот
Сообщения: 1711
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596092#p4596092"]Выход из функции по goto. Это харам. goto как инструкция применяется лишь в локальных ветвлениях кода самого нижнего уровня. И даже там нужно максимально избегать этой инструкции насколько это возможно[/uquote]А реальный аварийный случай, при таком применении, какой может быть?
Или имеется в виду, что в функцию пришёл по call, вышёл по goto и не вернулся в этом цикле, и привет стеку? Ну так это очевидное злостное нарушение логики, конечно, так работать вообще не будет.
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4596095#p4596095"]в функцию пришёл по call, вышёл по goto и не вернулся в этом цикле, и привет стеку?[/uquote]
Так вообще нельзя делать, если не корректировать указатель стека.
Но я имел ввиду совсем другое.
Под функцией нужно понимать некую завершенную задачу не важно какого уровня.
Например, это может быть вывод текста из флеша на дисплей соединенный по SPI.
Или это может быть более низкая по уровню задача знакогенератора, которая вызывается из предыдущей. Каждая функция любого уровня может иметь некие входные данные и некие выходные. Именно может, но необязательно имеет.
Таким образом, к функции можно зайти с call или с goto. И соответственно выйти через return или через goto.
Моя мысль сводится к тому, что для этой цели goto - харам.
Друг Кота
Аватара пользователя
Сообщения: 15695
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну уж так и не надо то GOTO...
8)
К примеру CALL на табличный селектор вида
ADDWF PCL,f
с последующей таблицей из GOTO переходов на исполняемые варианты подпрограмм, имеющих возврат в точку вызова того селектора (условный вызов)...
:roll:
Ответить

Вернуться в «PIC»