Ясно, просто ты упоминал про глобальную оптимизацию после отладки проекта когда все в таблицы пакуется и я подумал, что может тогда вся эта куча вызовов для инита каждого пина тоже переезжает в такую таблицу...
Это магическое число запросто может быть 0x50000000 у некоторых контроллеров. Она же определена в заголовочном файле контроллера, надо пользоваться. Ну и с приведение типов надо что-то делать.
2. Состояние пина в PushPull режиме это тоже часть конфигурации. Почему на него забито? Должно быть три опции: 0, 1 и "не трогать".
Это плохо споткнулось на stm32l552xx - там вообще всё переделано. Ну даа, нужно подключать внешнее, чтобы работало везде и всегда (кроме F1). Но на данный момент до этого далеко.
Народный f103 оптимизировать нет смысла: это намного сложнее - и практически с нуля, накопилась критическая масса публикаций в инете - которую невозможно пробить. Даже победив дракона - героя никто не заметит, а может даже затопают в суматохе.
Reflector писал(а):
Состояние пина в PushPull
Ну дык к это относится к работе выхлопа на верхнем и нижнем транзисторе, но в любом случае это выхлоп. А вот не выхлоп - обозначен для выбора.
Ну не знаю, раз уж взялись за пин, то лучше полностью состояние задать, чем лочить его. И какая может быть трудность у F1 с его 4 битами конфигурации на пин в одном регистре?
Залочить, кстати, если есть список пинов, это одна команда. Спойлер
Трудность с F1 в том что кубик не даёт полноценный рапорт, а вводить всё это дело руками - рехнуться можно. (это я про своё решение) Лок нужен по другим причинам, не связанных с безопасностью. Точнее это даже почти правило, всё сто статично - должно лочится.
Теперь, плиз, в цикле, будем записывать, ни знаю как у вас правильно, но
Код:
a = 0; b = 0; while (1) { pins1 = a++; pins2 = b++; }
При объявлении pins1 и pins2 у вас создается таблица, массив, соответственно будет два массива. На текущий момент нет способа узнать длину массива, соответственно будет две функции записи.
При объявлении pins1 и pins2 у вас создается таблица, массив, соответственно будет два массива.
Нет там никаких массивов, они есть у меня, но только для инициализации и как один из вариантов, потому что иногда скорость важнее размера. Для присваивания скорость важнее гораздо чаще, потому обходимся без массивов, хотя добавить можно, даже с автоматической подстановкой более компактного варианта.
Компилятор тут тупанул - не объединил переменные. Но вина, скорее, программиста.
Нет, не тупанул, правильно сделал. К примеру на pins1 весит индикатор какой-то лсд не важно, а на pins2 светодиоды. Как их можно объединить и для чего? А что это за строка?
Тупанул ещё как. В pins1 и pins2 всегда записывается одинаковое значение. GCC это смог просчитать и выкинул одну переменную. У GCC, правда, какое-то хроническое неумение объединять доступ со смещением от разных базовых адресов.
Ну так же как я в С-коде объединил. Так же как GCC это сделал в результате компиляции. Для оптимизации. Я бы ещё на его месте предупреждение "user fool" выдавал.
Тупанул ещё как. В pins1 и pins2 всегда записывается одно и то же значение.
Нет, не тупанул. Цикл while говорит компилятору что pins1 и pins2 будет использоваться многократно, значит нельзя оптимизировать. А то что записывается одно и то же значение - это чисто случай, надо было а=10 а в=0, были бы разные значения. А в С-коде тот же GCC используется, а ну да в иаре другой, свой какой-то.
Ну да ладно, что я хотел, то я получил.
С++ конечно красиво, но все создается на этапе компиляции и как выяснилось, плохая возможность отладки. Что бы, найти ошибку, что то исправить, надо колупать целый класс, и что там в классе написано, да еще и связано с другими. Увы, примеров и там и тут навалом.
Что значит "были бы"? Если бы у бабушки был хрен... Компилировался конкретный код, в котором вы сами написали a=0 и b=0. Компилятор это не увидел, а значит тупанул.
С++ конечно красиво, но все создается на этапе компиляции
Ну надо же, превратить в недостаток бесспорное достоинство. И, по секрету, чтобы что-то просчитывалось на этапе компиляции надо приложить немалые усилия.
Что бы, найти ошибку, что то исправить, надо колупать целый класс, и что там в классе написано, да еще и связано с другими.
Зачем? Воспринимайте класс как библиотечную функцию. Один раз написал, оттестировал и пользуйся как чёрным ящиком. Чего в него лазить? Вот вы написали код с pins1 и pins2 не зная что внутри и всё правильно сработало. А глупость с а=0 и b=0 без всяких классов сморозили.
С++ конечно красиво, но все создается на этапе компиляции и как выяснилось, плохая возможность отладки.
Показывай реализацию для своих двух списков на С, желательно с инициализацией портов, она ведь тоже нужна, а мы оценим как там обстоят дела с отладкой. Потом поменяй пины на другие и продемонстрируй насколько легко получившийся код использовать повторно
VladislavS, Reflector, уважаемые, мне 51 год, скоро 52 будет, на кой х мне это сдалось? Я уже "там" место себе забронировал. Мне всего раз потребовалось 40 входов и 40 выходов, и то это на 80С31 лет так 30 назад. Идите учите молодых, ах да забыл, молодые же в ардуино играют. Если и начинать изучать С++ это надо начинать с буквы А и года 4 зубрить.
А мне уже лень, я в лучше в танки поиграю.
PS: Reflector, вот вам на С реализация, правда для AVR контроллеровСпойлер
C есть С. Что-то вроде того что Reflector по приколу с массивами показал. Только у него массивы упакованы лучше и их руками не надо делать. Единственный вопрос вызывает вот это место
Код:
*p->port |= p->or;
Сможет ли компилятор тут sbi поставить или будет неэффективная команда записи в память? Я думаю второе.
C есть С. Что-то вроде того что Reflector по приколу с массивами показал. Только у него массивы упакованы лучше и их руками не надо делать.
Вчера показал, сегодня уже этот код удалил как не выдерживающий конкуренции, а сам он был простейший и отладка будет соответствующая Зато аналогичный подход для инициализации наоборот развил, теперь нет функции проверки дубликатов, эта задача легла на функцию инициализации которая и так в цикле читает данные пинов из массива. В сборке без проверок 7-й бит режима отвечает за лок, а для отладочной сборки лочить пины незачем, там этот бит отвечает за проверку дубликатов, плюс FF в конце тоже нет, все массивы стали короче на два байта:
Init() - это тот же mode(), но с проверкой дубликатов, если она включена, а modeInline() вместо массива работает напрямую c регистрами. Для этого кода получаем:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения