Цитата(juvf @ Jun 21 2018, 15:29)

Я же говорю, вы не читаете мои посты. Смотрите код. Наверно на си не понятно, напишу на русском.
Да пишите хоть на китайском, мне ваш код безразличен, это ведь не у меня при включении/выключении оптимизации он то работает, то нет. Мои исходники работают вне зависимости от того включена оптимизация или нет, у меня таких проблем нет.
Цитата(juvf @ Jun 21 2018, 15:29)

1)спим секунду. если что-то и было в спи, то давно вышло.
2)готовим данные....
3)проверяем бизи - waitSpi()
4)записываем в SPI1->DR данные. Данные пишутся в тх регистр, и потом копируются в шифтРегистр. в этот момент должен встать флаг бизи.
6)если ещё есть данные для передачи, goto 2)
Должен да не обязан. Где между п.4 и п.6 проверка, что бизи установился? "Вы мои посты читаете"? Я о таком кривом подходе как здесь ещё несколько постов назад написал. Вот как раз такой код и будет работать в зависимости от уровня оптимизации, количества передаваемых данных, фаз луны.... А, ну да, зачем читать и думать, ведь всё уже выяснено - компилятор виноват!

Цитата(adnega @ Jun 21 2018, 15:57)

Сказанное "В приведённом Вами примере баг в Вашем коде, а не в компиляторе" не желаете опровергнуть и извиниться?
Нет, не желаю так как причина баг не найдена. Вы не доказали никак вину компилятора. Да собственно там у вас и не баг в выполнении программы, а ошибка компиляции.
Цитата(juvf @ Jun 21 2018, 16:09)

Допустим такой код работает без оптимизации..... включили оптимизацию и появилась ваша гонка....
Гонки у Вас всегда есть, а не только при вкл. оптимизации. Почитайте в инете что это такое. Надо писать код, свободный от такого.
Цитата(juvf @ Jun 21 2018, 16:09)

Как её убрать? не нужно сразу читать SR, а нужно подождать начало передачи. Что делать? Поставить паузу.... Т.е. поставите оптимизатор, чтоб было быстрее, и потом поставите паузу, чтоб не было гонки? Я просто отключу оптимизатор в нужном месте и всё.
Правильно тут уже написали про Ваш стиль: Вместо подумать и понять как сделать правильно, замести проблему под ковёр.
В том цикле достаточно всего лишь после записи данных в SPI, дождаться начала их передачи (выставления бизи). Но конечно это кривой метод, так как потребует запрета прерываний (чтобы вся передача не проскочила за время внезапно возникшего прерывания).
А чтобы написать правильно и корректно нужно вообще весь алгоритм этот изменить, использовать другие флаги, прерывания и пр.
Цитата(juvf @ Jun 21 2018, 16:09)

Горе программист, которому для нахождения ошибки нужен оптимизатор.
Ещё горше тот, которому оптимизатор её нашёл, указал, а он прячет голову в песок.
Цитата(adnega @ Jun 21 2018, 16:34)

Телепаты в курсе, что это миландровский К1986ВЕ92 попил мою кровушку.
И DSB/DMB не спасают?
Цитата(adnega @ Jun 21 2018, 16:56)

Запишется-прочитается на HCLK, но реальное железо отработает, только когда на него клок придет с предделителя.
Тогда должны быть какие-то статусные биты, говорящие о завершении операции периферией.