Saltar al contenido principal

ISA del Runtime

La fuente canónica para esta página es firmware/lib/zplc_core/include/zplc_isa.h.

En ZPLC v1.5.0, el release usa ese contrato público para definir:

  • el layout de memoria de la VM
  • los registros reservados del sistema
  • la familia de opcodes válidos
  • los IDs de tipos compartidos y sus límites
  • el formato binario .zplc

Qué fija el header hoy

zplc_isa.h expone actualmente estas constantes de versión del contrato ISA:

  • ZPLC_VERSION_MAJOR = 1
  • ZPLC_VERSION_MINOR = 0

Eso describe la versión del contrato binario/ISA, no la versión comercial completa del release.

Layout de memoria de la VM

La ISA reserva cinco regiones lógicas con bases públicas y tamaños definidos por contrato:

RegiónBaseTamañoFuente canónica
IPI (Input Process Image)0x00000x1000 (4 KiB)ZPLC_MEM_IPI_BASE, ZPLC_MEM_IPI_SIZE
OPI (Output Process Image)0x10000x1000 (4 KiB)ZPLC_MEM_OPI_BASE, ZPLC_MEM_OPI_SIZE
WORK0x2000configurable, default 0x2000ZPLC_MEM_WORK_BASE, ZPLC_MEM_WORK_SIZE
RETAIN0x4000configurable, default 0x1000ZPLC_MEM_RETAIN_BASE, ZPLC_MEM_RETAIN_SIZE
CODE0x5000configurable, default 0xB000ZPLC_MEM_CODE_BASE, ZPLC_MEM_CODE_SIZE

Registros de sistema reservados

Los últimos 16 bytes de la IPI (0x0FF0 a 0x0FFF) están reservados para información del scheduler/runtime:

RegistroDirecciónPropósito
ZPLC_SYS_CYCLE_TIME0x0FF0tiempo del último ciclo en microsegundos
ZPLC_SYS_UPTIME0x0FF4uptime del sistema en milisegundos
ZPLC_SYS_TASK_ID0x0FF8identificador de la tarea actual
ZPLC_SYS_FLAGS0x0FF9flags de estado del runtime

Flags públicos definidos hoy:

  • ZPLC_SYS_FLAG_FIRST_SCAN
  • ZPLC_SYS_FLAG_WDG_WARN
  • ZPLC_SYS_FLAG_RUNNING

Familias de opcodes

La enumeración zplc_opcode_t agrupa las instrucciones públicas en familias claras:

FamiliaEjemplosRol
SistemaOP_NOP, OP_HALT, OP_BREAK, OP_GET_TICKScontrol básico y depuración
PilaOP_DUP, OP_DROP, OP_SWAP, OP_OVER, OP_ROTmanipulación del stack
Acceso indirectoOP_LOADI8, OP_LOADI16, OP_LOADI32, OP_STOREI8, OP_STOREI16, OP_STOREI32direccionamiento calculado
StringsOP_STRLEN, OP_STRCPY, OP_STRCAT, OP_STRCMP, OP_STRCLRoperaciones seguras sobre STRING
AritméticaOP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MODentero y punto flotante
Lógico/bitwiseOP_AND, OP_OR, OP_XOR, OP_NOT, OP_SHL, OP_SHR, OP_SARbooleanos y bits
ComparaciónOP_EQ, OP_NE, OP_LT, OP_LE, OP_GT, OP_GE, OP_LTU, OP_GTUdecisiones de control
Saltos y llamadasOP_JMP, OP_JZ, OP_JNZ, OP_CALL, OP_RET, OP_JR, OP_JRZ, OP_JRNZflujo de ejecución
ConversiónOP_I2F, OP_F2I, OP_I2B, OP_EXT8, OP_EXT16, OP_ZEXT8, OP_ZEXT16adaptación de tipos
ComunicaciónOP_COMM_EXEC, OP_COMM_STATUS, OP_COMM_RESETejecución de FBs de comunicación

La ISA también fija el tamaño del operando por rango de opcode:

  • 0x00-0x3F: sin operando
  • 0x40-0x7F: operando de 8 bits
  • 0x80-0xBF: operando de 16 bits
  • 0xC0-0xFF: operando de 32 bits

Tipos y límites públicos

El header también publica límites que la toolchain y el runtime comparten:

  • ZPLC_STACK_MAX_DEPTH para el stack de evaluación
  • ZPLC_CALL_STACK_MAX para el stack de llamadas
  • ZPLC_MAX_BREAKPOINTS para la capacidad de depuración
  • IDs de tipos IEC como ZPLC_TYPE_BOOL, ZPLC_TYPE_INT, ZPLC_TYPE_DINT, ZPLC_TYPE_REAL, ZPLC_TYPE_TIME y ZPLC_TYPE_STRING

Para STRING, la ISA fija un layout seguro con:

  • longitud actual en offset 0
  • capacidad máxima en offset 2
  • datos en offset 4

Contrato del archivo .zplc

El binario .zplc usa estructuras públicas empaquetadas en el mismo header:

  • zplc_file_header_t
  • zplc_segment_entry_t
  • zplc_task_def_t
  • zplc_iomap_entry_t
  • zplc_tag_entry_t

Segmentos públicos definidos hoy:

  • ZPLC_SEG_CODE
  • ZPLC_SEG_DATA
  • ZPLC_SEG_BSS
  • ZPLC_SEG_RETAIN
  • ZPLC_SEG_IOMAP
  • ZPLC_SEG_SYMTAB
  • ZPLC_SEG_DEBUG
  • ZPLC_SEG_TASK
  • ZPLC_SEG_TAGS

Qué implica para la documentación v1.5

Cuando la documentación de v1.5 haga claims sobre bytecode, layout de memoria, límites de stack, breakpoints o formato .zplc, esos claims tienen que salir de zplc_isa.h y no de descripciones aspiracionales.

No documentes una ISA imaginaria que el header público todavía no define.

Para el contrato de carga del binario, complementá esta página con: