Линкер, кстати, Владимиру дали. Так что я вообще не понимаю проблемы!? Делаешь ФБ и вперёд. Запустить пару бат-файлов из Hardell-ы несложно.
Дмитрий Артюховский вот использует.
Линкер, кстати, Владимиру дали. Так что я вообще не понимаю проблемы!? Делаешь ФБ и вперёд. Запустить пару бат-файлов из Hardell-ы несложно.
Дмитрий Артюховский вот использует.
Тролль-наседка, добрый, нежный и ласковый
А вы посмотрите, что Дмитрий пишет:
Судя по этим словам, Дмитрий пишет один большой монолитный блок на ассемблере, и использует линкер не потому, что нравится, а потому, что выбора у него нет. И? Этот "ФБ PRU_DIMAS и в нем голый ассемблер с минимальным использованием описателей" надёжнее, чем аналогичный код на ST?
Т.е. не я один пошёл по варианту "неиспользования предоставленных блоков".
Очевидно, что:
1) Для среднего инженера-программиста вариант "написать на ассемблере" недостижим
2) При написании монолитного кода на ассемблере гораздо проще ошибиться, чем при написании того же кода на ST или FBD языке
3) Требование использовать "линкер" только для того, чтобы "использовать" лишь усложняет общую систему, и добавляет нетривиальные проблемы. Кто, например, тестирует сам линкер?
Как тестировать, что ваш линкер правильно слинковал мою конкретную программу? Да и вообще, линкер привязан к windows, что создаёт проблемы при запуске на macos.
Последний раз редактировалось Владимир Ситников; 15.09.2016 в 10:44.
Объясню почему невозможно использовать "линкер".
Жизненный цикл кода (жирным я выделил, собственно, "секретный инструмент"; всё остальное -- общедоступно):
Я без проблем могу из Hardella сгенерировать всю программу под видом одного ФБ (и, соответственно, program.p будет состоять из одного гордого вызова этого самого ФБ), но это всё равно не позволит мне создавать PRU0.prg из Hardella.Код:assember + СЕКРЕТНЫЙ ИНСТРУМЕНТ ==> FB_ARRAY.bin КДС_CFC.EXP + target.trg + editor.exe ==> program.p program.p + FB_ARRAY.bin + compilator.exe ==> PRU0.prg КДС_CFC.EXP -- это программа из PRU блоков, составленная в КДС program.p -- это по сути описание того, какие ФБ вызывать и как они соединены между собой FB_ARRAY.bin -- содержит код самих блоков и ещё что-то
Дело в том, что мой ФБ нужно каким-то образом завернуть в FB_ARRAY.bin файл, а инструмент, который это делает секретный.
Иными словами:
1) Я могу генерировать и публиковать PRU0.prg для законченных программ. Например, я могу опубликовать PRU0.prg для работы с ШД.
2) Я не могу встроить механизм генерации PRU0.prg в Hardella, т.к. для этого придётся публиковать "секретный инструмент создания FB_ARRAY.bin"
3) Если все эти песни пляски вокруг FB_ARRAY.bin сводятся только к тому, чтобы ублажить линкер, подсовывая ему программу из одного-единственного ФБ, то зачем такая сложность? Для повышения надёжности мы в цепочку добавляем 2 лишних звена под названиями FB_ARRAY.bin и program.p?
4) Ещё раз подчеркну, что я работаю в macos, и для меня секретный_инструмент.exe, editor.exe, compilator.exe создают проблему даже сами по себе -- на macos непросто запускать windows программы. Есть желающие проспонсировать развитие Hardella IDE? Подобные же "хоть чучелом, но без *.exe никак" весьма удручают.
Прошу провести натурные испытания.
pru_pulse_v1.zip
Порядок работы:
1) Заливаем PRU0.prg (как-то)
2) Подключаем ШД на fast output 3
2) Используем блок pru_pulse.lib для работы с ШД
CYCLE_LENGTH задаёт длительность единичного и нулевого значения на выходе. Оно указывается в тактах PRU. Вроде как PRU работает на частоте 150МГц, т.е. значение cycle_length=150 это импульсы по 1мкс.
Параметр CYCLE_LENGTH сейчас WORD, т.е. максимальное значение 65535, и, значит, возможна генерация частот в пределах 1кГц...1МГц
Если нужны более низкие частоты, то придётся перекомпилировать программу, а мне было немного лень, т.к. для этого нужно перезапускать bat'ники.
В pru_pulse один блок:
Код:FUNCTION_BLOCK PRU_PULSE (* Output will be generated to FAST OUTPUT 3 *) VAR_INPUT ENABLE: BOOL; CYCLE_LENGTH: WORD; (* PRU cycles *) QUANTITY: DWORD; END_VAR VAR_OUTPUT READY : BOOL; QUANTITY_LEFT: DWORD; (* for debugging *) END_VAR
Вышеобозначенное получено "официальным линкером".
Я ему скормил всю-всю программу как один ФБ.
Для примера, вот так выглядит pulse.p -- т.е. просто вызов одного моего ФБ.
А так выглядит "ассемблерный код" моего ФБ:Код:;include "target.trg" FBDECL #defFB PRU_PULSE PRU_PULSE /FBDECL SYNCLIST IN=R25 IN=R26 IN=R27 OUT=R28 OUT=R29 /SYNCLIST PROGRAMM PRU_PULSE /PROGRAMM
Да, да. Код целиком и полностью сгенерирован в Hardella, а линкеру я скормил пустой файл. Вроде, тот не подавился, и ладно.Код:.origin 0 .entrypoint __INIT_PROGRAM ;FB_WORKTIME=40 ;FB_NAME=PRU_PULSE __INIT_PROGRAM:
Обмен с PRU я сделал так. Тут, к сожалению, сделано наугад в надежде на то, что PRU_FB_GetParameter/PRU_FB_SetParameter будут читать/писать по нужным адресам в PRU памяти.
Код:TMP : DWORD; ... PRU_FB_GetParameter(pru_num:=0, index:=28, value:=ADR(TMP)); READY := TMP <> 0; PRU_FB_GetParameter(pru_num:=0, index:=29, value:=ADR(QUANTITY_LEFT)); PRU_FB_SetParameter(pru_num:=0, index:=25, value:=ADR(QUANTITY)); TMP := WORD_TO_DWORD(CYCLE_LENGTH); PRU_FB_SetParameter(pru_num:=0, index:=26, value:=ADR(TMP)); TMP := SEL(ENABLE, 0, 1); PRU_FB_SetParameter(pru_num:=0, index:=27, value:=ADR(TMP));
Последний раз редактировалось Владимир Ситников; 19.09.2016 в 13:10. Причина: fast output 1 -> fast output 3
Обмен с PRU так не работает. смотрим ФБ END_1_1 и понимаем 2 номера регистра, по которым идёт обмен.
Если надо больше - модифицируем ФБ соответственно.
Сама библиотека работает с любым номером регистра, если он задаётся и поддерживается ФБ END и опредёлен в программе в разделе
SYNCLIST
Копирование данных в PRU и из PRU происходит силами самой PRU. Через разделяемую память, куда пишет библиотека
Последний раз редактировалось Филоненко Владислав; 20.09.2016 в 09:34.
Тролль-наседка, добрый, нежный и ласковый
Последний раз редактировалось Владимир Ситников; 20.09.2016 в 09:47.