[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965269#p3965269"]и еще перевод "Ошибка невозможного ограничения в 'asm' " Вопрос - как аргумент функции передать в асемблерный код? Если поставить напрямую PB0 в код, то компилируется, 0...7 тоже компилируется.[/uquote]
Номер пина - это константа прошитая в инструкции SBI, а аргумент функции - это не константа времени компиляции. Можно или макрос использовать или на C++ передавать номер пина в качестве шаблонного параметра.
Уважаемые коты - это мой первый опыт на ассемблере, пытаюсь сделать некоторые ардуиновские функции для голого МК (ATtiny напр.). digitalWrite, digitalRead, pinMode ну и пр. ( на Си сделал, работает. слишком просто и не интересно )
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965539#p3965539"]( на Си сделал, работает. слишком просто и не интересно )[/uquote]
Самый оптимизированный код сейчас генерит C++, там можно сказать компилятору, что вот тебе 5 экранов кода, все посчитай и верни константу времени компиляции... Но по мнению многих получается наоборот слишком сложно В любом случае ардуино явно не лучший пример для подражания...
О макросах. http://we.easyelectronics.ru/AVR/assemb ... r-gcc.html На этом форуме есть в обсуждениях полезные макросы на ASM. Установка бита, сброс бита...(полистать несколько экранов вниз). Однако как говорил наш командир роты. Макрос, это макрос.А функция, это функция.
Добавлено after 3 minutes 40 seconds:
А вот как раз я и ненавижу Ардуино. (Но это так по секрету всему свету)
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965552#p3965552"]Макрос, это макрос. А функция, это функция.[/uquote]
С функцией получится только на плюсах, там PB0 может быть классом, тогда порт и номер пина он хранит как константы и в функцию их передавать не нужно:
Ну вот незабвенный digitalRead. Надо бы переложить на ASM. Чем я сейчас и занят. Ну как там говорят, когда коту делать нечего.. uint8_tdigitalRead(uint8_t pin){ return !!( PINB & (1<<pin) );}
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3965565#p3965565"]Надо бы переложить на ASM.[/uquote]Может сначала посмотреть во что это компилируется и не заниматься ерундой?
Добавлено after 2 minutes 12 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3965564#p3965564"]там PB0 может быть классом[/uquote]Добавлю вариантов
Подскажите пожалуйста, чем по сути отличается микроконтроллер от микропроцессора? Я знаком только с AVR-микроконтроллерами. А сейчас вот столкнулся с микропроцессором, который так же нуждается в прошивке, как и AVR... И имя ему: bj8p153. Что это вообще за зверек такой? Прошу прощения, если не в тот раздел написал не знаю куда отнести свой вопрос.
[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором,
....
И имя ему: bj8p153.[/uquote]Смешно. AVR по сравнению с ним - суперкомпьютер! Даташит гуглится в 3 сек. В чём проблема почитать?
[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]Подскажите пожалуйста, чем по сути отличается микроконтроллер от микропроцессора?[/uquote]
Ответ дан здесь
[uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором[/uquote]
Это КОНТРОЛЛЕР, а не процессор (даташит об этом недвусмысленно намекает прямо в заголовке), причем с ОТР (One Time Programming - однократно программируемой) программной памятью.
Решено. Самый быстрый в мире digitalWrite() и pinMode() и незабвенный подмигиватель светодиодной лампочкой. Всего то и надо было перейти на С++ и применить шаблон в качестве одного из параметров функции.Спойлер
А теперь с удивлением узнаём, что командами SBI и CBI доступны не все порты. А вот C конструкцию типа PINx |= (1<<pin); компилятор сам способен перевести либо в SBI, либо в OUT исходя из номера порта. Без всякого асма.
Не много поизгалявшись над оригинальной Ардуиновской функцией. (отвязал её от Меги и всех Ардуиновских библиотек) Там - не иначе как тихий ужас я бы не назвал. Ну а насчет подрыгать лапами. Я все-таки лампочки на Reset подключать не планирую.
[uquote="Эйлер Леонард",url="/forum/viewtopic.php?p=3966675#p3966675"]Вполне может быть и так.[/uquote]Тут недостаток в том, что функция не будет заинлайнена из другой единицы трансляции. Стоит обернуть её в шаблонный класс и сделать статическим методом. Тогда С++ действительно сделает её эффективной. Можно так же продумать реализации, когда на вход подаются константные данные. Тогда проверка условия будет "вырождаться" на этапе компиляции.
[uquote="КРАМ",url="/forum/viewtopic.php?p=3966182#p3966182"][uquote="Олегыч1",url="/forum/viewtopic.php?p=3966160#p3966160"]А сейчас вот столкнулся с микропроцессором[/uquote]
Это КОНТРОЛЛЕР, а не процессор (даташит об этом недвусмысленно намекает прямо в заголовке), причем с ОТР (One Time Programming - однократно программируемой) программной памятью.[/uquote]
А ниже написано BJ8P508/153 is an 8-bit microprocessor with low-power and high-speed CMOS technology и я запутался поэтому немного. Короче производители и сами точно не уверены к чему отнести данную микросхему, т.к. сильной принципиальной разны получается и нет.
[/uquote]
Это совсем не то, о чем я говорил изначально, аргумент функции тут по-прежнему присутствует и формально он не константа времени компиляции, потому подобный код не будет компилироваться всегда. Например, если отключить оптимизацию, то не помогут даже навешеные на функцию атрибуты оптимизации и инлайнинга если сама функцию вызывается из неоптимизированного контекста, потому что в таком случае инлайнинг невозможен, а без инлайнинга pin будет передаваться в регистре... Через шаблон нужно передавать само значение, а не тип: