Байтоёбства псто

Jun 20, 2021 12:49

Меня тут жизнь заставила потрогать компилятор XC8 от майкрочипа для мелких контроллеров. Это, я вам скажу, целый отдельный мир в себе. Зато я теперь понимаю, откуда на форумах тонны говнокода с двоичными или шестнадцатиричными константами, а разбуженный внезапно ночью пикоман будет бормотать что-то типа "0xA8 в регистр 0xBB включает режим ( Read more... )

rant, программизм, терминальное

Leave a comment

Comments 20

rw9uao June 21 2021, 03:05:15 UTC
"CTRL_A = (1<<5) | (1<<2);" не лучше?

Reply

ex0_planet June 21 2021, 08:41:42 UTC
А зачем, если уже есть 0b0100100?

Удивляет именно пренебрежение символическими именами, типа, реальные программисты справятся и так.

Reply


bigmaxx June 21 2021, 03:50:37 UTC
А почему "иначе никак", там что, встроенная арифметика компилятором не поддерживается?

Reply

ex0_planet June 21 2021, 08:42:12 UTC
https://ex0-planet.livejournal.com/99890.html?thread=439090#t439090

Трудность - не в арифметике.

Reply


sbj_ss June 21 2021, 07:26:46 UTC
Во многих случаях согласованное поведение достигается правильным порядком команд - т.е.
CTRL_A.option1 = 1;
CTRL_A.option2 = 1;
CTRL_A.enabled = 1;
Но это уже высший пилотаж.

Reply

ex0_planet June 21 2021, 08:42:58 UTC
Запуск аппаратуры - и так достаточно хрупкий код, зачем усложнять?

Reply

sbj_ss June 21 2021, 08:46:07 UTC
А, их проблемы.
Я, кстати, подозреваю, что компилятор способен оптимизировать код и собрать все присваивания битиков в одну запись в регистр. Но поскольку оптимизации при отладке отключены - будут чудеса в решете :)

Reply

ex0_planet June 21 2021, 08:47:07 UTC
Он не имеет права так оптимизировать, потому что volatile и операции по внешней памяти должны быть видны так как написано.

Reply


nicka_startcev June 21 2021, 09:33:55 UTC
>Но это нормальные люди. Пикоманы же пытаются сделать "удобно" и делают промежуточные структуры с битовыми полями. Тот же код будет выглядеть как "CTRL_A.option1=1; CTRL_A.option2=1;", но при этом, как всегда, есть нюанс - каждый бит будет ставиться отдельной инструкцией. Семь бит - семь команд.

а под arm те же самые пикоманы плодят дикие структуры, которые заполняют перед каждым вызовом любой функции (cmsys и рядом). и это при том, что на opencm3 код будет и короче и читаемее, и даже бинарник будет мельче.

Reply

ex0_planet June 21 2021, 09:34:48 UTC
Но там же не заставляют двоичные константы выяснять?

Reply

nicka_startcev June 21 2021, 09:45:47 UTC
не заставляют, но по факту похожий трэш бывает.
в смысле, по факту многие афтыри ставят.
весело бывает разбирать какой-нибудь "reg_foobar = 0x12345678ULL;" на важные в текущем контексте биты и случайно (или неслучайно) поднятые/опущеные по иным причинам биты.

Reply

ex0_planet June 21 2021, 09:48:48 UTC
Дык, там ты всегда можешь выкинуть хоть калокуб, хоть cmsys и написать всё на чистых регистрах, поскольку дефиниции никуда не деваются.

Тут же НЕТ других вариантов кроме как парсить трешатину FOOBAR=0x1234 или пилить сразу свои правильные хедеры.

А, и да. В родных примерах от mcrch попадается вообще всё что угодно, начиная от CTRL.bit = 1; и заканчивая asm("bsf CTRL, 7")

А еще там прямая битовая адресация есть, это когда CTRLbit объявлен непосредственно по адресу 0x88f (и в скобочках пояснение что это 0x111*8+7).

И всё это вперемешку.

Reply


balmerdx June 21 2021, 10:37:47 UTC
Можно в таком виде писать. Вроде ещё с С99 поддерживается.
r = (Reg){ .abc = {.a = 2, .b = 1} };

Ну и тут картинка, чтобы понятнее было

... )

Reply

ex0_planet June 21 2021, 11:53:49 UTC
А, я и забыл. Compound literal это называется.

Технически это работает, но тут поднасрал оптимизатор, точнее его отсутствие в бесплатной версии. В данном случае компилятор:

1) заводит сегмент данных с единственной анонимной переменной в которой лежит желаемый инициализатор;

2) Выделяет байт в стеке;

3) Читает байт из сегмента данных в W;

4) Сохраняет W на вершину стека;

5) Читает W с вершины стека;

6) Выбирает банк и пишет W в требуемый SFR (ура!);

7) Скукоживает всё обратно.

Reply


Leave a comment

Up