Create P-Code execution helper in apps/interpreters/prun; The P-Code binary format is functional except that there are still some modularity and kernel build issues that need to be addressed.

This commit is contained in:
Gregory Nutt 2014-05-09 08:52:11 -06:00
parent a65262c899
commit d8956db518
15 changed files with 487 additions and 51 deletions

View File

@ -911,3 +911,6 @@
* apps/system/i2c/i2c_get.c: Fix to show the updated register address on
each fetch (vs. showing the same starting address each time). From
Ryan VanSickle (2014-5-8).
* apps/interpreters/prun and apps/include/interpreters/prun.h: Broke out
the P-code execution logic from apps/examples/pashello and moved it to
these directorit where it can be used more generally (2014-5-9).

View File

@ -6,8 +6,25 @@
config EXAMPLES_PASHELLO
bool "Pascal \"Hello, World!\" example"
default n
depends on INTERPRETERS_PCODE
select INTERPRETERS_PRUN
---help---
Enable the Pascal \"Hello, World!\" example
if EXAMPLES_PASHELLO
config EXAMPLES_PASHELLO_VARSTACKSIZE
int "P-Code variable stack size"
default 1024
---help---
This size of the P-Code variable storage area to be allocated by the
P-Code runtime.
config EXAMPLES_PASHELLO_STRSTACKSIZE
int "P-Code string stack size"
default 128
---help---
This size of the P-Code string stack area to be allocated by the
P-Code runtime.
endif

View File

@ -43,20 +43,18 @@
#include <stdlib.h>
#include <debug.h>
#include "pexec.h"
#include "pedefs.h"
#include "pashello.h"
#include <apps/interpreters/prun.h>
/****************************************************************************
* Definitions
****************************************************************************/
#ifndef CONFIG_PASHELLO_VARSTACKSIZE
# define CONFIG_PASHELLO_VARSTACKSIZE 1024
#ifndef CONFIG_EXAMPLES_PASHELLO_VARSTACKSIZE
# define CONFIG_EXAMPLES_PASHELLO_VARSTACKSIZE 1024
#endif
#ifndef CONFIG_PASHELLO_STRSTACKSIZE
# define CONFIG_PASHELLO_STRSTACKSIZE 128
#ifndef CONFIG_EXAMPLES_PASHELLO_STRSTACKSIZE
# define CONFIG_EXAMPLES_PASHELLO_STRSTACKSIZE 128
#endif
/****************************************************************************
@ -67,33 +65,6 @@
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: prun
*
* Description:
* This function executes the P-Code program until a stopping condition
* is encountered.
*
****************************************************************************/
static void prun(FAR struct pexec_s *st)
{
int errcode;
for (;;)
{
/* Execute the instruction; Check for exceptional conditions */
errcode = pexec(st);
if (errcode != eNOERROR) break;
}
if (errcode != eEXIT)
{
printf("Runtime error 0x%02x -- Execution Stopped\n", errcode);
}
}
/****************************************************************************
* Public Functions
****************************************************************************/
@ -105,29 +76,23 @@ static void prun(FAR struct pexec_s *st)
int pashello_main(int argc, FAR char *argv[])
{
FAR struct pexec_s *st;
int exitcode = EXIT_SUCCESS;
int ret;
/* Register the /dev/hello driver */
hello_register();
/* Load the POFF file */
/* Execute the POFF file */
st = pload("/dev/hello", CONFIG_PASHELLO_VARSTACKSIZE, CONFIG_PASHELLO_STRSTACKSIZE);
if (!st)
ret = prun("/dev/hello", CONFIG_EXAMPLES_PASHELLO_VARSTACKSIZE,
CONFIG_EXAMPLES_PASHELLO_STRSTACKSIZE);
if (ret < 0)
{
fprintf(stderr, "pashello_main: ERROR: Could not load /dev/hello\n");
exit(1);
fprintf(stderr, "pashello_main: ERROR: Execution failed\n");
exitcode = EXIT_FAILURE;
}
printf("pashello_main: /dev/hello Loaded\n");
printf("pashello_main: Interpreter started:\n");
/* And start program execution */
prun(st);
/* Clean up resources used by the interpreter */
printf("pashello_main: Interpreter terminated");
pexec_release(st);
return 0;
return exitcode;
}

View File

@ -50,6 +50,6 @@
/* Defined in device.c */
extern void hello_register(void);
void hello_register(void);
#endif /* __EXAMPLES_PASHELLO_H */

View File

@ -0,0 +1,90 @@
/****************************************************************************
* apps/include/interpreters/prun.h
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __APPS_INCLUDE_INTERPRETERS_PRUN_H
#define __APPS_INCLUDE_INTERPRETERS_PRUN_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: prun
*
* Description:
* Execute/interpret a P-Code file. This function does not return until
* the P-code program terminates or until a fatal error occurs.
*
* Input Parameters:
* exepath - The full path to the P-Code binary.
* varsize - Size of the P-Code variable stack
* strsize - the size of the P-Code string stack.
*
* Returned Value:
* OK if the P-Code program successfully terminated; A negated errno value
* is returned on the event of any failure.
*
****************************************************************************/
int prun(FAR char *exepath, size_t varsize, size_t strsize);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __APPS_INCLUDE_INTERPRETERS_PRUN_H */

View File

@ -15,5 +15,6 @@ config INTERPRETERS_PCODE
Pascal run-time code.
if INTERPRETERS_PCODE
source "$APPSDIR/interpreters/prun/Kconfig"
endif

View File

@ -38,6 +38,10 @@ ifeq ($(CONFIG_INTERPRETERS_PCODE),y)
CONFIGURED_APPS += interpreters/pcode
endif
ifeq ($(CONFIG_INTERPRETERS_PRUN),y)
CONFIGURED_APPS += interpreters/prun
endif
ifeq ($(CONFIG_INTERPRETERS_FICL),y)
CONFIGURED_APPS += interpreters/ficl
endif

View File

@ -37,7 +37,7 @@
# Sub-directories containing interpreter runtime
SUBDIRS = pcode ficl
SUBDIRS = pcode prun ficl
# Create the list of installed runtime modules (INSTALLED_DIRS)

View File

@ -60,3 +60,8 @@ pcode
CONFIG_EXAMPLES_PASHELLO=y
CONFIG_INTERPRETERS_PCODE=y
prun
This directory holds some simple, convenience functions to simplify and
standardize the interaction with the P-Code library.

13
interpreters/prun/.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
/Make.dep
/.depend
/.built
/*.o1
/*.asm
/*.obj
/*.rel
/*.lst
/*.sym
/*.adb
/*.lib
/*.src
/*.err

14
interpreters/prun/Kconfig Normal file
View File

@ -0,0 +1,14 @@
#
# For a description of the syntax of this configuration file,
# see misc/tools/kconfig-language.txt.
#
config INTERPRETERS_PRUN
bool "Pascal P-Code interpreter"
default n
depends on INTERPRETERS_PCODE
---help---
Build the Pascal P-Code interpreter / Virtual machine
if INTERPRETERS_PRUN
endif

105
interpreters/prun/Makefile Normal file
View File

@ -0,0 +1,105 @@
############################################################################
# apps/interpreters/prun/Makefile
#
# Copyright (C) 2014 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name NuttX nor the names of its contributors may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
############################################################################
-include $(TOPDIR)/.config
-include $(TOPDIR)/Make.defs
include $(APPDIR)/Make.defs
# Pascal P-Code interpreter / Virtual machine
ifeq ($(WINTOOL),y)
INCDIROPT = -w
endif
CFLAGS += ${shell $(INCDIR) $(INCDIROPT) "$(CC)" \
"." \
"$(APPDIR)$(DELIM)interpreters$(DELIM)pcode$(DELIM)include" \
"$(APPDIR)$(DELIM)interpreters$(DELIM)pcode$(DELIM)insn$(DELIM)include"}
ASRCS =
CSRCS = prun.c
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ifeq ($(CONFIG_WINDOWS_NATIVE),y)
BIN = ..\..\libapps$(LIBEXT)
else
ifeq ($(WINTOOL),y)
BIN = ..\\..\\libapps$(LIBEXT)
else
BIN = ../../libapps$(LIBEXT)
endif
endif
ROOTDEPPATH = --dep-path .
# Common build
VPATH =
all: .built
.PHONY: clean depend distclean
$(AOBJS): %$(OBJEXT): %.S
$(call ASSEMBLE, $<, $@)
$(COBJS): %$(OBJEXT): %.c
$(call COMPILE, $<, $@)
.built: $(OBJS)
$(call ARCHIVE, $(BIN), $(OBJS))
@touch .built
context:
.depend: Makefile $(SRCS)
@$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
@touch $@
depend: .depend
clean:
$(call DELFILE, .built)
$(call CLEAN)
distclean: clean
$(call DELFILE, Make.dep)
$(call DELFILE, .depend)
-include Make.dep

View File

@ -0,0 +1,34 @@
README
^^^^^^
hello.pas
This is a sample "Hello, World!" Pascal Program
hello.pex
This is the compiled, linked P-Code executable that results
when hello.pas is compiled.
hello.h
This file defines an initialized C array holds a copy of
hello.pex. This file as created by:
xxd -i hello.pex >hello.h
mkhello.sh
This is a scripts that can be used to rebuild both hello.pex
and hello.h.
device.c
The hello.pex file must be provided to the interpreter as a file
in the file system. Normally this would be done using real storage
medium. In this example, we will use device.c:
device.c implements a simple device driver. Reads from this device
will access the in-memory copy of hello.pex This device driver is
registered as /dev/prun in the pseudo filesystem.

130
interpreters/prun/prun.c Normal file
View File

@ -0,0 +1,130 @@
/****************************************************************************
* apps/system/prun/prun.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <debug.h>
#include <apps/interpreters/prun.h>
#include "pexec.h"
#include "pedefs.h"
#include "prun.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: prun
*
* Description:
* Execute/interpret a P-Code file. This function does not return until
* the P-code program terminates or until a fatal error occurs.
*
* Input Parameters:
* exepath - The full path to the P-Code binary.
* varsize - Size of the P-Code variable stack
* strsize - the size of the P-Code string stack.
*
* Returned Value:
* OK if the P-Code program successfully terminated; A negated errno value
* is returned on the event of any failure.
*
****************************************************************************/
int prun(FAR char *exepath, size_t varsize, size_t strsize)
{
FAR struct pexec_s *st;
int errcode;
int ret = OK;
/* Load the POFF file into memory */
st = pload(exepath, varsize, varsize);
if (!st)
{
bdbg("ERROR: Could not load %s\n", exepath);
return -ENOEXEC;
}
bvdbg("Loaded %s\n", exepath);
/* Execute the P-Code program until a stopping condition occurs */
for (;;)
{
/* Execute the instruction; Check for exceptional conditions */
errcode = pexec(st);
if (errcode != eNOERROR)
{
break;
}
}
if (errcode != eEXIT)
{
/* REVISIT: Select a more appropriated return errocode */
bdbg("ERROR: Runtime error 0x%02x -- Execution Stopped\n", errcode);
ret = -ENOEXEC;
}
/* Clean up resources used by the interpreter */
bvdbg("Execution terminated\n");
pexec_release(st);
return ret;
}

55
interpreters/prun/prun.h Normal file
View File

@ -0,0 +1,55 @@
/****************************************************************************
* examples/prun/prun.h
*
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#ifndef __EXAMPLES_PASHELLO_H
#define __EXAMPLES_PASHELLO_H
/****************************************************************************
* Included Files
****************************************************************************/
/****************************************************************************
* Definitions
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/* Defined in device.c */
extern void hello_register(void);
#endif /* __EXAMPLES_PASHELLO_H */