Yonggang Luo f322f603f5
Fixes nuttx target warning (#4984)
The warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]

JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo luoyonggang@gmail.com
2024-12-17 10:17:57 +01:00
..

About

This folder contains files to run JerryScript on STM32F4-Discovery board with NuttX. The document had been validated on Ubuntu 20.04 operating system.

How to build

1. Setup the build environment for STM32F4-Discovery board

Clone the necessary projects into a jerry-nuttx directory. The latest tested working version of NuttX is 10.2.

# Create a base folder for all the projects.
mkdir jerry-nuttx && cd jerry-nuttx

git clone https://github.com/jerryscript-project/jerryscript.git
git clone https://github.com/apache/incubator-nuttx.git nuttx -b releases/10.2
git clone https://github.com/apache/incubator-nuttx-apps.git apps -b releases/10.2
git clone https://bitbucket.org/nuttx/tools.git tools
git clone https://github.com/texane/stlink.git -b v1.5.1-patch

The following directory structure is created after these commands:

jerry-nuttx
  + jerryscript
  |  + targets
  |      + os
  |        + nuttx
  + nuttx
  + apps
  + tools
  + stlink

2. Install dependencies of the projects

# Assuming you are in jerry-nuttx folder.
jerryscript/tools/apt-get-install-deps.sh

# Toolchain dependencies of NuttX.
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi

# Tool dependencies of NuttX.
sudo apt install \
    bison flex gettext texinfo libncurses5-dev libncursesw5-dev \
    gperf automake libtool pkg-config build-essential gperf genromfs \
    libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \
    libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux

# ST-Link and serial communication dependencies.
sudo apt install libusb-1.0-0-dev minicom

3. Copy JerryScript's application files to NuttX

Move JerryScript application files to apps/interpreters/jerryscript folder.

# Assuming you are in jerry-nuttx folder.
mkdir -p apps/interpreters/jerryscript
cp jerryscript/targets/os/nuttx/* apps/interpreters/jerryscript/

# Or more simply:
# ln -s jerryscript/targets/os/nuttx apps/interpreters/jerryscript

4. Build kconfig-frontend to configure NuttX

Skip this section if kconfig-frontends had alrady been installed by package manager.

# Assuming you are in jerry-nuttx folder.
cd tools/kconfig-frontends

./configure \
    --disable-nconf \
    --disable-gconf \
    --disable-qconf \
    --disable-shared \
    --enable-static \
    --prefix=${PWD}/install

make
make install
# Add install folder to PATH
PATH=${PWD}/install/bin:$PATH

5. Configure NuttX

Configure NuttX for serial communication. A .config file contains all the options for the build.

# Assuming you are in jerry-nuttx folder.
cd nuttx/tools

# Configure NuttX to use USB console shell.
./configure.sh stm32f4discovery:usbnsh

By default, JerryScript is disabled so it is needed to modify the configuration file. It can be done by using menuconfig (section 5.1) or modifying the .config file directly (section 5.2).

5.1 Enable JerryScript using menuconfig
# Assuming you are in jerry-nuttx folder.
# Might be required to run `make menuconfig` twice.
make -C nuttx menuconfig
  • Enable System Type -> FPU support
  • Enable Application Configuration -> Interpreters -> JerryScript

[Optional] Enabling ROMFS helps to flash JavaScript input files to the device's flash memory.

  • Enable File systems -> ROMFS file system
  • Enable Application configuration -> NSH library -> Scripting Support -> Support ROMFS start-up script

[Optional] Enabling MMCSD helps to mount sd card on the device. Note: These options are for the micro-sd card slot of STM32F4-Discovery base-board.

  • Enable System Type -> STM32 Peripheral Support -> SDIO
  • Enable RTOS Features -> Work queue support -> High priority (kernel) worker thread
  • Enable RTOS Features -> RTOS hooks -> Custom board late initialization
  • Enable RTOS Features -> RTOS hooks -> Enable on_exit() API
  • Enable Driver Support -> MMC/SD Driver Support
  • Disable Driver Support -> MMC/SD Driver Support -> MMC/SD write protect pin
  • Disable Driver Support -> MMC/SD Driver Support -> MMC/SD SPI transfer support
  • Enable Driver Support -> MMC/SD Driver Support -> MMC/SD SDIO transfer support
  • Enable File systems -> FAT file system
  • Enable File systems -> FAT file system -> FAT upper/lower names
  • Enable File systems -> FAT file system -> FAT long file names
5.2 Enable JerryScript without user interaction

A simpler solution is to append the necessary content to the .config configuration file:

# Assuming you are in jerry-nuttx folder.
cat >> nuttx/.config << EOL
CONFIG_ARCH_FPU=y
CONFIG_SCHED_ONEXIT=y
CONFIG_INTERPRETERS_JERRYSCRIPT=y
CONFIG_INTERPRETERS_JERRYSCRIPT_PRIORITY=100
CONFIG_INTERPRETERS_JERRYSCRIPT_STACKSIZE=16384
EOL

[Optional] Enable ROM File System

# Assuming you are in jerry-nuttx folder.
cat >> nuttx/.config << EOL
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_FS_ROMFS=y
CONFIG_NSH_ROMFSETC=y
CONFIG_NSH_ROMFSMOUNTPT="/etc"
CONFIG_NSH_INITSCRIPT="init.d/rcS"
CONFIG_NSH_ROMFSDEVNO=0
CONFIG_NSH_ROMFSSECTSIZE=64
CONFIG_NSH_DEFAULTROMFS=y
EOL

[Optional] Enable MMCSD driver and FAT File System

Note: These options are for the micro-sd card slot of STM32F4-Discovery base-board.

# Assuming you are in jerry-nuttx folder.
cat >> nuttx/.config << EOL
CONFIG_STM32_SDIO=y
CONFIG_STM32_SDIO_DMAPRIO=0x00010000
CONFIG_MMCSD_HAVE_CARDDETECT=y
CONFIG_BOARD_LATE_INITIALIZE=y
CONFIG_BOARD_INITTHREAD_STACKSIZE=2048
CONFIG_BOARD_INITTHREAD_PRIORITY=240
CONFIG_SIG_SIGWORK=17
CONFIG_SCHED_WORKQUEUE=y
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_HPNTHREADS=1
CONFIG_SCHED_HPWORKPRIORITY=224
CONFIG_SCHED_HPWORKSTACKSIZE=2048
CONFIG_BCH=y
CONFIG_ARCH_HAVE_SDIO=y
CONFIG_ARCH_HAVE_SDIOWAIT_WRCOMPLETE=y
CONFIG_ARCH_HAVE_SDIO_PREFLIGHT=y
CONFIG_MMCSD=y
CONFIG_MMCSD_NSLOTS=1
CONFIG_MMCSD_MMCSUPPORT=y
CONFIG_MMCSD_SDIO=y
CONFIG_FS_FAT=y
CONFIG_FAT_LCNAMES=y
CONFIG_FAT_LFN=y
CONFIG_FAT_MAXFNAME=32
CONFIG_FAT_LFN_ALIAS_TRAILCHARS=0
CONFIG_FSUTILS_MKFATFS=y
CONFIG_NSH_MMCSDSLOTNO=0
EOL

6. Provide JavaScript files for STM32F4 device

6.1. Create ROMFS image from a custom folder

Skip this section if MMCSD is used. Otherwise, generate a C header file from a custom folder. Try to minimize the size of the folder due to the limited capacity of flash memory.

# Assuming you are in jerry-nuttx folder.
mkdir jerry-example
# Let hello.js be a possible JavaScript input for JerryScript.
cp jerryscript/tests/hello.js jerry-example

# Generate ROMFS image from a custom folder.
genromfs -f romfs_img -d jerry-example

# Dump image as C header file and override NuttX's default ROMFS file.
xxd -i romfs_img apps/nshlib/nsh_romfsimg.h

# Add const modifier to place the content to flash memory.
sed -i "s/unsigned/const\ unsigned/g" apps/nshlib/nsh_romfsimg.h
6.2. Copy files to memory card

Skip this section if ROMFS is used. Otherwise, copy your files to a FAT32 formatted memory card.

7. Build NuttX (with JerryScript)

# Assuming you are in jerry-nuttx folder.
make -C nuttx

8. Flash the device

Connect Mini-USB for charging and flasing the device.

# Assuming you are in jerry-nuttx folder.
make -C stlink release

sudo stlink/build/Release/st-flash write nuttx/nuttx.bin 0x8000000

9. Connect to the device

Connect Micro-USB for serial communication. The device should be visible as /dev/ttyACM0 on the host. You can use minicom communication program with 115200 baud rate.

sudo minicom --device=/dev/ttyACM0 --baud=115200

Set Add Carriage Ret option in minicom by CTRL-A -> Z -> U key combinations. You may have to press RESET on the board and press Enter key on the console several times to make nsh prompt visible. NuttShell (NSH) prompt looks like as follows:

NuttShell (NSH) NuttX-10.2.0
nsh>

10. Run JerryScript

10.1 Run jerry without input
NuttShell (NSH) NuttX-10.2.0
nsh> jerry
No input files, running a hello world demo:
Hello world 5 times from JerryScript
10.2 Run jerry with files from ROMFS
NuttShell (NSH) NuttX-10.2.0
nsh> jerry /etc/hello.js
10.3 Run jerry with files from memory card

After NuttX has initialized, the card reader should be visible as /dev/mmcsd0 on the device. Mount it to be JavaScript files reachable.

NuttShell (NSH) NuttX-10.2.0
nsh> mount -t vfat /dev/mmcsd0 /mnt
nsh> jerry /mnt/hello.js