Смотрю тут собрался клуб самоубийц-затейников. Прямой доступ из PRU в программу нельзя так делать.
БП можно просто нагрузить по линии 24В.
Смотрю тут собрался клуб самоубийц-затейников. Прямой доступ из PRU в программу нельзя так делать.
БП можно просто нагрузить по линии 24В.
Тролль-наседка, добрый, нежный и ласковый
Я не использую подход "поменять у другого потока переменную на ходу".
Я использую подход "обмена сообщениями". Т.е. передаём в другой поток информацию, что "новые значения готовы" -- он читает/пишет когда у него есть время и когда у него ничего не сломается.
Слова "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". Т.е. под "нормальную" многопоточность оно не рассчитано, и я решил, что там модель памяти простая, без хитростей. Иначе как вообще можно какой-то код написать, если возможны произвольные перестановки обращений к памяти, а команд для упорядочивания нет?