Меня тут жизнь заставила потрогать компилятор XC8 от майкрочипа для мелких контроллеров. Это, я вам скажу, целый отдельный мир в себе. Зато я теперь понимаю, откуда на форумах тонны говнокода с двоичными или шестнадцатиричными константами, а разбуженный внезапно ночью пикоман будет бормотать что-то типа "0xA8 в регистр 0xBB включает режим
(
Read more... )
Comments 20
Reply
Удивляет именно пренебрежение символическими именами, типа, реальные программисты справятся и так.
Reply
Reply
Трудность - не в арифметике.
Reply
CTRL_A.option1 = 1;
CTRL_A.option2 = 1;
CTRL_A.enabled = 1;
Но это уже высший пилотаж.
Reply
Reply
Я, кстати, подозреваю, что компилятор способен оптимизировать код и собрать все присваивания битиков в одну запись в регистр. Но поскольку оптимизации при отладке отключены - будут чудеса в решете :)
Reply
Reply
а под arm те же самые пикоманы плодят дикие структуры, которые заполняют перед каждым вызовом любой функции (cmsys и рядом). и это при том, что на opencm3 код будет и короче и читаемее, и даже бинарник будет мельче.
Reply
Reply
в смысле, по факту многие афтыри ставят.
весело бывает разбирать какой-нибудь "reg_foobar = 0x12345678ULL;" на важные в текущем контексте биты и случайно (или неслучайно) поднятые/опущеные по иным причинам биты.
Reply
Тут же НЕТ других вариантов кроме как парсить трешатину FOOBAR=0x1234 или пилить сразу свои правильные хедеры.
А, и да. В родных примерах от mcrch попадается вообще всё что угодно, начиная от CTRL.bit = 1; и заканчивая asm("bsf CTRL, 7")
А еще там прямая битовая адресация есть, это когда CTRLbit объявлен непосредственно по адресу 0x88f (и в скобочках пояснение что это 0x111*8+7).
И всё это вперемешку.
Reply
r = (Reg){ .abc = {.a = 2, .b = 1} };
Ну и тут картинка, чтобы понятнее было
( ... )
Reply
Технически это работает, но тут поднасрал оптимизатор, точнее его отсутствие в бесплатной версии. В данном случае компилятор:
1) заводит сегмент данных с единственной анонимной переменной в которой лежит желаемый инициализатор;
2) Выделяет байт в стеке;
3) Читает байт из сегмента данных в W;
4) Сохраняет W на вершину стека;
5) Читает W с вершины стека;
6) Выбирает банк и пишет W в требуемый SFR (ура!);
7) Скукоживает всё обратно.
Reply
Leave a comment