Если пописать входа\выхода ,то элементарно ...Сложно читать на китайском ,когда учил финский ...Хотя причесать схему не мешало бы ,особенно связи поверх элементов .
электронщик до мозга костей и не только
Внезапно оказывается, что есть те, кто качают и пробуют Hardella:
телезрители_интересуются.png
Обмен проверил -- работает. Выходы мигают, обмен данными между HOST и PRU идёт.
Входы как-нибудь потом, на свежую голову, проверю, ибо не хочется сдуру спалить ПЛК.
PRU берёт BOOL из основной программы и записывает его в другую переменную.
Снимок экрана 2016-10-26 в 0.30.41.png
В КДС замыкаем через NOT и получаем цветомузыку.
Снимок экрана 2016-10-26 в 0.31.37.png
Интервал мигания я сделал за счёт "0.25сек цикла PRU".
Снимок экрана 2016-10-26 в 0.32.07.png
Результат:
BzjkL7Mp4V.gif
PS. Как же блок питания пищит адски. Если его каким-нибудь клеем залить, то поможет?
Смотрю тут собрался клуб самоубийц-затейников. Прямой доступ из 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". Т.е. под "нормальную" многопоточность оно не рассчитано, и я решил, что там модель памяти простая, без хитростей. Иначе как вообще можно какой-то код написать, если возможны произвольные перестановки обращений к памяти, а команд для упорядочивания нет?