[personal profile] ex0_planet
Меня тут жизнь заставила потрогать компилятор XC8 от майкрочипа для мелких контроллеров. Это, я вам скажу, целый отдельный мир в себе. Зато я теперь понимаю, откуда на форумах тонны говнокода с двоичными или шестнадцатиричными константами, а разбуженный внезапно ночью пикоман будет бормотать что-то типа "0xA8 в регистр 0xBB включает режим синхронизации SPI по переднему фронту". Они, мать их, похоже что учат эти константы, потому что иначе никак.

Трудности начинаются с самого начала — с доступа к периферийным регистрам. Суть в том, что нормальные люди не пытаются изобретать колёса от велосипеда и тупо перечисляют в заголовочных файлах битовые маски и смещения, что приводит к самоочевидному коду типа "CTRL_A = (1<<OPTION1) | (1<<OPTION2);"

Но это нормальные люди. Пикоманы же пытаются сделать "удобно" и делают промежуточные структуры с битовыми полями. Тот же код будет выглядеть как "CTRL_A.option1=1; CTRL_A.option2=1;", но при этом, как всегда, есть нюанс — каждый бит будет ставиться отдельной инструкцией. Семь бит — семь команд.

И вот тут мне жалко не памяти и не машинных тактов — при таком подходе упускается из виду тот простой факт, что разные биты в регистре контролируют разные части периферии, и зачастую (как правило всегда) должны быть записаны одновременно. Иначе привет разные глитчи, баги и взбрыки самых разных форм цветов и размеров, просто потому что пока мы по одному пишем остальные биты, уже инициализированная часть периферии начинает себе там что-то думать или даже действовать.

Альтернатива? Конечно есть. Можно записать целиком слово в регистр, для этого надо посмотреть в даташит, выяснить позицию нужных битов, просуммировать это всё у себя в голове и написать простую и понятную команду:
CTRL_A = 0xA6;

Ну, или, для эстетов
CTRL_A = 0b00100010;


Пикоманы, как есть пикоманы.

Date: 2021-06-20 06:25 pm (UTC)
stanislavvv: (Default)
From: [personal profile] stanislavvv
Э... Нормальные люди, по-моему, даже сдвиги не используют (переменная в коде - промежуточная, LCD_* - задефайнены на соответствующие SPI_*):

    reg_cr1 = (
            SPI_CR1_BIDIMODE |
            SPI_CR1_BIDIOE |
            LCD_BYTEORDER |
            SPI_CR1_SSM |
            SPI_CR1_SSI |
            SPI_CR1_BAUDRATE_FPCLK_DIV_256 |
            SPI_CR1_MSTR |
            LCD_CLK_POL |
            LCD_CLK_PHA
          );


Код - из проекта для stm32 на libopencm3.

Прагматика

Date: 2021-06-21 07:04 am (UTC)
From: [personal profile] russiandesman
Если месье собирается и дальше с этим жить -- можно нафигачить на (столь вами нелюбимом) питончике скрипт, который на основе странных хедеров напилит нестранных для 90% периферии, оставшиеся 10% поправить руками, ну и пользоваться.
А если не жить, а палкой потыкать -- поддержу, затейники разные встречаются.
Из смешного про битфилды -- стандарт любезно не настаивает на их порядке. В рамках одного компилятора конечно и хрен бы с ним, но сам подход настораживает.

Date: 2021-06-21 07:48 am (UTC)
vit_r: default (Default)
From: [personal profile] vit_r
Дебильные сокращения используются людьми во всех областях и бухгалтер скажет "Это надо заносить не в 1038, а в 5601", и адвокаты говорят про "231 с подозрением на 238", и менеджеры "Перенсём бюджет с RTM на FRT, потому что его надо закончить через полгода".

Profile

ex0_planet

April 2023

S M T W T F S
      1
234567 8
910111213 1415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 24th, 2026 11:44 pm
Powered by Dreamwidth Studios