Size: a a a

2021 February 08

VK

Viacheslav Kaloshin in Embedded Group
Alexander
Имплементацию функции посмотри.
Если они используют DMA - то был глюк, когда транзакция DMA считалась завершенной по передаче из памяти в периферию, а не когда фактически данные в порт ушли.
я специально блокирующую вызвал. в итоге код "дернуть ножку - передать - дернуть ножку", что прекрасно работает на мелких процах, на мощном превратился в "поток1) дернуть ножку дернуть ножку поток 2) передать"
источник

A

Alexander in Embedded Group
Viacheslav Kaloshin
я специально блокирующую вызвал. в итоге код "дернуть ножку - передать - дернуть ножку", что прекрасно работает на мелких процах, на мощном превратился в "поток1) дернуть ножку дернуть ножку поток 2) передать"
Еще у тебя оптимизатор мог выбросить Delay, например.
Так тоже иногда бывает
источник

VK

Viacheslav Kaloshin in Embedded Group
Alexander
Это нюансы работы с периферией, а не "многопоточность"

Код исполняется инструкция за инструкцией на одном ядре.
ну в общем, пока сам не напорешься , все равно не поверишь 🙂 а я с этими "нюансами" уже второй месяц воюю
источник

SK

Stas Koynov in Embedded Group
без барьеров компилятор в праве некоторые не волотильные и т.п инструкции даже менять местами. он не видит разницы
источник

VK

Viacheslav Kaloshin in Embedded Group
Alexander
Еще у тебя оптимизатор мог выбросить Delay, например.
Так тоже иногда бывает
я код специально привел. и как раз без delay и происходит на ножках фигня 🙂
источник

VK

Viacheslav Kaloshin in Embedded Group
Stas Koynov
без барьеров компилятор в праве некоторые не волотильные и т.п инструкции даже менять местами. он не видит разницы
я код привел, если что 🙂
источник

LZ

Leonid Zaliubovskii in Embedded Group
Stas Koynov
без барьеров компилятор в праве некоторые не волотильные и т.п инструкции даже менять местами. он не видит разницы
Даже больше скажу. Проц транзакции в память может реордерить для более оптимального заполнения шины
источник

SK

Stas Koynov in Embedded Group
вот расписал бы его. щас понять где есть что... у тебя запись в SPI потом дир ног. и ты говоришь что у тебя дир, и только потом SPI?
источник

LZ

Leonid Zaliubovskii in Embedded Group
В старших процах есть специальный тип памяти для mpu strong ordered и device чтобы избежать этого.

М7 ещё не трогал, но если есть mpu - сие может помочь
источник

SK

Stas Koynov in Embedded Group
в асме барьеров я не вижу.
источник

A

Alexander in Embedded Group
Viacheslav Kaloshin
я код специально привел. и как раз без delay и происходит на ножках фигня 🙂
Ну и GPIO может работать помедленнее чем блок SPI (в зависимости от тактирования).

Т.е. тут с высокой вероятностью аппаратный прикол.
источник

LZ

Leonid Zaliubovskii in Embedded Group
Alexander
Ну и GPIO может работать помедленнее чем блок SPI (в зависимости от тактирования).

Т.е. тут с высокой вероятностью аппаратный прикол.
Который можно увидеть осцилом, кмк
источник

VK

Viacheslav Kaloshin in Embedded Group
Stas Koynov
вот расписал бы его. щас понять где есть что... у тебя запись в SPI потом дир ног. и ты говоришь что у тебя дир, и только потом SPI?
наоборот. дергаем ножку (там CS) передаем, дергаем назад. в результате ногодрыг и передача в разных потоках
источник

LZ

Leonid Zaliubovskii in Embedded Group
Viacheslav Kaloshin
наоборот. дергаем ножку (там CS) передаем, дергаем назад. в результате ногодрыг и передача в разных потоках
После дергаем ножку попробуй вставить __dsb(0x0f); intrinsic
источник

LZ

Leonid Zaliubovskii in Embedded Group
И перед поднятием ноги тоже его.
источник

LZ

Leonid Zaliubovskii in Embedded Group
Хуже не будет ☺️
источник

SK

Stas Koynov in Embedded Group
для теста поставь общий барьер памяти, который DMB между тем что ты хочешь чтоб было последовательно, если после барьера такая беда, то как сказали выше, просто скорость переферии разная и тут проц как бы не виноват. ему сказали он сделал, если выше кто-то не успевает. то тут делэй ставить только
источник

LZ

Leonid Zaliubovskii in Embedded Group
Stas Koynov
для теста поставь общий барьер памяти, который DMB между тем что ты хочешь чтоб было последовательно, если после барьера такая беда, то как сказали выше, просто скорость переферии разная и тут проц как бы не виноват. ему сказали он сделал, если выше кто-то не успевает. то тут делэй ставить только
Dsb круче dmb в этом плане
источник

LZ

Leonid Zaliubovskii in Embedded Group
Ибо dmb только порядок доступа к памяти менежит. Dsb требует завершения всех транзакций
источник

SK

Stas Koynov in Embedded Group
DMB тоже завершает все обращения к памяти до следующего обращения к ней. Тогда как DSB до следующей инструкции(которая следует за DSB)!
так как запись в ГПИО это работа с памятью я думаю DMB будет достаточно
источник