Skip to content

Commit

Permalink
Added target to compile zephyr against jerryscript.
Browse files Browse the repository at this point in the history
This patch contains a project in which you can run
a small js test inside the Arduino101.

Follows the Nuttx implementation to replicate a command
line in the Quark SE Lakemont architecture.

Everything is self contained in the targets/arduino_101 folder.
It has only been tested with the arduino 101 at the moment.

Check the README.md for a more detailed explanation of
how to compile and run it.

- Command line javascript run test.

Use test to get a default test.

Write any valid javascript in the shell and get it resolved and executed

- Support for qemu
- Added extra verbose mode on the demo function
- Support to build factory images that can be flashed with dfu-util
- Added a few extra examples on the README about commands that work.

Small fixes to readme and libc_support.c (#1)

- Added a few more instructions to the README.md for arduino_101
- Added the stdint.h include in libc_support.c
- Added parameter to check-vera.sh to check a specific folder
- Cleared the libc function duplication

JerryScript-DCO-1.0-Signed-off-by: Sergio Martinez [email protected]
  • Loading branch information
sergioamr committed Jun 6, 2016
1 parent 308bb3c commit 7583b63
Show file tree
Hide file tree
Showing 10 changed files with 629 additions and 1 deletion.
57 changes: 57 additions & 0 deletions targets/arduino_101/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Copyright © 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# use TAB-8
.DEFAULT_GOAL := all

ifndef ZEPHYR_BASE
$(error Missing zephyr base)
endif

# For testing without real hardware use qemu_x86 instead of arduino_101
BOARD ?= arduino_101

O ?= $(PROJECT_BASE)/outdir

ZEPHYR ?= $(ZEPHYR_BASE)
TYPE ?= release
JERRYHEAP ?= 16

ZEPHYRINC = $(ZEPHYR_BASE)/include
ZEPHYRLIB = $(ZEPHYR_BASE)/lib

SOURCE_DIR = ./targets/arduino_101/src

export JERRY_INCLUDE = $(CURDIR)/jerry-core/

MDEF_FILE = $(realpath $(SOURCE_DIR)/../prj.mdef)
CONF_FILE = $(realpath $(SOURCE_DIR)/../prj.conf)

ifdef V
$(info Zephyr)
$(info SOURCE_DIR=$(SOURCE_DIR))
$(info JERRY_INCLUDE=$(JERRY_INCLUDE))
$(info CONF_FILE =$(CONF_FILE))
endif

KERNEL_TYPE = micro

KBUILD_VERBOSE = $(V)

APP = main-zephyr.c

include ${ZEPHYR_BASE}/Makefile.inc

.PHONY = showconfig

183 changes: 183 additions & 0 deletions targets/arduino_101/Makefile.arduino_101
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# Copyright © 2016 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

.DEFAULT_GOAL := all

ifeq ($(.DEFAULT_GOAL),)
$(warning no default goal is set)
endif

ifeq ($(MAKECMDGOALS),qemu)
BOARD ?= qemu_x86
else
BOARD ?= arduino_101
BOARD_NAME ?= arduino_101
endif

ifeq ($(BOARD),qemu_x86)
BOARD_NAME ?= qemu_x86
endif

TYPE ?= release
JERRYHEAP ?= 16

# Include functionality like regular expressions
# check Jerry script documentation
#
# -cp
# -cp_minimal
# -cp_minimal-mem_stats
# -mem_stats
# -mem_stress_test

ifndef ZEPHYR_BASE
$(error Missing Zephyr base, did you source zephyr-env.sh? )
endif

VARIETY ?= -cp_minimal

INTERM = build/$(BOARD)/obj-$(BOARD)
OUTPUT = build/$(BOARD)

CC = $(CROSS_COMPILE)gcc

EXT_CFLAGS := -fno-asynchronous-unwind-tables -fno-omit-frame-pointer
EXT_CFLAGS += -fno-stack-protector -fno-strict-overflow -ffreestanding
EXT_CFLAGS += -fno-reorder-functions -fno-defer-pop -fdata-sections
EXT_CFLAGS += -ffunction-sections -fno-inline-functions

# TODO @sergioamr Read the arch and cflags from zephyr

ifeq ($(BOARD),qemu_x86)
CONFIG_TOOLCHAIN_VARIANT = x86
EXT_CFLAGS += -march=pentium
else
CONFIG_TOOLCHAIN_VARIANT = iamcu
EXT_CFLAGS += -march=lakemont -mtune=lakemont -miamcu -msoft-float
endif

EXT_CFLAGS += -mpreferred-stack-boundary=2 -mno-sse

EXT_CFLAGS += -Wall -Wno-format-zero-length -Wno-pointer-sign
EXT_CFLAGS += -Werror=format -Werror=implicit-int -Wno-unused-but-set-variable
EXT_CFLAGS += -Wno-main -Wno-strict-aliasing
EXT_CFLAGS += -Wno-error=format=

EXT_CFLAGS += $(TOOLCHAIN_CFLAGS)
EXT_CFLAGS += $(LIB_INCLUDE_DIR)
EXT_CFLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
EXT_CFLAGS += -isystem $(shell $(CC) -print-file-name=include-fixed)

-include $(ZEPHYR_BASE)/boards/$(BOARD_NAME)/Makefile.board
-include $(ZEPHYR_BASE)/scripts/Makefile.toolchain.$(ZEPHYR_GCC_VARIANT)

ZEPHYR_LIBC_INC = $(subst -I,,$(TOOLCHAIN_CFLAGS))
LIB_INCLUDE_DIR += -L $(CURDIR)/$(OUTPUT)

EXTERNAL_LIB = $(INTERM)/lib$(TYPE).external$(VARIETY)-entry.a
ZEPHYR_BIN = $(OUTPUT)/zephyr/zephyr.strip

PREFIX = $(TYPE)$(VARIETY)
LIBS = $(TYPE).external$(VARIETY)-entry $(PREFIX).jerry-core $(PREFIX).jerry-libm.lib $(TOOLCHAIN_LIBS) c

# TODO @sergioamr Change how we link the library to USER_LDFLAGS
# https://gerrit.zephyrproject.org/r/#/c/2048/

BUILD_CONFIG = O="$(OUTPUT)/zephyr" V=$(V) TOOLCHAIN_LIBS="$(LIBS)" LIB_INCLUDE_DIR="$(LIB_INCLUDE_DIR)"

.PHONY: all
all: jerry zephyr

$(EXTERNAL_LIB):
ifdef V
@echo "- JERRY SCRIPT -------------------------------------------------"
endif
mkdir -p $(INTERM)
mkdir -p $(OUTPUT)
cmake -B$(INTERM) -H./ \
-DENABLE_LTO=OFF \
-DENABLE_VALGRIND=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_VERBOSE_MAKEFILE=$(V) \
-DEXTERNAL_CMAKE_C_COMPILER=$(CC) \
-DEXTERNAL_CMAKE_C_COMPILER_ID=GNU \
-DEXTERNAL_CMAKE_SYSTEM_PROCESSOR=x86 \
-DEXTERNAL_MEM_HEAP_SIZE_KB=$(JERRYHEAP) \
-DEXTERNAL_COMPILE_FLAGS="$(EXT_CFLAGS)" \
-DEXTERNAL_CMAKE_SYSTEM_PROCESSOR=lakemont \
-DEXTERNAL_LIBC_INTERFACE="$(ZEPHYR_LIBC_INC)" \
-DCMAKE_TOOLCHAIN_FILE=build/configs/toolchain_external.cmake \
-DEXTERNAL_BUILD_ENTRY_FILE=./targets/arduino_101/src/jerry-entry.c

make -C $(INTERM) $(TYPE).external$(VARIETY) V=1
cp `cat $(INTERM)/$(TYPE).external$(VARIETY)/list` $(OUTPUT)/.
cp $(EXTERNAL_LIB) $(OUTPUT)/.

$(ZEPHYR_BIN):
ifdef V
@echo "- ZEPHYR -------------------------------------------------------"
endif
make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG)
@echo "Finished"
@file $(OUTPUT)/zephyr/zephyr.strip
@size $(OUTPUT)/zephyr/zephyr.strip

jerry: $(EXTERNAL_LIB)
@touch $(EXTERNAL_LIB)

zephyr: $(EXTERNAL_LIB) $(ZEPHYR_BIN)
@touch $(ZEPHYR_BIN)

qemu: $(EXTERNAL_LIB) $(ZEPHYR_BIN)
make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) qemu

flash: $(EXTERNAL_LIB) $(OUTPUT)/zephyr/zephyr.strip
make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) flash

usage:
help:
@echo Usage:
@echo showconfig Show parameters and configuration
@echo flash Flash into board
@echo all Compile jerryscript and zephyr

showconfig:
@echo "- CONFIGURATION ------------------------------------------------"
@echo "INTERM = $(INTERM)"
@echo "OUTPUT = $(OUTPUT)"
@echo "CC = $(CC) "
@echo "BOARD = $(ZEPHYR_BASE)/boards/$(BOARD)/Makefile.board "
@echo "TOOLCHAIN = $(ZEPHYR_BASE)/scripts/Makefile.toolchain.$(ZEPHYR_GCC_VARIANT) "
@echo "TOOLCHAIN_CFLAGS = $(TOOLCHAIN_CFLAGS) "
@echo "CROSS_COMPILE = $(CROSS_COMPILE) "
@echo "TOOLCHAIN_LIBS = $(TOOLCHAIN_LIBS) "
@echo "LIBS = $(LIBS) "
@echo "LIB_INCLUDE_DIR = $(LIB_INCLUDE_DIR) "
@echo "BUILD_CONFIG = $(BUILD_CONFIG) "
make -f ./targets/arduino_101/Makefile $(BUILD_CONFIG) showconfig

# TODO @sergioamr Temporal cleanup before finding why Zephyr is ignoring my
# outdir for the project
clean:
@echo "Clearing Jerryscript"
@rm -rf $(OUTPUT)
@rm -rf $(INTERM)
@rm -f ./targets/arduino_101/src/.*.o.cmd
@rm -f ./targets/arduino_101/src/*.o
@echo "Clearing Zephyr"
make -f ./targets/arduino_101/Makefile clean
make -f ./targets/arduino_101/Makefile pristine

mrproper:
make -f ./targets/arduino_101/Makefile mrproper
140 changes: 140 additions & 0 deletions targets/arduino_101/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
### About

This folder contains files to run JerryScript on Zephyr with
[Arduino 101 / Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101)

Zephyr project arduino 101
[Zephyr Arduino 101](https://www.zephyrproject.org/doc/board/arduino_101.html)

### How to build

#### 1. Preface

1, Directory structure

Assume `harmony` as the path to the projects to build.
The folder tree related would look like this.

```
harmony
+ jerry
| + targets
| + arduino_101
+ zephyr
```


2, Target board

Assume [Arduino 101 / Genuino 101](https://www.arduino.cc/en/Main/ArduinoBoard101)
as the target board.


#### 2. Prepare Zephyr

Follow [this](https://www.zephyrproject.org/doc/getting_started/getting_started.html) page to get
the Zephyr source and configure the environment.

Follow "Building a Sample Application" and check that you can flash the Arduino 101

Remember to source the zephyr environment.

```
source zephyr-env.sh
export ZEPHYR_GCC_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=<sdk installation directory>
```

#### 3. Build JerryScript for Zephyr

```
# assume you are in harmony folder
cd jerry
make -f ./targets/arduino_101/Makefile.arduino_101
```

This will generate the following libraries:
```
./build/arduino_101/librelease-cp_minimal.jerry-core.a
./build/arduino_101/librelease-cp_minimal.jerry-libm.lib.a
./build/arduino_101/librelease.external-cp_minimal-entry.a
```

The final Zephyr image will be located here:
```
./build/arduino_101/zephyr/zephyr.strip
```

#### 5. Flashing

Details on how to flash the image can be found here:
[Flashing image](https://www.zephyrproject.org/doc/board/arduino_101.html)

To be able to use this demo in hardware you will need the serial console
which will be generating output to Pins 0 & 1

Some examples of building the software

```
make -f ./targets/arduino_101/Makefile.arduino_101 clean
```

- Not using a Jtag and having a factory stock Arduino 101.

```
make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=arduino_101_factory
```

Follow the Zephyr instructions to flash using the dfu-util command.


- Using JTAG

There is a helper function to flash using the JTAG and Flywatter2

![alt tag](docs/arduino_101.jpg?raw=true "Example")
```
make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=arduino_101 flash
```

- Compiling and running with the emulator
```
make -f ./targets/arduino_101/Makefile.arduino_101 BOARD=qemu_x86 qemu
```


#### 6. Serial terminal

Test command line in a serial terminal.


You should see something similar to this:
```
Jerry Compilation May 26 2016 13:37:50
js>
```


Run the example javascript command test function
```
js> test
Script [var test=0; for (t=100; t<1000; t++) test+=t; print ('Hi JS World! '+test);]
Hi JS World! 494550
```


Try more complex functions:
```
js>function hello(t){t=t*10;return t}; print("result"+hello(10.5));
```


Help will provide a list of commands
```
> help
```

This program, is built in top of the Zephyr command line, so there is a limit of 10 spaces.
Binary file added targets/arduino_101/docs/arduino_101.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions targets/arduino_101/prj.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CONFIG_STDOUT_CONSOLE=y
CONFIG_NEWLIB_LIBC=y
CONFIG_FLOAT=y
CONFIG_CONSOLE_HANDLER=y
CONFIG_CONSOLE_HANDLER_SHELL=y


5 changes: 5 additions & 0 deletions targets/arduino_101/prj.mdef
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
% Application : JerryScript Sample

% TASK NAME PRIO ENTRY STACK GROUPS
% ==================================
TASK TASKA 7 main 2048 [EXE]
Loading

0 comments on commit 7583b63

Please sign in to comment.