
Сообщение от
Вольд
Код для PRU можно писать на ST ?
И да и нет.
Если есть ST код, то его можно вручную перевести на PRU-понятный ассемблер.
Но
1) ST код нужен и для общего понимания, и для того, чтобы в КДС эмуляция работала
2) Переводить ST на ассемблер проще, чем сразу писать на asm
Примерно так (я исключил половину строк-комментариев, которые нужны для связки PRU-КДС. Привет Владиславу, если можно со спец комментариями выкладывать, то могу и с ними):
Код:
.origin 0
.entrypoint __INIT_PROGRAM
;include "standart_classes.m"
#include "Defs.h"
#define enableIn R1.b0
#define quantityIn R1.w0
#define out R1.b0
#define readyOut R1.b0
#define qtyLeft R1.w0
;FB_WORKTIME=9
;FB_NAME=PRU_GENER_BURST
__INIT_PROGRAM:
QBEQ _NEED_STOP, enableIn, 0 //% если сказали выключатьс_, идём выключатьс_
QBEQ _BURST_DONE, qtyLeft, 0 //% если импульсы кончились, идём ждать передёргивани_ enable
SUB qtyLeft, qtyLeft, 1 //% минус импульс
QBA _FINISH_5TICK //%
_BURST_DONE: ; 3-ий такт
QBEQ _FINISH_4TICK, readyOut, 1 //% пока ready не сбросилось, ждём передёргивани_ enable
LSL qtyLeft, quantityIn, 1 //% qtyLeft := quantity * 2
QBA _FINISH_6TICK //%
_NEED_STOP: ; 2-ой такт
LDI qtyLeft, 0 //% останавливаемс_ -- обнул_ем qtyLeft
_FINISH_3TICK: ; 3ий такт
ADD temp, temp, 0 //% NOP
_FINISH_4TICK: ; 4ый такт
ADD temp, temp, 0 //% NOP
_FINISH_5TICK: ; 5ый такт
ADD temp, temp, 0 //% NOP
_FINISH_6TICK: ; 6ый такт
MIN temp.w0, qtyLeft, 1 //% Смотрим, осталось ли что генерировать
XOR readyOut, temp.b0, 0 //% readyOut := MIN(qtyLeft, 1) XOR 1 == qtyLeft = 0
ADD temp.w0, qtyLeft, 0 //% загружаем qtyLeft в регистр, чтобы потом считать младший бит
AND out, temp.b0, 1 //% out := qtyLeft.0