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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="BOB51",url="/forum/viewtopic.php?p=4596035#p4596035"]Плюс "свобода творчества" для ЯВУ недоступная.[/uquote]
Свобода творчества в АСМе должна быть намертво локализована в коде самого нижнего уровня.
Код верхнего уровня должен быть написан по правилам общим для любого языка программирования, потому что в нем должен быть описан общий алгоритм, а не клубок потока сознания.
Реклама
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 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 что за код нижнего и верхнего уровней?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 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
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

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

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

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

Сообщение BOB51 »

Ну уж так и не надо то GOTO...
8)
К примеру CALL на табличный селектор вида
ADDWF PCL,f
с последующей таблицей из GOTO переходов на исполняемые варианты подпрограмм, имеющих возврат в точку вызова того селектора (условный вызов)...
:roll:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Сообщение BOB51 »

Аналогия switch case в Си всего то...
:tea:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Так и обходите молчанием, что же может (даже не произойдёт), а только может произойти? Биты на байты налезут, или стек через своп в астрал улетит? Если логика продумана, то будет работать железно хоть так хоть этак. На то оно, как там его, железная логика)) Или имеете в виду возможное внесение косяков при изменении программы?
Что будет-то на железном уровне? Просто "харам" - это не доказательство. Или это не для начинающих.
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Если получен тупик в текущем алгоритме почему бы не продумать иной вариант решения задачи?
Ведь проверка условий возможна весьма разными способами.
8)
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4596116#p4596116"]Если логика продумана[/uquote]
Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.
Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У нас исходно сделать выбор в случае с текущим значением бита...
Можно по командам проверки состояния бита, а можно и по условному переходу, представив бит в адрес вектора перехода (табличный селектор).
То уж как интересно будет.
Да и на BTFSS/BTFSC переключатель соорудить можно только по каждой команде свое условие делается, а не два условия с одной команды.
8)
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Проблема в том, что в спагетти-коде невозможно "продумать логику" так, чтобы она была действительно продумана.
Разве только для самых примитивных задач.[/uquote]Ну это только если проццессор слабоват, или ОЗУ недостаточно))

[uquote="КРАМ",url="/forum/viewtopic.php?p=4596122#p4596122"]Чем более упорядочен код, тем проще с ним работать сейчас и вообще возможно работать в некоем не слишком далеком будущем.
Иначе смотришь на свой код как баран на новые ворота и не понимаешь зачем ты сделал странные действия...[/uquote]Это да, полностью согласен. Но комментарии спасают.

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

Сообщение BOB51 »

К Вашему примеру селектора:
Спойлер

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

; саму проверку вызываем как CALL TEST ибо надо фиксировать точку возврата
; к исходной программе (а она таки одна)
CALL TEST

TEST
BTFSS R0,N ; проверка на 1
BTFSC R0,N; если не 1 то проверяем на 0
goto point_a ; безусловный переход на точку
                   ; вызова подпрограммы при бите = 1
point_b ; точка вызова подпрограммы при бите = 0
       ;ТЕЛО ПРОГРАММЫ ДЛЯ БИТА РАВНОГО 0
       ;..............
ret ; или reti

point_a ; точка вызова подпрограммы при бите = 1
       ;ТЕЛО ПРОГРАММЫ ДЛЯ БИТА РАВНОГО 1
        ;..............
ret ; или reti
Надеюсь понятно, почему там CALL за btfss/btfsc не слишком корректна...
:wink:
Последний раз редактировалось BOB51 Пт июн 28, 2024 16:18:38, всего редактировалось 3 раза.
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]Но комментарии спасают.[/uquote]
Увы нет. То есть совсем нет. Невозможно описать головоломную конструкцию, где заплатка погоняет заплаткой. У вас не хватит словарного запаса. У языка нет такого словарного запаса.
:)
[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]Два монитора бы спасли, это лучший вариант.[/uquote]
Все давно придумано в MPLABX. Там есть возможность открыть два экземпляра одного листинга в одной среде. Справа в верхнем углу листинга есть крестик. Потяните за него влево. Дверка с золотым ключиком откроется... :music:
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="yor",url="/forum/viewtopic.php?p=4596127#p4596127"]...

А вот скажите пож-ста, я, конечно, знаю, что объявление переменных и регистров следует делать в начале листинга. Для удобочитаемости. Но ведь гораздо удобнее (пусть не всегда, временами) делать это в части, относящейся к какой-то процедуре, прямо перед ней. Неудобно мотаться далеко в начало, или в другое окно переключаться. Два монитора бы спасли, это лучший вариант.[/uquote]
Если метка относится только к некоторому участку кода и нигде более не используется - проблем особо нет. Это объявление локальной метки действующей в ограниченной области кода. Тут главное не сделать повторного объявления ранее уже определенного регистра или данных.
Другое дело, когда определенная где-то в одном месте метка в дальнейшем будет использоваться в других частях программы.
Ежли "ниже по коду" это вполне возможно (хош и путаница в поиске первоисточника самой метки будет еще хуже, чем просмотр единого файла заголовка с определением меток).
А вот ежли "выше по коду" - тогда придется изворачиваться с #define и опять таки со списком определений в отдельном разделе (файле) в начале программы.
Да и никто не ограничивает возможность вставлять в начале текста программы проекта подключаемые файлы, к примеру:

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

#include <def_name_project.txt> ; файл объявленных имен, бит и констант
#include <mac_name_project.txt> ; файл описания макросов
;    вместо name_project подставляется имя файла соответствующего проекта
а уже в них укладывать все объявления.
Такой вариант легко просматривается/обрабатывается в любом текстовом редакторе с несколькими одновременно открытыми файлами даже на одном мониторе.
8)
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Друг Кота
Аватара пользователя
Сообщения: 26017
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Что значит определить?
Перейти по условию? Тогда это btfss.
И что такое"долго и муторно"?
Опять же все зависит от семейства МК. В 18-х и 24-х есть иные варианты.
Друг Кота
Аватара пользователя
Сообщения: 15806
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

yor писал(а):Не подскажете идею, как определить старший единичный бит в байте? btfss-ами долго и муторно получается.
Почему долго?
Одного btfss (или btfsc -зависит от логики задачи) вполне достаточно.
Другое дело если тот бит контролируется в комплекте с остальным содержимым регистра или с дополнительными параметрами.
Альтернатива - сдвиг RLF Rx,w с последующей проверкой флага C регистра status.
Или хочется классическую инверсию бита в зависимости от его исходного состояния с помощью связки из тех btfss/btfsc замутить?
Чтой-то у Вас "творческий спад" наблюдается...
Не захворали ли часом?
:?
Друг Кота
Аватара пользователя
Сообщения: 4812
Зарегистрирован: Вс сен 17, 2017 17:44:21
Откуда: 51.7727, 55.0988. Высота над морем 107 м. До границы 161 км.

Сообщение Steppe »

[uquote="BOB51",url="/forum/viewtopic.php?p=4596763#p4596763"]Чтой-то у Вас "творческий спад" наблюдается...[/uquote]
А был ли подъем?
Ответить

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