Industrial Native Real-Time Linux OS Solution

Setup and Tuning Guide

ID Date Version Classification
634647 01/01/2021 1.0 Public
Document Table of Contents

Create Build Scripts

1. Create an empty folder as your working directory on Linux Host PC and enter this new folder. In this guide the working directory is named “ecs-1.0-ubuntu”.

$ mkdir ecs-1.0-ubuntu

$ cd ecs-1.0-ubuntu

2. Create three build scripts.

Create build-all.sh:

$ vi build-all.sh

build-all.sh content is:

#!/bin/bash

set -e

DIR=$(dirname "$(realpath -s "$0")")

function help_​​msg()

{

printf "Usage:\n"

printf " build-all.sh <ecs-release-path> <target>\n"

printf " <ecs-release-path>: the decompressed ecs release package path.\n"

printf " <target>: xenomai (default) and preempt\n"

printf " For example:\n"

printf " build-all.sh /home/release-ecs_​​1.0/ecs-release xenomai\n"

}

ECS_​​REL="${1:-none}"

TARGET="${2:-xenomai}"

if [ ! -d ${ECS_​​REL} ]; then

printf "No valid ECS release package path provided! \n"

help_​​msg

exit -1

fi

if [ -f "${DIR}/build-${TARGET}.sh" ]

then

printf "Start building target ${TARGET} ... \n\n\n"

source ${DIR}/build-${TARGET}.sh

else

printf "No valid target provided! \n"

help_​​msg

exit -1

fi

Create build-preempt.sh for Preempt-RT build. (You can skip this script if you are using Xenomai Linux)

$ vi build-preempt.sh

build-preempt.sh content is:

#!/bin/bash

set -e

ECS_​​XENOMAI_​​META="${ECS_​​REL}/resources/bare-metal-xenomai"

# Xenomai build parameters

XENO_​​META="${ECS_​​XENOMAI_​​META}/meta-xenomai-bkc/recipes-xenomai/xenomai/files"

XENO_​​VER=3.1

XENO_​​URL="https://gitlab.denx.de/Xenomai/xenomai/-/archive/v${XENO_​​VER}/xenomai-v${XENO_​​VER}.tar.gz"

XENO_​​SRC=${DIR}/xenomai

XENO_​​DEST=${DIR}/xenomai_​​dest

XENO_​​RESOURCE=${DIR}/resources/xenomai/xenomai_​​${XENO_​​VER}

# Kernel build parameters

KERNEL_​​VER=4.19.59

KERNEL_​​TAG=lts-v${KERNEL_​​VER}-base-190722T171340Z

KERNEL_​​URL="https://github.com/intel/linux-intel-lts/archive/${KERNEL_​​TAG}.tar.gz"

KERNEL_​​SRC=${DIR}/linux-kernel

KERNEL_​​RESOURCE=${DIR}/resources/xenomai/linux-kernel_​​${KERNEL_​​VER}

KERNEL_​​CUSTOM=-ecs1.0

# Ethercat build parameters

ETHERCAT_​​META="${ECS_​​XENOMAI_​​META}/meta-intel-fieldbus/recipes-ethercat/ighethercat/files"

ETHERCAT_​​VER="1.5.2"

ETHERCAT_​​URL="http://www.etherlab.org/download/ethercat/ethercat-${ETHERCAT_​​VER}.tar.bz2"

ETHERCAT_​​SRC=${DIR}/ethercat

ETHERCAT_​​RESOURCE=${DIR}/resources/xenomai/ethercat_​​${ETHERCAT_​​VER}

ETHERCAT_​​DEST=${DIR}/ethercat_​​dest

function download_​​linux_​​kernel()

{

printf "Downloading kernel source from ${KERNEL_​​URL}\n"

printf "Kernel tag : ${KERNEL_​​TAG}\n"

curl -o linux-kernel.tar.gz -L ${KERNEL_​​URL}

rm -rf ${KERNEL_​​SRC} && mkdir ${KERNEL_​​SRC}

tar zxf linux-kernel.tar.gz -C $KERNEL_​​SRC --strip-components 1

}

function download_​​xenomai()

{

printf "Downloading xenomai source from ${XENO_​​URL}\n"

printf "Xenomai tag : ${XENO_​​VER}\n"

curl -o xenomai.tar.gz -L ${XENO_​​URL}

rm -rf ${XENO_​​SRC} && mkdir ${XENO_​​SRC}

tar zxf xenomai.tar.gz -C ${XENO_​​SRC} --strip-components 1

}

function download_​​ethercat()

{

printf "Downloading ethercat source from ${ETHERCAT_​​URL}\n"

printf "Ethercat tag : ${ETHERCAT_​​VER}\n"

curl -o ethercat.tar.bz2 -L ${ETHERCAT_​​URL}

rm -rf ${ETHERCAT_​​SRC} && mkdir ${ETHERCAT_​​SRC}

tar jxf ethercat.tar.bz2 -C ${ETHERCAT_​​SRC} --strip-components 1

}

function do_​​patching()

{

if (($# != 3)); then

printf "Please provide patch config file, target source path \n"

printf "and ECS release resource meta path. \n"

printf "do_​​patching ./linux-kernel ./patch ${XENO_​​META}\n"

exit -1

fi

local src_​​path=$1

local patch_​​cfg=$2

local meta_​​path=$3

pushd ${src_​​path}

cat ${patch_​​cfg} | while read line

do

pf=($line)

if [[ ${pf[0]} == "patch" ]]

then

printf "Patching ${pf[1]}\n"

patch -p1 < ${meta_​​path}/${pf[1]}

fi

done

popd

}

function build_​​kernel()

{

printf "Patching kernel\n"

do_​​patching ${KERNEL_​​SRC} ${KERNEL_​​RESOURCE}/patch ${XENO_​​META}

if [ -f ${KERNEL_​​RESOURCE}/patches/patch ]; then

printf "Extra patching\n"

do_​​patching ${KERNEL_​​SRC} ${KERNEL_​​RESOURCE}/patches/patch ${KERNEL_​​RESOURCE}/patches

fi

printf "Preparing kernel\n"

cp ${KERNEL_​​RESOURCE}/config ${KERNEL_​​SRC}/.config

${XENO_​​SRC}/scripts/prepare-kernel.sh --arch=x86_​​64 --linux=${KERNEL_​​SRC}

printf "Building kernel\n"

pushd ${KERNEL_​​SRC}

make -j `getconf _​​NPROCESSORS_​​ONLN` bindeb-pkg LOCALVERSION=${KERNEL_​​CUSTOM}

popd

}

function build_​​xenomai()

{

printf "Patching xenomai\n"

do_​​patching ${XENO_​​SRC} ${XENO_​​RESOURCE}/patch ${XENO_​​META}

printf "Building xenomai\n"

rm -rf ${XENO_​​DEST} && mkdir ${XENO_​​DEST}

pushd ${XENO_​​SRC}

./scripts/bootstrap

./configure --prefix=/usr/xenomai --with-core=cobalt --enable-smp --enable-pshared

make -j `getconf _​​NPROCESSORS_​​ONLN`

make DESTDIR=${XENO_​​DEST} install

popd

}

function build_​​ethercat()

{

printf "Patching ethercat\n"

do_​​patching ${ETHERCAT_​​SRC} ${ETHERCAT_​​RESOURCE}/patch ${ETHERCAT_​​META}

printf "Building ethercat\n"

rm -rf ${ETHERCAT_​​DEST} && mkdir ${ETHERCAT_​​DEST}

pushd ${ETHERCAT_​​SRC}

local xenomai_​​dir=${XENO_​​DEST}/usr/xenomai

# workaround to make ethercat build on the previous built xenomai

# cp ${xenomai_​​dir}/bin/xeno-config ${DIR}/xeno-config

# sed -i "s#prefix=\"/usr/xenomai\"#prefix=\"${xenomai_​​dir}\"#g" ${DIR}/xeno-config

sudo cp -r ${xenomai_​​dir} /usr/

chmod +x bootstrap && ./bootstrap

./configure --enable-sii-assign \

--disable-8139too \

--enable-igb \

--libdir=/usr/xenomai/lib \

--with-xenomai-dir=/usr/xenomai \

--with-xenomai-config=/usr/xenomai/bin/xeno-config \

--with-linux-dir=${KERNEL_​​SRC} \

--with-devices=8 \

--enable-rtdm \

--disable-eoe \

--enable-hrtimer \

--enable-cycles

make all modules

make DESTDIR=${ETHERCAT_​​DEST} install

make INSTALL_​​MOD_​​PATH=${ETHERCAT_​​DEST} modules_​​install

popd

sudo rm -rf /usr/xenomai

}

function pack_​​xenomai_​​to_​​deb()

{

printf "Packaging xenomai to deb\n"

mkdir ${XENO_​​DEST}/DEBIAN

cp ${XENO_​​RESOURCE}/control ${XENO_​​DEST}/DEBIAN/

dpkg -b ${XENO_​​DEST} xenomai_​​${XENO_​​VER}_​​amd64.deb

}

function pack_​​ethercat_​​to_​​deb()

{

printf "Packaging ethercat to deb\n"

# workaround to delete modules info files to avoid install conflict

rm -f ${ETHERCAT_​​DEST}/lib/modules/${KERNEL_​​VER}*/modules.*

mkdir ${ETHERCAT_​​DEST}/DEBIAN

cp ${ETHERCAT_​​RESOURCE}/control ${ETHERCAT_​​DEST}/DEBIAN/

dpkg -b ${ETHERCAT_​​DEST} ethercat_​​${ETHERCAT_​​VER}_​​amd64.deb

}

if [ ! -d ${XENO_​​META} ]; then

printf "Path ${XENO_​​META} is not existed!\n"

printf "No valid ECS release package path provided! \n"

exit -1

fi

download_​​linux_​​kernel

download_​​xenomai

download_​​ethercat

build_​​kernel

build_​​xenomai

build_​​ethercat

pack_​​xenomai_​​to_​​deb

pack_​​ethercat_​​to_​​deb

Create build-xenomai.sh for the Xenomai build. (You can skip this script if you are going to using Preempt RT Linux.)

$ vi build-xenomai.sh

build-xenomai.sh content is:

#!/bin/bash

set -e

ECS_​​XENOMAI_​​META="${ECS_​​REL}/resources/bare-metal-xenomai"

# Xenomai build parameters

XENO_​​META="${ECS_​​XENOMAI_​​META}/meta-xenomai-bkc/recipes-xenomai/xenomai/files"

XENO_​​VER=3.1

XENO_​​URL="https://gitlab.denx.de/Xenomai/xenomai/-/archive/v${XENO_​​VER}/xenomai-v${XENO_​​VER}.tar.gz"

XENO_​​SRC=${DIR}/xenomai

XENO_​​DEST=${DIR}/xenomai_​​dest

XENO_​​RESOURCE=${DIR}/resources/xenomai/xenomai_​​${XENO_​​VER}

# Kernel build parameters

KERNEL_​​VER=4.19.59

KERNEL_​​TAG=lts-v${KERNEL_​​VER}-base-190722T171340Z

KERNEL_​​URL="https://github.com/intel/linux-intel-lts/archive/${KERNEL_​​TAG}.tar.gz"

KERNEL_​​SRC=${DIR}/linux-kernel

KERNEL_​​RESOURCE=${DIR}/resources/xenomai/linux-kernel_​​${KERNEL_​​VER}

KERNEL_​​CUSTOM=-ecs1.0

# Ethercat build parameters

ETHERCAT_​​META="${ECS_​​XENOMAI_​​META}/meta-intel-fieldbus/recipes-ethercat/ighethercat/files"

ETHERCAT_​​VER="1.5.2"

ETHERCAT_​​URL="http://www.etherlab.org/download/ethercat/ethercat-${ETHERCAT_​​VER}.tar.bz2"

ETHERCAT_​​SRC=${DIR}/ethercat

ETHERCAT_​​RESOURCE=${DIR}/resources/xenomai/ethercat_​​${ETHERCAT_​​VER}

ETHERCAT_​​DEST=${DIR}/ethercat_​​dest

function download_​​linux_​​kernel()

{

printf "Downloading kernel source from ${KERNEL_​​URL}\n"

printf "Kernel tag : ${KERNEL_​​TAG}\n"

curl -o linux-kernel.tar.gz -L ${KERNEL_​​URL}

rm -rf ${KERNEL_​​SRC} && mkdir ${KERNEL_​​SRC}

tar zxf linux-kernel.tar.gz -C $KERNEL_​​SRC --strip-components 1

}

function download_​​xenomai()

{

printf "Downloading xenomai source from ${XENO_​​URL}\n"

printf "Xenomai tag : ${XENO_​​VER}\n"

curl -o xenomai.tar.gz -L ${XENO_​​URL}

rm -rf ${XENO_​​SRC} && mkdir ${XENO_​​SRC}

tar zxf xenomai.tar.gz -C ${XENO_​​SRC} --strip-components 1

}

function download_​​ethercat()

{

printf "Downloading ethercat source from ${ETHERCAT_​​URL}\n"

printf "Ethercat tag : ${ETHERCAT_​​VER}\n"

curl -o ethercat.tar.bz2 -L ${ETHERCAT_​​URL}

rm -rf ${ETHERCAT_​​SRC} && mkdir ${ETHERCAT_​​SRC}

tar jxf ethercat.tar.bz2 -C ${ETHERCAT_​​SRC} --strip-components 1

}

function do_​​patching()

{

if (($# != 3)); then

printf "Please provide patch config file, target source path \n"

printf "and ECS release resource meta path. \n"

printf "do_​​patching ./linux-kernel ./patch ${XENO_​​META}\n"

exit -1

fi

local src_​​path=$1

local patch_​​cfg=$2

local meta_​​path=$3

pushd ${src_​​path}

cat ${patch_​​cfg} | while read line

do

pf=($line)

if [[ ${pf[0]} == "patch" ]]

then

printf "Patching ${pf[1]}\n"

patch -p1 < ${meta_​​path}/${pf[1]}

fi

done

popd

}

function build_​​kernel()

{

printf "Patching kernel\n"

do_​​patching ${KERNEL_​​SRC} ${KERNEL_​​RESOURCE}/patch ${XENO_​​META}

if [ -f ${KERNEL_​​RESOURCE}/patches/patch ]; then

printf "Extra patching\n"

do_​​patching ${KERNEL_​​SRC} ${KERNEL_​​RESOURCE}/patches/patch ${KERNEL_​​RESOURCE}/patches

fi

printf "Preparing kernel\n"

cp ${KERNEL_​​RESOURCE}/config ${KERNEL_​​SRC}/.config

${XENO_​​SRC}/scripts/prepare-kernel.sh --arch=x86_​​64 --linux=${KERNEL_​​SRC}

printf "Building kernel\n"

pushd ${KERNEL_​​SRC}

make -j `getconf _​​NPROCESSORS_​​ONLN` bindeb-pkg LOCALVERSION=${KERNEL_​​CUSTOM}

popd

}

function build_​​xenomai()

{

printf "Patching xenomai\n"

do_​​patching ${XENO_​​SRC} ${XENO_​​RESOURCE}/patch ${XENO_​​META}

printf "Building xenomai\n"

rm -rf ${XENO_​​DEST} && mkdir ${XENO_​​DEST}

pushd ${XENO_​​SRC}

./scripts/bootstrap

./configure --prefix=/usr/xenomai --with-core=cobalt --enable-smp --enable-pshared

make -j `getconf _​​NPROCESSORS_​​ONLN`

make DESTDIR=${XENO_​​DEST} install

popd

}

function build_​​ethercat()

{

printf "Patching ethercat\n"

do_​​patching ${ETHERCAT_​​SRC} ${ETHERCAT_​​RESOURCE}/patch ${ETHERCAT_​​META}

printf "Building ethercat\n"

rm -rf ${ETHERCAT_​​DEST} && mkdir ${ETHERCAT_​​DEST}

pushd ${ETHERCAT_​​SRC}

local xenomai_​​dir=${XENO_​​DEST}/usr/xenomai

# workaround to make ethercat build on the previous built xenomai

# cp ${xenomai_​​dir}/bin/xeno-config ${DIR}/xeno-config

# sed -i "s#prefix=\"/usr/xenomai\"#prefix=\"${xenomai_​​dir}\"#g" ${DIR}/xeno-config

sudo cp -r ${xenomai_​​dir} /usr/

chmod +x bootstrap && ./bootstrap

./configure --enable-sii-assign \

--disable-8139too \

--enable-igb \

--libdir=/usr/xenomai/lib \

--with-xenomai-dir=/usr/xenomai \

--with-xenomai-config=/usr/xenomai/bin/xeno-config \

--with-linux-dir=${KERNEL_​​SRC} \

--with-devices=8 \

--enable-rtdm \

--disable-eoe \

--enable-hrtimer \

--enable-cycles

make all modules

make DESTDIR=${ETHERCAT_​​DEST} install

make INSTALL_​​MOD_​​PATH=${ETHERCAT_​​DEST} modules_​​install

popd

sudo rm -rf /usr/xenomai

}

function pack_​​xenomai_​​to_​​deb()

{

printf "Packaging xenomai to deb\n"

mkdir ${XENO_​​DEST}/DEBIAN

cp ${XENO_​​RESOURCE}/control ${XENO_​​DEST}/DEBIAN/

dpkg -b ${XENO_​​DEST} xenomai_​​${XENO_​​VER}_​​amd64.deb

}

function pack_​​ethercat_​​to_​​deb()

{

printf "Packaging ethercat to deb\n"

# workaround to delete modules info files to avoid install conflict

rm -f ${ETHERCAT_​​DEST}/lib/modules/${KERNEL_​​VER}*/modules.*

mkdir ${ETHERCAT_​​DEST}/DEBIAN

cp ${ETHERCAT_​​RESOURCE}/control ${ETHERCAT_​​DEST}/DEBIAN/

dpkg -b ${ETHERCAT_​​DEST} ethercat_​​${ETHERCAT_​​VER}_​​amd64.deb

}

if [ ! -d ${XENO_​​META} ]; then

printf "Path ${XENO_​​META} is not existed!\n"

printf "No valid ECS release package path provided! \n"

exit -1

fi

download_​​linux_​​kernel

download_​​xenomai

download_​​ethercat

build_​​kernel

build_​​xenomai

build_​​ethercat

pack_​​xenomai_​​to_​​deb

pack_​​ethercat_​​to_​​deb

3. Add execute permissions to the build scripts created:

$ cd <your path to>/ecs-1.0-ubuntu

$ chmod +x *.sh