Skip to content

Commit

Permalink
WIP: Port to Zephyr OS
Browse files Browse the repository at this point in the history
Setup a freestanding `west` application project for `Zephyr SDK`.

Signed-off-by: Winford <[email protected]>
  • Loading branch information
UncleGrumpy committed Nov 27, 2023
1 parent 8625c8a commit 786fffc
Show file tree
Hide file tree
Showing 15 changed files with 1,146 additions and 0 deletions.
39 changes: 39 additions & 0 deletions README.ZEPHYR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!--
Copyright 2023 Winford (Uncle Grumpy) <[email protected]>
SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
-->

# AtomVM for Zephyr
This is an experimental port that will hopefully replace the current stm32 `libopencm3` based port, and should support many more boards.
Not all boards supported by Zephyr are capable of running AtomVM. The most likely excluding factor will be lack of flash storage space to accommodate both the VM and user BEAM applications. We will likely need a customized device tree to only define the boards that AtomVM can support. Currently a build can be attempted for any board supported by the Zephyr SDK and the user will need to determining if the final build can fit onto the device and still have space left for a user application partition (on stm32 devices this is typically a 128K block size).

## Prerequisites

* `west` Make sure to follow its [installation procedure](https://docs.zephyrproject.org/latest/develop/getting_started/index.html#get-zephyr-and-install-python-dependencies)
* `Zephyr SDK` [installation procedure](https://docs.zephyrproject.org/latest/develop/getting_started/index.html#install-the-zephyr-sdk)
* `cmake`
* `ninja`
* An appropriate flashing tool and software for your device, such as [st-flash](https://github.com/texane/stlink) for flashing STM32 devices with a [st-link v2](https://www.st.com/en/development-tools/st-link-v2.html) or [st-link v3](https://www.st.com/en/development-tools/stlink-v3set.html) device.
* A serial console program, such as `minicom` or `screen`, so that you can view console output from your AtomVM application.

## Building
Before building for the first time you need to have set up `west` and `Zephyr SDK`, following the [Zephyr Project Getting Started instructions](https://docs.zephyrproject.org/latest/develop/getting_started/index.html). After setup is complete from inside the AtomVM/src/platforms/zephyr directory use `west` to build for your board with the `-b` switch:

$ west build -b nucleo_f429zi -p=auto .

The `-p=auto` option instructs `west` to perform a pristine build if changes have been made, which is a recommended practice.

## Listing `west` target devices
A complete list of boards supported by

$ west boards

## Flashing

$ west flash

## Debugging
To start a live gdb session on the device use:

$ west attach
5 changes: 5 additions & 0 deletions src/platforms/zephyr/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copyright 2023 Winford (Uncle Grumpy) <[email protected]>
#
# SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later

build/
130 changes: 130 additions & 0 deletions src/platforms/zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
#
# This file is part of AtomVM.
#
# Copyright 2023 Winford (Uncle Grumpy) <[email protected]>
#
# 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.
#
# SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
#

cmake_minimum_required (VERSION 3.20)
set(CMAKE_C_STANDARD_REQUIRED YES)
set(CMAKE_CXX_STANDARD_REQUIRED YES)

# Enforce to disable any compiler-specific extensions
set(CMAKE_C_EXTENSIONS NO)
set(CMAKE_CXX_EXTENSIONS NO)
set(C_STANDARD_REQUIRED YES)
set_property(GLOBAL PROPERTY C_STANDARD_REQUIRED TRUE)
set_property(GLOBAL PROPERTY CSTD iso9899:2011)
set_property(GLOBAL PROPERTY C_STANDARD iso9899:2011)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(AtomVM LANGUAGES C)

if (NOT BOARD)
message(FATAL_ERROR "No BOARD specified for device config generator")
endif ()

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../CMakeModules")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

# Options that make sense for this platform
option(AVM_USE_32BIT_FLOAT "Use 32 bit floats." ON)
option(AVM_VERBOSE_ABORT "Print module and line number on VM abort" OFF)
option(AVM_CREATE_STACKTRACES "Create stacktraces" ON)
option(AVM_NEWLIB_NANO "Use 'nano' newlib. Saves 46kB, no `long long` support" OFF)
option(AVM_LOG_DISABLE "Disable log output" OFF)
option(AVM_ENABLE_LOG_COLOR "Use color log output" OFF)
option(AVM_ENABLE_LOG_LINES "Include source and line info for all enbled levels" OFF)
option(AVM_CONFIG_REBOOT_ON_NOT_OK "Reboot when application exits with non 'ok' return" OFF)
option(AVM_DISABLE_GPIO_NIFS "Disable GPIO nifs (input and output)" OFF)
option(AVM_DISABLE_GPIO_PORT_DRIVER "Disable GPIO 'port' driver (input, output, and interrupts)" OFF)

set(AVM_DISABLE_SMP ON FORCE)
set(CONFIG_ATOMVM_DISABLE_SMP ON FORCE)
zephyr_library_compile_definitions(AVM_NO_SMP)
zephyr_library_compile_definitions(CONFIG_AVM_NO_SMP)
add_compile_definitions(AVM_NO_SMP)

set(HAVE_CLOCK_SETTIME ON FORCE)

if (AVM_NEWLIB_NANO)
set(LINKER_FLAGS "${LINKER_FLAGS} -specs=nano.specs")
set(AVM_LOG_DISABLE ON FORCE)
endif()

if (AVM_CONFIG_REBOOT_ON_NOT_OK)
add_compile_definitions(CONFIG_REBOOT_ON_NOT_OK)
endif()

# Configure logging
if (AVM_LOG_DISABLE)
add_compile_definitions(AVM_LOG_DISABLE)
elseif (AVM_LOG_LEVEL_MAX)
set(AVM_LOG_LEVEL_MAX ${AVM_LOG_LEVEL_MAX} CACHE STRING "AtomVM max log level")
else()
set(AVM_LOG_LEVEL_MAX LOG_INFO CACHE STRING "AtomVM max log level")
endif()
if (AVM_LOG_LEVEL_MAX)
set_property(CACHE AVM_LOG_LEVEL_MAX PROPERTY STRINGS LOG_NONE LOG_ERROR LOG_WARN LOG_INFO LOG_DEBUG)
add_compile_definitions(AVM_LOG_LEVEL_MAX=${AVM_LOG_LEVEL_MAX})
endif()
if (AVM_ENABLE_LOG_COLOR)
add_compile_definitions(ENABLE_LOG_COLOR)
endif()
if (AVM_ENABLE_LOG_LINES)
add_compile_definitions(ENABLE_LOG_LINE_INFO)
endif()

# Configure Drivers
if (AVM_DISABLE_GPIO_NIFS)
add_compile_definitions(AVM_DISABLE_GPIO_NIFS)
endif()
if (AVM_DISABLE_GPIO_PORT_DRIVER)
add_compile_definitions(AVM_DISABLE_GPIO_PORT_DRIVER)
endif()

## Include additional compilation flags
#include(cmake/compile-flags.cmake)

set(
PLATFORM_LIB_SUFFIX
${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}
)

# Specify output executable
target_sources(app PRIVATE src/main.c)
target_include_directories(app PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/libAtomVM
${CMAKE_BINARY_DIR}/zephyr/include/generated)

add_subdirectory(src/lib)

target_link_libraries(app PRIVATE libAtomVM${PLATFORM_LIB_SUFFIX})

set_property(TARGET app PROPERTY C_STANDARD 11)

if(CMAKE_COMPILER_IS_GNUCC)
target_compile_options(app PUBLIC -Wall -Wextra -ggdb)
endif()

add_subdirectory(src/libAtomVM libAtomVM)
target_link_libraries(app PUBLIC libAtomVM)

message("----------------------------------------")
message(STATUS "Board : ${BOARD}")
message("--------Device Configuration Info-------")
message(STATUS "Clock Hz : ${CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC}")
message(STATUS "Flash Size : ${CONFIG_FLASH_SIZE}K")
5 changes: 5 additions & 0 deletions src/platforms/zephyr/VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
VERSION_MAJOR = 0
VERSION_MINOR = 6
PATCHLEVEL = 0
VERSION_TWEAK = 2
EXTRAVERSION = alpha
3 changes: 3 additions & 0 deletions src/platforms/zephyr/VERSION.license
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2023 Winford (Uncle Grumpy) <[email protected]>

SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
39 changes: 39 additions & 0 deletions src/platforms/zephyr/prj.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#
# This file is part of AtomVM.
#
# Copyright 2023 Winford (Uncle Grumpy) <[email protected]>
#
# 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.
#
# SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
#

CONFIG_KERNEL_BIN_NAME="AtomVM"
CONFIG_STDOUT_CONSOLE=y
CONFIG_CONSOLE_SUBSYS=y
CONFIG_SYS_HEAP_AUTO=y
CONFIG_GPIO=y
CONFIG_PINCTRL_DYNAMIC=y
CONFIG_POSIX_CLOCK=y
CONFIG_REQUIRES_FLOAT_PRINTF=y
CONFIG_FPU=y
CONFIG_RTC=y
CONFIG_RESET=y
CONFIG_REBOOT=y
CONFIG_STACK_USAGE=y
CONFIG_RUNTIME_ERROR_CHECKS=y
CONFIG_OUTPUT_PRINT_MEMORY_USAGE=y
CONFIG_DYNAMIC_INTERRUPTS=y
CONFIG_FORTIFY_SOURCE_RUN_TIME=y

CONFIG_DEBUG_OPTIMIZATIONS=y
48 changes: 48 additions & 0 deletions src/platforms/zephyr/src/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#
# This file is part of AtomVM.
#
# Copyright 2022 Paul Guyot <[email protected]>
# Copyright 2023 Winford <[email protected]>
#
# 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.
#
# SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
#

cmake_minimum_required (VERSION 3.20.5)

set(
PLATFORM_LIB_SUFFIX
${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}
)
project (libAtomVM${PLATFORM_LIB_SUFFIX})
zephyr_library_named(libAtomVM${PLATFORM_LIB_SUFFIX})

zephyr_include_directories(
${CMAKE_CURRENT_BINARY_DIR}
../../../../libAtomVM
${CMAKE_BINARY_DIR}/zephyr/include/generated/
)

zephyr_library_sources(
platform_nifs.c
sys.c
)

if(CMAKE_COMPILER_IS_GNUCC)
target_compile_options(libAtomVM${PLATFORM_LIB_SUFFIX} PUBLIC -Wall -pedantic -Wextra -ggdb)
endif()
set_property(TARGET libAtomVM${PLATFORM_LIB_SUFFIX} PROPERTY C_STANDARD 11)

target_link_libraries(app PUBLIC libAtomVM${PLATFORM_LIB_SUFFIX})
target_link_options(libAtomVM${PLATFORM_LIB_SUFFIX} PUBLIC ${LINK_OPTIONS} -Wl,--whole-archive ${CMAKE_CURRENT_BINARY_DIR}/liblibAtomVM${PLATFORM_LIB_SUFFIX}.a -Wl,--no-whole-archive)
33 changes: 33 additions & 0 deletions src/platforms/zephyr/src/lib/avm_devcfg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* This file is part of AtomVM.
*
* Copyright 2023 Winford (Uncle Grumpy) <[email protected]>
*
* 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.
*
* SPDX-License-Identifier: Apache-2.0 OR LGPL-2.1-or-later
*/

#ifndef _AVM_DEVCFG_H_
#define _AVM_DEVCFG_H_

#include <autoconf.h>

#if (CONFIG_FLASH_SIZE == 512)
#define AVM_APP_ADDRESS ((CONFIG_FLASH_BASE_ADDRESS) + 0x60000U)
#else
#define AVM_APP_ADDRESS ((CONFIG_FLASH_BASE_ADDRESS) + 0x80000U)
#endif

#define CFG_FLASH_END ((uint32_t) ((CONFIG_FLASH_BASE_ADDRESS) + ((CONFIG_FLASH_SIZE) *1024)))

#endif /* _AVM_DEVCFG_H_ */
Loading

0 comments on commit 786fffc

Please sign in to comment.