Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
потому что выше у вас написано >>>> "PRU берёт BOOL из основной программы и записывает его в другую переменную."

но смысл поста Владислава в том, что нужно, как минимум понимать, что будет с алгоритмом, если ему из другого потока значение переменных менять, а в общем случае - проклясть и не использовать сей "метод"
Я не использую подход "поменять у другого потока переменную на ходу".
Я использую подход "обмена сообщениями". Т.е. передаём в другой поток информацию, что "новые значения готовы" -- он читает/пишет когда у него есть время и когда у него ничего не сломается.

Слова "PRU берёт BOOL из основной программы" выражают сущность происходящего, а не детали реализации. Сам факт обмена данными "скрыт" от пользователя в компиляторе.

Т.е. ни о каком "изменении переменных прямо посреди вычислений" речи не идёт.

На стороне PRU обменом занимается такой код:
Снимок экрана 2016-10-26 в 16.42.21.png

Т.е. PRU работает исключительно с локальной памятью, и исключительно со своими переменными.
Само по себе PRU читает/пишет только, если видит, что sys_transferState = PRU_RAM_TRANSFER_STATE.PRU_READWRITE

На КДС стороне выглядит так:
Снимок экрана 2016-10-26 в 16.45.36.png

И, да, я тестировал word tearing (т.е. ситуацию, когда PRU поочерёдно пишет 0xFFFFFFFF и 0x00000000, а КДС читает). В КДС палёных, полузаписанных и т.п. значений (0xffff0000) не приходило.


Т.е. мой подход опирается на следующее:
1) Чтение/запись DWORD атомарны (всегда читается/записывается полное значение)
2) Чтение/запись упорядочены. Например, если мы в PRU выполнили x=1; y=42, а потом на HOST стороне прочитали 42 из ячейки y, то чтение x должно вернуть 1. Иначе говоря, PRU/HOST не переупорядочивает чтение/запись PRU DRAM.

К сожалению, по вопросам "атомарности" и "семантики модели памяти" в спецификации на AM1808 ничего не нашёл. Да и у самого PRU ядра нет ни операций "compare and set", ни операций "LL/SC". Т.е. под "нормальную" многопоточность оно не рассчитано, и я решил, что там модель памяти простая, без хитростей. Иначе как вообще можно какой-то код написать, если возможны произвольные перестановки обращений к памяти, а команд для упорядочивания нет?