[uquote="Chettuser",url="/forum/viewtopic.php?p=3695815#p3695815"]Как переписать дефайн, чтобы заработало?[/uquote]Оба варианта рабочие. Ошибка скорее всего где-то в другом месте по коду выше. Это и есть слабое место макросов - плохо отлаживать. Во втором варианте аргумент cd надо в скобки взять.
Обрати внимание, я включил интуицию и предположил, что тебе нужна 16-битная операция записи в регистр SPI->DR. Это делается так как у меня в функции, а не как у тебя в макросе. Ну и (data|0x00) это прикол такой?
ЗЫ: На самостоятельную проработку предлагаю подумать что будет с таким применением твоего макроса и функции.
data|0x00 - по шаблону написал, на время отладки, чтобы не путаться.
Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.
[uquote="Chettuser",url="/forum/viewtopic.php?p=3696000#p3696000"]Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.[/uquote]Вот так новость, а мы пользуемся и не подозреваем.
[uquote="Reflector",url="/forum/viewtopic.php?p=3696015#p3696015"]Конечно, только эта функция не рабочая, volatile нельзя пропускать:[/uquote]Согласен, просто IAR такие вещи "прощает" и при компиляции им эта функция рабочая. А так да, volatile, конечно же.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3696100#p3696100"]а мы пользуемся и не подозреваем.[/uquote]
Я переправил 0b100000000 на 0x100 и заработало, ЧЯДНТ?
(В двоичном виде удобнее менять регистры дисплея, чем писать простыни для изменения пары бит, как это любят делать программеры)
[uquote="Chettuser",url="/forum/viewtopic.php?p=3696000#p3696000"]Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.[/uquote]
Не gcc, а С++14.
Тссс, я плавно подвожу либо к включению С++ режима компилятора, либо обновлению последнего. Но я уже даже забыл когда он С++14 не поддерживал и где такую древнюю версию можно откопать.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3696152#p3696152"]и где такую древнюю версию можно откопать.[/uquote]
С официального сайта с ограничением )
Потенциальный источник ошибок. Лучше правую часть приводить к левой:
"*(volatile uint16_t*)&SPI1->DR = cd;" => "SPI1->DR = (decltype(SPI1->DR))cd;" или просто "SPI1->DR = (uint16_t)cd;"; эстеты могут использовать static_cast.
Нет, так не прокатит. Регистр SPI_DR чувствителен к разрядности команды записи в него. Правая часть автоматом из uint32_t во время записи командой STRH или STRB обрежется до необходимых 16 и 8 бит.
Насчёт volatile при записи по указателю надо бы стандарт почитать на досуге. Iar, например, "понимает", что если я пишу по указателю, то это не просто так.
Добавлено after 7 hours 2 minutes 45 seconds:
Проделел эксперимент.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3697189#p3697189"]IAR делает 9 операций записи, GCC три. Комментарии излишни.[/uquote]
Кстати, volatile не работает в constexpr контексте, потому из языка его выпиливают, в С++20 большинство volatile уже deprecated, вместо него предлагают использовать функции volatile_load/store(), как в Rust.