From db8f635bb5a8f6ffe6f4d26969e4f0cd88f1abd8 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 30 Apr 2021 11:41:00 +0200 Subject: [PATCH 01/15] modgen update --- generators/modgen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/modgen b/generators/modgen index 2dd83db..403bdd1 160000 --- a/generators/modgen +++ b/generators/modgen @@ -1 +1 @@ -Subproject commit 2dd83dbb458e19beec71877b969f287b03387af1 +Subproject commit 403bdd15b6175685ca2d45fed648812445483a40 From fb6703d8e16731daaa83471354e9fb3e87c6c7be Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 30 Apr 2021 23:59:56 +0200 Subject: [PATCH 02/15] fsfw update --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index 097244b..f3530d3 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 097244bf8b429d1b107343a3dbd77fa537a9c86d +Subproject commit f3530d3c7ede036e02a65963fcf36da4e5dc024a From 9f7aca0be5b78924c71f26e1dd10759bec0e9018 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 16:49:49 +0200 Subject: [PATCH 03/15] updated project file --- misc/eclipse/.project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/eclipse/.project b/misc/eclipse/.project index 482a1a5..c4483f1 100644 --- a/misc/eclipse/.project +++ b/misc/eclipse/.project @@ -1,6 +1,6 @@ - fsfw_example + fsfw_example_public From f5f33fd194f67306adef6cc559b3cc90e2a0ad7c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 17:48:08 +0200 Subject: [PATCH 04/15] added bbb guide and updated rpi guide --- doc/README-bbb.md | 291 ++++++++++++++++++++++++++++ doc/README-rpi.md | 182 +++++++++-------- doc/images/bbb/beagleboard-logo.png | Bin 0 -> 68713 bytes 3 files changed, 379 insertions(+), 94 deletions(-) create mode 100644 doc/README-bbb.md create mode 100644 doc/images/bbb/beagleboard-logo.png diff --git a/doc/README-bbb.md b/doc/README-bbb.md new file mode 100644 index 0000000..e3f6999 --- /dev/null +++ b/doc/README-bbb.md @@ -0,0 +1,291 @@ + + +Image taken from [Beagle Bone website](https://beagleboard.org/logo) and used in +accordance to their trademark rules. + +# Getting started on the Beagle Bone Black + +The FSFW can be run on a Beagle Bone Black with the Linux OSAL, using +an ARM linux (cross) compiler. Instructions will be provided on how to do this. + +## General Information + +The following instructions will show how to build the example on the Beagle Bone Black directly. +It will also show how to cross-compile on a host machine and mirror the Beagle Bone sysroot folder +on the host machine so that the same libraries and headers used on the BBB are used +for the cross-compilation process. + +Some Eclipse project files were provided as well to help with setting up the indexer in Eclipse +more quickly. + +## Prerequisites for direct compilation and cross-compiling + +1. SSH connection to the Beagle Bone Black working +2. Beagle Bone Black linux environment set up properly +3. `CMake` installed + +## Setting up general prerequisites for Linux systems + +1. Install CMake and rsync + + ```sh + sudo apt-get install cmake rsync + ``` + +2. Configure the Beagle Bone Black Linux environment. The last section of the + [Linux README](README-linux.md#top) specifies how to set up a UNIX environment for the FSFW and + is also applicable to the Beagle Bone Black. SSH into the BBB and + follow the instructions in that section. + +3. Install the `gpiod` library + + ```sh + sudo apt-get install gpiod libgpiod-dev + ``` + +## Getting started on the Beagle Bone Black + +Make sure to follow the steps above. Now you should be able to build the software on +the Beagle Bone Black. A ssh connection to the Raspberry Pi is assumed here + +You can build the software with the following commands + +```sh +mkdir build-Debug-BBB +cd build-Debug-BBB +cmake -DOS_FSFW=linux -DTGT_BSP=arm/beagleboneblack -DLINUX_CROSS_COMPILE=OFF -DCMAKE_BUILD_TYPE=Debug .. +cmake --build . -j2 +``` + +## Prerequisites for cross-compiling + +These prerequisites are valid for Linux as well as Windows hosts. + +1. ARM Linux cross compiler installed +2. Beagle Bone Black sysroot folder mirrored on the host machine, using `rsync` +3. gdb-multiarch installed on host for remote debugging or `tcf-agent` running on the BBB + +## Cross-Compiling on a Linux Host + +### Setting up prerequisites for cross-compiling + +## Cross-Compiling on a Windows Host + +### Additional Prerequites + +1. [MSYS2](https://www.msys2.org/) installed. All command line steps shown here + were performed in the MSYS2 MinGW64 shell (not the default MSYS2, use MinGW64!). + Replace `` with respectively. It is recommended to set up + aliases in the `.bashrc` file to allow quick navigation to the `fsfw_example` + repository and to run `git config --global core.autocrlf true` for git in + MinGW64. + +### Setting up prerequisites for Windows + +1. Install CMake and rsync in MinGW64 after installing MSYS2 + + ``` + pacman -S mingw-w64-x86_64-cmake rsync + ``` + +2. Configure the Beagle Bone Black linux environment. The last section of the + [Linux REAMDE](README-linux.md#top) specifies how to set up a UNIX environment + for the FSFW and isalso applicable to the Raspberry Pi. SSH into the + Beagle Bone Black and follow the instructions in that section. + +3. Install the correct [ARM Linux cross-compile toolchain](https://releases.linaro.org/components/toolchain/binaries/latest-7/). + provided by Linaro. + + Test the toolchain by running: + + ```sh + arm-linux-gnueabihf-gcc --version + ``` + +4. Set up a sysroot folder on the local host machine. Make sure the SSH connection to + the Raspberry Pi is working without issues. Then perform the following steps + + ```sh + cd /c/Users/ + mkdir beaglebone + cd beaglebone + mkdir rootfs + cd rootfs + pwd + ``` + + Store the result of `pwd`, it is going to be used by `rsync` later. + + Now use rsync to clone the Rapsberry Pi sysroot to the local host machine. + You can replace `` with `beaglebone.local` to use DNS. + Use the rootfs location stored from the previous steps as ``. + + ```sh + rsync -vR --progress -rl --delete-after --safe-links @:/{lib,usr,opt/vc/lib} + ``` + +5. There might be some issues with the pthread symbolic links. Navigate to the folder + containing the symlinks + + ```sh + cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf + ``` + + Type `more libpthread`, press `TAB` and check whether the symbolic + link `libpthread.so` is shown. If it is not, we are going to set it up + manually to avoid issues when linking against `pthread` later. + + Run the following command to create a symlink to `libpthread.so.0` + + ```sh + ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so + ``` + + Please note that there might also be issues with some symlinks or libraries not being copied + properly. This has occured with files like `libc.so.6`. If there are linker issues at a later + stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or + symlinks manually from the Raspberry Pi to the sysroot with `scp`. + + For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with + the following command + + ```sh + scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf + ``` + +6. It is recommended to install `gdb-multiarch`. + This tool will allow remote debugging on the host computer. Replace + `x86_64` with the correct processor architecture for other architectures. + + ```sh + pacman -S mingw-w64-x86_64-gdb-multiarch + ``` + +7. Perform the steps [in the following chapter](#cross-test) to build the + software for the Raspberry Pi and test it. + +## Testing the cross-compilation + +It is recommended to set the following environmental variables for the CMake build: + - `CROSS_COMPILE`: Explicitely specify the name of the cross compiler + - `RASPBIAN_ROOTFS`: Explicitely set the path to the local BBB rootfs + +For example with the following commands + +```sh +export CROSS_COMPILE="arm-linux-gnueabihf" +``` + +It is recommended to test whether the environmental variables were set correctly, +for example by running + +```sh +echo $RASPBIAN_ROOTFS +``` + +These variables can either be set every time before a debugging session to +keep the environment clean (should be done before starting Eclipse) +or permanently by adding the `export` commands to system files. + +A helper script has been provided in `cmake/scripts/BBB` to perform +setting up the environment. The scripts need to be `source`d instead of +being run like regular shell scripts. + +You can also set up the environmental variables permanently by adding the +export commands to the `.profile` or `.bashrc` file in the `$HOME` folder. +On Windows, MinGW64 was used to set up the build system, so you can use the +MinGW64 `.bashrc` file to do this. If you are using Eclipse to build +the software, Eclipse will have the system variables from Windows, +so it is recommended to either permanently set the three environmental +variables in the Windows system environmental variables or add them in +Eclipse. See the [Eclipse README](README-eclipse.md#top) for more information. + +Now we can test whether everything was set up properly by compiling the example +and running it on the BBB via command line. Navigate into the `fsfw_example` folder first. + +1. Build the software locally to test the cross-compilation process. + A debug build directory is created first. + + ```sh + mkdir build-Debug-BBB + cd build-Debug-BBB + ``` + +2. Configure the build system. On Linux, run the following command: + + ```sh + cmake -G "Unix Makefiles" -DOS_FSFW=linux -DTGT_BSP=arm/beagleboneblack -DLINUX_CROSS_COMPILE=ON -DCMAKE_BUILD_TYPE=Debug .. + ``` + + On Windows, replace `-G "Unix Makefiles"` with `-G "MinGW Makefiles"`. + + Alternatively, you can use the helper shell scripts located inside `cmake/scripts/BBB/crosscompile` + or the Python helper script `cmake_build_config.py` inside the `cmake/scripts` folder. + The `BBB` folder also contains template shell files which can be `source`d + to quickly set up the environmental variables if you want to keep the system path clean. + +3. Run the binary to test it + + ```sh + scp fsfw_example @beaglebone.local:/home/fsfw_example + ssh @beaglebone.local + ./fsfw_example + ``` + +### Setting up Eclipse for a BBB remote target + +It is recommended to use the provided Eclipse project files and +launch configurations to have a starting point. See the specific section in +the [Eclipse README](README-eclipse.md#top) for information how to do this. + +#### Windows + +There are some additional steps necessary on Windows: The cross-compiler by +default is configured to look for the cross-compiler in `/opt/cross-pi-gcc/bin`. +The toolchain path needs to be corrected, for example like shown in the following image: + + + + +## Setting up the TCF agent on the BBB + +It is recommended to set up a [TCF agent](https://wiki.eclipse.org/TCF) for comfortable +Eclipse remote debugging. The following steps show how to setup the TCF agent +on the Raspberry Pi and add it to the auto-startup applications. The steps are taken +from [this guide](https://wiki.eclipse.org/TCF/Raspberry_Pi) + +1. Install required packages on the RPi + + ```sh + sudo apt-get install git uuid uuid-dev libssl-dev + ``` + +2. Clone the repository and perform some preparation steps + ```sh + git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git + cd org.eclipse.tcf.agent.git/agent + ``` + +3. Build the TCF agent + ```sh + make + ``` + + and then test it by running + + ```sh + obj/GNU/Linux/arm/Debug/agent –S + ``` + +4. Finally install the agent for auto-start with the following steps. And set it up for + auto-start. + + ```sh + cd org.eclipse.tcf.agent/agent + make install + sudo make install INSTALLROOT= + sudo update-rc.d tcf-agent defaults + ``` + +The [Eclipse README](README-eclipse.md#top) specifies how to perform remote +debugging using the TCF agent. diff --git a/doc/README-rpi.md b/doc/README-rpi.md index 838aa97..10325d6 100644 --- a/doc/README-rpi.md +++ b/doc/README-rpi.md @@ -1,41 +1,43 @@ -Image taken from [Raspberry Pi website](https://www.raspberrypi.org/trademark-rules/). Raspberry Pi is a trademark of the Raspberry Pi Foundation +Image taken from [Raspberry Pi website](https://www.raspberrypi.org/trademark-rules/). +Raspberry Pi is a trademark of the Raspberry Pi Foundation # Getting started on the Raspberry Pi The FSFW can be run on a Raspberry Pi with the Linux OSAL, using -an ARM linux cross compiler. Instructions will be provided on how +an ARM linux (cross) compiler. Instructions will be provided on how to do this. ## General Information -The following instructions will show how to install the cross compiler on -a host machine and mirror the Rapsberry Pi sysroot folder on the host machine -so that the same libraries and headers used on the Raspberry Pi are used -for the cross-compilation process. The provided Eclipse project files -and launch configurations also provide a starting point to perform -remote debugging on a Raspberry Pi, using a SSH connection. +The following instructions will show how to build the example on the Raspberry Pi directly. +It will also show how to cross-compile on a host machine and mirror the Raspberry Pi sysroot folder +on the host machine so that the same libraries and headers used on the RPi are used +for the cross-compilation process. + +Some Eclipse project files were provided as well to help with setting up the indexer in Eclipse +more quickly. ## Prerequisites for direct compilation and cross-compiling 1. SSH connection to the Raspberry Pi working 2. Raspberry Pi linux environment set up properly -3. CMake and rsync installed +3. `CMake` installed ## Setting up general prerequisites for Linux systems -1. Install CMake and rsync - +1. Install `CMake` and `rsync` + ```sh sudo apt-get install cmake rsync ``` - + 2. Configure the Raspberry Pi Linux environment. The last section of the - [Linux REAMDE](README-linux.md#top) specifies how to set up a UNIX environment for the FSFW and is - also applicable to the Raspberry Pi. SSH into the Raspberry Pi and + [Linux README](README-linux.md#top) specifies how to set up a UNIX environment for the FSFW and + is also applicable to the Raspberry Pi. SSH into the Raspberry Pi and follow the instructions in that section. - + 3. Install the `gpiod` library ```sh @@ -62,10 +64,8 @@ These prerequisites are valid for Linux as well as Windows hosts. 1. ARM Linux cross compiler installed 2. Raspberry Pi sysroot folder mirrored on the host machine, using `rsync` -3. gdb-multiarch installed on host for remote debugging or TCF agent running on Raspberry Pi - +3. gdb-multiarch installed on host for remote debugging or `tcf-agent` running on Raspberry Pi - ## Cross-Compiling on a Linux Host Steps tested for Ubuntu 20.04. Adapt accordingly for used Linux distribution. @@ -76,7 +76,6 @@ based on Debian buster is used. If this is not the case, it is recommended to follow the steps in the stackoverflow post above and to make sure that the toolchain binaries are added to the path accordingly. - ### Setting up prerequisites for cross-compiling 1. Install the pre-built ARM cross-compile with the following command @@ -84,31 +83,30 @@ toolchain binaries are added to the path accordingly. ```sh wget https://github.com/Pro/raspi-toolchain/releases/latest/download/raspi-toolchain.tar.gz ``` - - Please note that this version of the toolchain might become obsolete in the future. - If another toolchain installation is used, it is still recommended to unpack the toolchain in the - `/opt/cross-pi-gcc` folder so that the Eclipse configuration and helper - scripts work without adaptions. Add the folder to the system path. On Linux, - this can generally be done with the following command - - ```sh - export PATH=$PATH:"/opt/cross-pi-gcc/bin" - ``` - - You can add this line to the `.bashrc` or `.profile` file in the `$HOME` directory - to add environmental variables permanently. More experienced users can - perform this step is a shell script which is `source`d to keep the environment clean. - - Test the toolchain with the following command - - ```sh - arm-linux-gnueabihf-gcc --version - ``` - - + + Please note that this version of the toolchain might become obsolete in the future. + If another toolchain installation is used, it is still recommended to unpack the toolchain in the + `/opt/cross-pi-gcc` folder so that the Eclipse configuration and helper + scripts work without adaptions. Add the folder to the system path. On Linux, + this can generally be done with the following command + + ```sh + export PATH=$PATH:"/opt/cross-pi-gcc/bin" + ``` + + You can add this line to the `.bashrc` or `.profile` file in the `$HOME` directory + to add environmental variables permanently. More experienced users can + perform this step is a shell script which is `source`d to keep the environment clean. + + Test the toolchain with the following command + + ```sh + arm-linux-gnueabihf-gcc --version + ``` + 2. Set up a sysroot folder on the local host machine. Make sure the SSH connection to the Raspberry Pi is working without issues. Then perform the following steps - + ```sh cd ~ mkdir raspberrypi @@ -117,39 +115,39 @@ toolchain binaries are added to the path accordingly. cd rootfs pwd ``` - + The result of the `pwd` command will be used later to sync the root file system of the Raspberry Pi to the host machine. With a Raspberry Pi 4, you can replace `` with `raspberrypi.local` and when using the default rootfs path, you can replace `` with `$HOME/raspberrypi/rootfs`. - + ```sh rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} ``` - + Please note that there might be issues with some symlinks or libraries not being copied properly. This has occured with files like `libc.so.6`. If there are linker issues at a later stage, you can try to rerun `rsync` without the`--safe-links` flag or copy the shared libraries or symlinks manually from the Raspberry Pi to the sysroot with `scp`. - + For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with the following command - + ```sh scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf ``` - + 3. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. You don't need to do this if the TCF agent is used. - + ```sh sudo apt-get install gdb-multiarch ``` 4. Perform the steps [in the cross-compile section](#cross-test) to build the software for the Raspberry Pi and test it. - + ## Cross-Compiling on a Windows Host ### Additional Prerequites @@ -168,7 +166,7 @@ toolchain binaries are added to the path accordingly. ``` pacman -S mingw-w64-x86_64-cmake rsync ``` - + 2. Configure the Raspberry Pi linux environment. The last section of the [Linux REAMDE](README-linux.md#top) specifies how to set up a UNIX environment for the FSFW and isalso applicable to the Raspberry Pi. SSH into the @@ -178,14 +176,14 @@ toolchain binaries are added to the path accordingly. You can find out the distribution release of your Raspberry Pi by running `cat /etc/rpi-issue`. Test the toolchain by running: - + ```sh arm-linux-gnueabihf-gcc --version ``` 4. Set up a sysroot folder on the local host machine. Make sure the SSH connection to the Raspberry Pi is working without issues. Then perform the following steps - + ```sh cd /c/Users/ mkdir raspberrypi @@ -194,81 +192,79 @@ toolchain binaries are added to the path accordingly. cd rootfs pwd ``` - + Store the result of `pwd`, it is going to be used by `rsync` later. - + Now use rsync to clone the Rapsberry Pi sysroot to the local host machine. With a Raspberry Pi 4, you can replace `` with `raspberrypi.local`. Use the rootfs location stored from the previous steps as ``. - + ```sh rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} ``` - + 5. There might be some issues with the pthread symbolic links. Navigate to the folder containing the symlinks - + ```sh cd /c/User//raspberrypi/rootfs/usr/lib/arm-linux-gnueabihf ``` - + Type `more libpthread`, press `TAB` and check whether the symbolic link `libpthread.so` is shown. If it is not, we are going to set it up manually to avoid issues when linking against `pthread` later. - + Run the following command to create a symlink to `libpthread.so.0` - + ```sh ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so ``` - + Please note that there might also be issues with some symlinks or libraries not being copied properly. This has occured with files like `libc.so.6`. If there are linker issues at a later stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or symlinks manually from the Raspberry Pi to the sysroot with `scp`. - + For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with the following command - + ```sh scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf ``` - + 6. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. Replace `x86_64` with the correct processor architecture for other architectures. - + ```sh pacman -S mingw-w64-x86_64-gdb-multiarch ``` 7. Perform the steps [in the following chapter](#cross-test) to build the software for the Raspberry Pi and test it. - + ## Testing the cross-compilation It is recommended to set the following environmental variables for the CMake build: - `CROSS_COMPILE`: Explicitely specify the name of the cross compiler - `RASPBERRY_VERSION`: Explicitely specify the version of the Raspberry Pi - `RASPBIAN_ROOTFS`: Explicitely set the path to the local RPi rootfs - + For example with the following commands - + ```sh export CROSS_COMPILE="arm-linux-gnueabihf" export RASPBERRY_VERSION="4" export RASPBIAN_ROOTFS="" ``` - - + It is recommended to test whether the environmental variables were set correctly, for example by running - + ```sh echo $RASPBIAN_ROOTFS ``` - These variables can either be set every time before a debugging session to keep the environment clean (should be done before starting Eclipse) or permanently by adding the `export` commands to system files. @@ -285,32 +281,32 @@ the software, Eclipse will have the system variables from Windows, so it is recommended to either permanently set the three environmental variables in the Windows system environmental variables or add them in Eclipse. See the [Eclipse README](README-eclipse.md#top) for more information. - + Now we can test whether everything was set up properly by compiling the example and running it on the Raspberry Pi via command line. Navigate into the `fsfw_example` folder first. 1. Build the software locally to test the cross-compilation process. We are going to create a Debug build directory first. - + ```sh mkdir build-Debug-RPi cd build-Debug-RPi ``` - + 2. Configure the build system. On Linux, run the following command: - + ```sh cmake -G "Unix Makefiles" -DOS_FSFW=linux -DTGT_BSP=arm/raspberrypi -DLINUX_CROSS_COMPILE=ON -DCMAKE_BUILD_TYPE=Debug .. ``` - + On Windows, replace `-G "Unix Makefiles"` with `-G "MinGW Makefiles"`. - + Alternatively, you can use the helper shell scripts located inside `cmake/scripts/RPi/crosscompile` or the Python helper script `cmake_build_config.py` inside the `cmake/scripts` folder. The `RPi` folder also contains template shell files which can be `source`d to quickly set up the environmental variables if you want to keep the system path clean. - + 3. Run the binary to test it ```sh @@ -318,13 +314,13 @@ Navigate into the `fsfw_example` folder first. ssh pi@raspberrypi.local ./fsfw_example ``` - + ### Setting up Eclipse for a Raspberry Pi remote target It is recommended to use the provided Eclipse project files and launch configurations to have a starting point. See the specific section in the [Eclipse README](README-eclipse.md#top) for information how to do this. - + #### Windows There are some additional steps necessary on Windows: The cross-compiler by @@ -333,7 +329,6 @@ The toolchain path needs to be corrected, for example like shown in the followin - ## Setting up the TCF agent on the Raspberry Pi It is recommended to set up a [TCF agent](https://wiki.eclipse.org/TCF) for comfortable @@ -346,28 +341,27 @@ from [this guide](https://wiki.eclipse.org/TCF/Raspberry_Pi) ```sh sudo apt-get install git uuid uuid-dev libssl-dev ``` - + 2. Clone the repository and perform some preparation steps ```sh git clone git://git.eclipse.org/gitroot/tcf/org.eclipse.tcf.agent.git cd org.eclipse.tcf.agent.git/agent - cp -R machine/arm machine/armv6l ``` - + 3. Build the TCF agent ```sh make ``` - + and then test it by running - + ```sh - obj/GNU/Linux/armv6l/Debug/agent –S + obj/GNU/Linux/arm/Debug/agent –S ``` - -4. Finally instal lthe agent for auto-start with the following steps. The last step - did not work on a Rapsberry Pi 4, but apparentely was not necessary. - + +4. Finally instal lthe agent for auto-start with the following steps and set it up for auto-start. + The last step did not work on a Rapsberry Pi 4, but apparentely was not necessary. + ```sh cd org.eclipse.tcf.agent/agent make install @@ -375,6 +369,6 @@ from [this guide](https://wiki.eclipse.org/TCF/Raspberry_Pi) sudo update-rc.d tcf-agent defaults sudo update-rc.d tcf-agent enable 2 ``` - + The [Eclipse README](README-eclipse.md#top) specifies how to perform remote debugging using the TCF agent. diff --git a/doc/images/bbb/beagleboard-logo.png b/doc/images/bbb/beagleboard-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e21573871dd07069090248537f0ea7974990395b GIT binary patch literal 68713 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 Date: Sat, 1 May 2021 17:52:01 +0200 Subject: [PATCH 05/15] ref bbb doc --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 17ec095..dc02c8b 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ the TMTC capabilities of the FSFW (currently, using the ECSS PUS packet standard [Getting started with the Host OSAL](doc/README-host.md#top)
[Getting started with the FreeRTOS OSAL on a STM32](doc/README-stm32-freertos.md#top)
[Getting started with the Raspberry Pi](doc/README-rpi.md#top)
+[Getting started with the Beagle Bone Black](doc/README-bbb.md#top)
[Getting started with the RTEMS OSAL on a STM32](doc/README-stm32-rtems.md#top)
[Getting started with Eclipse for C/C++](doc/README-eclipse.md#top)
[Getting started with CMake](doc/README-cmake.md#top)
From 1aa991837073d799d0aef6190b4a7c3420de9a76 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 18:03:55 +0200 Subject: [PATCH 06/15] added BBB x-compile file --- cmake/BBBCrossCompileConfig.cmake | 98 +++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 cmake/BBBCrossCompileConfig.cmake diff --git a/cmake/BBBCrossCompileConfig.cmake b/cmake/BBBCrossCompileConfig.cmake new file mode 100644 index 0000000..4af5686 --- /dev/null +++ b/cmake/BBBCrossCompileConfig.cmake @@ -0,0 +1,98 @@ +# BBB_ROOTFS should point to the local directory which contains all the +# libraries and includes from the target raspi. +# The following command can be used to do this, replace and the +# local accordingly: +# rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} +# RASPBIAN_ROOTFS needs to be passed to the CMake command or defined in the +# application CMakeLists.txt before loading the toolchain file. + +# CROSS_COMPILE also needs to be set accordingly or passed to the CMake command + +if(NOT DEFINED ENV{BBB_ROOTFS}) + message(FATAL_ERROR + "Define the BBB_ROOTFS variable to point to the Beagle Bone Black rootfs." + ) +else() + set(SYSROOT_PATH "$ENV{BBB_ROOTFS}") + message(STATUS "Beagle Bone Black sysroot: ${SYSROOT_PATH}") +endif() + +if(NOT DEFINED ENV{CROSS_COMPILE}) + set(CROSS_COMPILE "arm-linux-gnueabihf") + message(STATUS + "No CROSS_COMPILE environmental variable set, using default ARM linux " + "cross compiler name ${CROSS_COMPILE}" + ) +else() + set(CROSS_COMPILE "$ENV{CROSS_COMPILE}") + message(STATUS + "Using environmental variable CROSS_COMPILE as cross-compiler: " + "$ENV{CROSS_COMPILE}" + ) +endif() + +message(STATUS "Using sysroot path: ${SYSROOT_PATH}") + +set(CROSS_COMPILE_CC "${CROSS_COMPILE}-gcc") +set(CROSS_COMPILE_CXX "${CROSS_COMPILE}-g++") +set(CROSS_COMPILE_LD "${CROSS_COMPILE}-ld") +set(CROSS_COMPILE_AR "${CROSS_COMPILE}-ar") +set(CROSS_COMPILE_RANLIB "${CROSS_COMPILE}-ranlib") +set(CROSS_COMPILE_STRIP "${CROSS_COMPILE}-strip") +set(CROSS_COMPILE_NM "${CROSS_COMPILE}-nm") +set(CROSS_COMPILE_OBJCOPY "${CROSS_COMPILE}-objcopy") +set(CROSS_COMPILE_SIZE "${CROSS_COMPILE}-size") + +# At the very least, cross compile gcc and g++ have to be set! +find_program (CROSS_COMPILE_CC_FOUND ${CROSS_COMPILE_CC} REQUIRED) +find_program (CROSS_COMPILE_CXX_FOUND ${CROSS_COMPILE_CXX} REQUIRED) + +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_SYSROOT "${SYSROOT_PATH}") + +# Define name of the target system +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_PROCESSOR "arm") + +# Define the compiler +set(CMAKE_C_COMPILER ${CROSS_COMPILE_CC}) +set(CMAKE_CXX_COMPILER ${CROSS_COMPILE_CXX}) + +# List of library dirs where LD has to look. Pass them directly through gcc. +# LD_LIBRARY_PATH is not evaluated by arm-*-ld +set(LIB_DIRS + "${SYSROOT_PATH}/lib/${CROSS_COMPILE}" + "${SYSROOT_PATH}/usr/local/lib" + "${SYSROOT_PATH}/usr/lib/${CROSS_COMPILE}" + "${SYSROOT_PATH}/usr/lib" +) +# You can additionally check the linker paths if you add the +# flags ' -Xlinker --verbose' +set(COMMON_FLAGS "-I${SYSROOT_PATH}/usr/include") +foreach(LIB ${LIB_DIRS}) + set(COMMON_FLAGS "${COMMON_FLAGS} -L${LIB} -Wl,-rpath-link,${LIB}") +endforeach() + +set(CMAKE_PREFIX_PATH + "${CMAKE_PREFIX_PATH}" + "${SYSROOT_PATH}/usr/lib/${CROSS_COMPILE}" +) + +set(CMAKE_C_FLAGS + "-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp ${COMMON_FLAGS}" + CACHE STRING "Flags for Beagle Bone Black" +) +set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}" + CACHE STRING "Flags for Beagle Bone Black" +) + +set(CMAKE_FIND_ROOT_PATH + "${CMAKE_INSTALL_PREFIX};${CMAKE_PREFIX_PATH};${CMAKE_SYSROOT}" +) + +# search for programs in the build host directories +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +# for libraries and headers in the target directories +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) From 8364ec34997f2c128614c1f530a9a55eb812650f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 18:06:40 +0200 Subject: [PATCH 07/15] use new bbb x-compifle file --- cmake/PreProjectConfig.cmake | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/PreProjectConfig.cmake b/cmake/PreProjectConfig.cmake index 14cca35..457b0d6 100644 --- a/cmake/PreProjectConfig.cmake +++ b/cmake/PreProjectConfig.cmake @@ -110,15 +110,19 @@ elseif(${OS_FSFW} STREQUAL linux AND TGT_BSP) "$ENV{RASPBERRY_VERSION}" ) endif() - if(LINUX_CROSS_COMPILE) set(CMAKE_TOOLCHAIN_FILE "${CMAKE_SCRIPT_PATH}/RPiCrossCompileConfig.cmake" PARENT_SCOPE ) - endif() + endif() elseif(${TGT_BSP} MATCHES "arm/beagleboneblack") - + if(LINUX_CROSS_COMPILE) + set(CMAKE_TOOLCHAIN_FILE + "${CMAKE_SCRIPT_PATH}/BBBCrossCompileConfig.cmake" + PARENT_SCOPE + ) + endif() else() message(WARNING "Target BSP (TGT_BSP) ${TGT_BSP} unknown!") endif() From 85d9ff1c8cc15ac85a297929b100bbd1670a19ff Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 18:30:59 +0200 Subject: [PATCH 08/15] updated BBB readme --- doc/README-bbb.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index e3f6999..5632b0f 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -168,7 +168,7 @@ These prerequisites are valid for Linux as well as Windows hosts. It is recommended to set the following environmental variables for the CMake build: - `CROSS_COMPILE`: Explicitely specify the name of the cross compiler - - `RASPBIAN_ROOTFS`: Explicitely set the path to the local BBB rootfs + - `BBB_ROOTFS`: Explicitely set the path to the local BBB rootfs For example with the following commands @@ -180,7 +180,7 @@ It is recommended to test whether the environmental variables were set correctly for example by running ```sh -echo $RASPBIAN_ROOTFS +echo $BBB_ROOTFS ``` These variables can either be set every time before a debugging session to From f967fd71a22be78e2d3491e114b1be4e8a23cfea Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sat, 1 May 2021 19:12:07 +0200 Subject: [PATCH 09/15] generic troubleshooting sections --- doc/README-bbb.md | 100 ++++++++++++++++++++++++++----------------- doc/README-rpi.md | 106 ++++++++++++++++++++++++++-------------------- 2 files changed, 123 insertions(+), 83 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index 5632b0f..63e4217 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -103,7 +103,7 @@ These prerequisites are valid for Linux as well as Windows hosts. ``` 4. Set up a sysroot folder on the local host machine. Make sure the SSH connection to - the Raspberry Pi is working without issues. Then perform the following steps + the BBB is working without issues. Then perform the following steps ```sh cd /c/Users/ @@ -116,53 +116,28 @@ These prerequisites are valid for Linux as well as Windows hosts. Store the result of `pwd`, it is going to be used by `rsync` later. - Now use rsync to clone the Rapsberry Pi sysroot to the local host machine. + Now use rsync to clone the BBB sysroot to the local host machine. You can replace `` with `beaglebone.local` to use DNS. Use the rootfs location stored from the previous steps as ``. ```sh - rsync -vR --progress -rl --delete-after --safe-links @:/{lib,usr,opt/vc/lib} + rsync -vR --progress -rl --delete-after --safe-links @:/{lib,usr} ``` + + Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, + which might result in errors when cross-compiling and cross-linking. See the + [troubleshooting](#troubleshooting) section for more details. -5. There might be some issues with the pthread symbolic links. Navigate to the folder - containing the symlinks - - ```sh - cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf - ``` - - Type `more libpthread`, press `TAB` and check whether the symbolic - link `libpthread.so` is shown. If it is not, we are going to set it up - manually to avoid issues when linking against `pthread` later. - - Run the following command to create a symlink to `libpthread.so.0` - - ```sh - ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so - ``` - - Please note that there might also be issues with some symlinks or libraries not being copied - properly. This has occured with files like `libc.so.6`. If there are linker issues at a later - stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or - symlinks manually from the Raspberry Pi to the sysroot with `scp`. - - For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with - the following command - - ```sh - scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf - ``` - -6. It is recommended to install `gdb-multiarch`. - This tool will allow remote debugging on the host computer. Replace - `x86_64` with the correct processor architecture for other architectures. - +5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host + computer. Replace `x86_64` with the correct processor architecture for other architectures. + This is not required if the `tcf-agent` is used. + ```sh pacman -S mingw-w64-x86_64-gdb-multiarch ``` -7. Perform the steps [in the following chapter](#cross-test) to build the - software for the Raspberry Pi and test it. +6. Perform the steps [in the following chapter](#cross-test) to build the + software for the BBB and test it. ## Testing the cross-compilation @@ -289,3 +264,52 @@ from [this guide](https://wiki.eclipse.org/TCF/Raspberry_Pi) The [Eclipse README](README-eclipse.md#top) specifies how to perform remote debugging using the TCF agent. + +# Troubleshooting + +## Cloning Sysroot + +There might be some issues with the pthread symbolic links. +Navigate to the folder containing the symlinks + +```sh +cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf +``` + +Type `more libpthread`, press `TAB` and check whether the symbolic +link `libpthread.so` is shown. If it is not, we are going to set it up +manually to avoid issues when linking against `pthread` later. + +Run the following command to create a symlink to `libpthread.so.0` + +```sh +ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +``` + +Please note that there might also be issues with some symlinks or libraries not being copied +properly. This has occured with files like `libc.so.6`. If there are linker issues at a later +stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or +symlinks manually from the Linux board to the sysroot with `scp`. + +For example, you can copy `libc.so.6` from the Linux board to the sysroot with +the following command + +```sh +scp @:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf +``` + +If there are issues with the cross-compilation process, manually copying these shared +libraries can help + +```sh +scp @:/usr/lib/arm-linux-gnueabihf/libc.so /usr/lib/arm-linux-gnueabihf +scp @:/usr/lib/arm-linux-gnueabihf/libc.a /usr/lib/arm-linux-gnueabihf + +scp @:/usr/lib/arm-linux-gnueabihf/librt.a /usr/lib/arm-linux-gnueabihf +scp @:/usr/lib/arm-linux-gnueabihf/librt.so /usr/lib/arm-linux-gnueabihf + +scp @:/lib/arm-linux-gnueabihf/librt.so.1 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/libpthread.so.0 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/libc.so.6 /lib/arm-linux-gnueabihf +``` diff --git a/doc/README-rpi.md b/doc/README-rpi.md index 10325d6..090fb64 100644 --- a/doc/README-rpi.md +++ b/doc/README-rpi.md @@ -126,20 +126,12 @@ toolchain binaries are added to the path accordingly. rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} ``` - Please note that there might be issues with some symlinks or libraries not being copied properly. - This has occured with files like `libc.so.6`. If there are linker issues at a later stage, - you can try to rerun `rsync` without the`--safe-links` flag or copy the shared libraries or - symlinks manually from the Raspberry Pi to the sysroot with `scp`. - - For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with - the following command - - ```sh - scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf - ``` + Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, + which might result in errors when cross-compiling and cross-linking. See the + [troubleshooting](#troubleshooting) section for more details. 3. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging - on the host computer. You don't need to do this if the TCF agent is used. + on the host computer. This step is not required if the `tcf-agent` is used. ```sh sudo apt-get install gdb-multiarch @@ -202,45 +194,20 @@ toolchain binaries are added to the path accordingly. ```sh rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} ``` + + Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, + which might result in errors when cross-compiling and cross-linking. See the + [troubleshooting](#troubleshooting) section for more details. -5. There might be some issues with the pthread symbolic links. Navigate to the folder - containing the symlinks - - ```sh - cd /c/User//raspberrypi/rootfs/usr/lib/arm-linux-gnueabihf - ``` - - Type `more libpthread`, press `TAB` and check whether the symbolic - link `libpthread.so` is shown. If it is not, we are going to set it up - manually to avoid issues when linking against `pthread` later. - - Run the following command to create a symlink to `libpthread.so.0` - - ```sh - ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so - ``` - - Please note that there might also be issues with some symlinks or libraries not being copied - properly. This has occured with files like `libc.so.6`. If there are linker issues at a later - stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or - symlinks manually from the Raspberry Pi to the sysroot with `scp`. - - For example, you can copy `libc.so.6` from the Raspberry Pi to the sysroot with - the following command - - ```sh - scp pi@:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf - ``` - -6. It is recommended to install `gdb-multiarch`. - This tool will allow remote debugging on the host computer. Replace - `x86_64` with the correct processor architecture for other architectures. +5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host + computer. Replace `x86_64` with the correct processor architecture for other architectures. + This is not required if the `tcf-agent` is used. ```sh pacman -S mingw-w64-x86_64-gdb-multiarch ``` -7. Perform the steps [in the following chapter](#cross-test) to build the +6. Perform the steps [in the following chapter](#cross-test) to build the software for the Raspberry Pi and test it. ## Testing the cross-compilation @@ -372,3 +339,52 @@ from [this guide](https://wiki.eclipse.org/TCF/Raspberry_Pi) The [Eclipse README](README-eclipse.md#top) specifies how to perform remote debugging using the TCF agent. + +# Troubleshooting + +## Cloning Sysroot + +There might be some issues with the pthread symbolic links. +Navigate to the folder containing the symlinks + +```sh +cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf +``` + +Type `more libpthread`, press `TAB` and check whether the symbolic +link `libpthread.so` is shown. If it is not, we are going to set it up +manually to avoid issues when linking against `pthread` later. + +Run the following command to create a symlink to `libpthread.so.0` + +```sh +ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +``` + +Please note that there might also be issues with some symlinks or libraries not being copied +properly. This has occured with files like `libc.so.6`. If there are linker issues at a later +stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or +symlinks manually from the Linux board to the sysroot with `scp`. + +For example, you can copy `libc.so.6` from the Linux board to the sysroot with +the following command + +```sh +scp @:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf +``` + +If there are issues with the cross-compilation process, manually copying these shared +libraries can help + +```sh +scp @:/usr/lib/arm-linux-gnueabihf/libc.so /usr/lib/arm-linux-gnueabihf +scp @:/usr/lib/arm-linux-gnueabihf/libc.a /usr/lib/arm-linux-gnueabihf + +scp @:/usr/lib/arm-linux-gnueabihf/librt.a /usr/lib/arm-linux-gnueabihf +scp @:/usr/lib/arm-linux-gnueabihf/librt.so /usr/lib/arm-linux-gnueabihf + +scp @:/lib/arm-linux-gnueabihf/librt.so.1 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/libpthread.so.0 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 /lib/arm-linux-gnueabihf +scp @:/lib/arm-linux-gnueabihf/libc.so.6 /lib/arm-linux-gnueabihf +``` From 891d9e18220cd0b14c0b1ae6056513cae4e63492 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 May 2021 13:05:04 +0200 Subject: [PATCH 10/15] updated READMEs --- doc/README-bbb.md | 45 +++++++++++++++++++++++++-------------------- doc/README-rpi.md | 43 ++++++++++++++++++++++++------------------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index 63e4217..0060c3a 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -93,7 +93,7 @@ These prerequisites are valid for Linux as well as Windows hosts. for the FSFW and isalso applicable to the Raspberry Pi. SSH into the Beagle Bone Black and follow the instructions in that section. -3. Install the correct [ARM Linux cross-compile toolchain](https://releases.linaro.org/components/toolchain/binaries/latest-7/). +3. Install the correct [ARM Linux cross-compile toolchain](https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/). provided by Linaro. Test the toolchain by running: @@ -121,12 +121,20 @@ These prerequisites are valid for Linux as well as Windows hosts. Use the rootfs location stored from the previous steps as ``. ```sh - rsync -vR --progress -rl --delete-after --safe-links @:/{lib,usr} + rsync -avHAXR --numeric-ids --info=progress2 @:/{lib,usr} ``` Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, - which might result in errors when cross-compiling and cross-linking. See the - [troubleshooting](#troubleshooting) section for more details. + which might result in errors when cross-compiling and cross-linking. It is recommended to run + the following commands in addition to the `rsync` command: + + ```sh + scp @:/lib/arm-linux-gnueabihf/{libc.so.6,ld-linux-armhf.so.3,libm.so.6} /lib/arm-linux-gnueabihf + scp @:/usr/lib/arm-linux-gnueabihf/{libpthread.so,libc.so,librt.so} /usr/lib/arm-linux-gnueabihf + ``` + + See the [troubleshooting](#troubleshooting) section for more details if the compilation process + is problematic. 5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. Replace `x86_64` with the correct processor architecture for other architectures. @@ -267,7 +275,7 @@ debugging using the TCF agent. # Troubleshooting -## Cloning Sysroot +## Cloning the root filesystem There might be some issues with the pthread symbolic links. Navigate to the folder containing the symlinks @@ -282,24 +290,18 @@ manually to avoid issues when linking against `pthread` later. Run the following command to create a symlink to `libpthread.so.0` +```sh +scp @:/usr/lib/arm-linux-gnueabihf/libpthread.so . +``` + +Alternatively, you can also create the symlink pointing to the correct library with + ```sh ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so ``` -Please note that there might also be issues with some symlinks or libraries not being copied -properly. This has occured with files like `libc.so.6`. If there are linker issues at a later -stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or -symlinks manually from the Linux board to the sysroot with `scp`. - -For example, you can copy `libc.so.6` from the Linux board to the sysroot with -the following command - -```sh -scp @:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf -``` - -If there are issues with the cross-compilation process, manually copying these shared -libraries can help +If there are issues with the cross-compilation process, manually copying the following +symlinks can help: ```sh scp @:/usr/lib/arm-linux-gnueabihf/libc.so /usr/lib/arm-linux-gnueabihf @@ -312,4 +314,7 @@ scp @:/lib/arm-linux-gnueabihf/librt.so.1 /l scp @:/lib/arm-linux-gnueabihf/libpthread.so.0 /lib/arm-linux-gnueabihf scp @:/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 /lib/arm-linux-gnueabihf scp @:/lib/arm-linux-gnueabihf/libc.so.6 /lib/arm-linux-gnueabihf -``` +``` + +If any custom libraries are used which rely on symlinks, it might be necessary to copy them +or create them manually as well. diff --git a/doc/README-rpi.md b/doc/README-rpi.md index 090fb64..085e38f 100644 --- a/doc/README-rpi.md +++ b/doc/README-rpi.md @@ -123,12 +123,20 @@ toolchain binaries are added to the path accordingly. `$HOME/raspberrypi/rootfs`. ```sh - rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} + rsync -avHAXR --numeric-ids --info=progress2 @:/{lib,usr} ``` - + Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, - which might result in errors when cross-compiling and cross-linking. See the - [troubleshooting](#troubleshooting) section for more details. + which might result in errors when cross-compiling and cross-linking. It is recommended to run + the following commands in addition to the `rsync` command: + + ```sh + scp @:/lib/arm-linux-gnueabihf/{libc.so.6,ld-linux-armhf.so.3,libm.so.6} /lib/arm-linux-gnueabihf + scp @:/usr/lib/arm-linux-gnueabihf/{libpthread.so,libc.so,librt.so} /usr/lib/arm-linux-gnueabihf + ``` + + See the [troubleshooting](#troubleshooting) section for more details if the compilation process + is problematic. 3. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. This step is not required if the `tcf-agent` is used. @@ -342,7 +350,7 @@ debugging using the TCF agent. # Troubleshooting -## Cloning Sysroot +## Cloning the root filesystem There might be some issues with the pthread symbolic links. Navigate to the folder containing the symlinks @@ -357,24 +365,18 @@ manually to avoid issues when linking against `pthread` later. Run the following command to create a symlink to `libpthread.so.0` +```sh +scp @:/usr/lib/arm-linux-gnueabihf/libpthread.so . +``` + +Alternatively, you can also create the symlink pointing to the correct library with + ```sh ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so ``` -Please note that there might also be issues with some symlinks or libraries not being copied -properly. This has occured with files like `libc.so.6`. If there are linker issues at a later -stage, you can try to rerun `rsync` without `--safe-links` or copy the shared libraries or -symlinks manually from the Linux board to the sysroot with `scp`. - -For example, you can copy `libc.so.6` from the Linux board to the sysroot with -the following command - -```sh -scp @:lib/arm-linux-gnueabihf/lib.so.6 /lib/arm-linux-gnueabihf -``` - -If there are issues with the cross-compilation process, manually copying these shared -libraries can help +If there are issues with the cross-compilation process, manually copying the following +symlinks can help: ```sh scp @:/usr/lib/arm-linux-gnueabihf/libc.so /usr/lib/arm-linux-gnueabihf @@ -388,3 +390,6 @@ scp @:/lib/arm-linux-gnueabihf/libpthread.so.0 @:/lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 /lib/arm-linux-gnueabihf scp @:/lib/arm-linux-gnueabihf/libc.so.6 /lib/arm-linux-gnueabihf ``` + +If any custom libraries are used which rely on symlinks, it might be necessary to copy them +or create them manually as well. From a3fb7974bacbb2eb87cea7bb26f30b22d76615cf Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 May 2021 13:21:32 +0200 Subject: [PATCH 11/15] readme bbb update for linux and windows --- doc/README-bbb.md | 114 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 103 insertions(+), 11 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index 0060c3a..a5cf38b 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -68,6 +68,87 @@ These prerequisites are valid for Linux as well as Windows hosts. ## Cross-Compiling on a Linux Host ### Setting up prerequisites for cross-compiling + +1. Install `CMake` and `rsync` + + ``` + sudo apt-get install cmake rsync + ``` + +2. Configure the Beagle Bone Black linux environment. The last section of the + [Linux REAMDE](README-linux.md#top) specifies how to set up a UNIX environment + for the FSFW and isalso applicable to the Raspberry Pi. SSH into the + Beagle Bone Black and follow the instructions in that section. + +3. Install the correct [ARM Linux cross-compile toolchain](https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/). + provided by Linaro. + + Test the toolchain by running: + + ```sh + arm-linux-gnueabihf-gcc --version + ``` + +4. Set up a sysroot folder on the local host machine. Make sure the SSH connection to + the BBB is working without issues. Then perform the following steps + + ```sh + cd $HOME + mkdir beaglebone + cd beaglebone + mkdir rootfs + cd rootfs + pwd + ``` + + Store the result of `pwd`, it is going to be used by `rsync` later. + + Now use `rsync` to clone the BBB sysroot to the local host machine. + You can replace `` with `beaglebone.local` to use DNS. + Use the rootfs location stored from the previous steps as ``. + + ```sh + rsync -avHAXR --delete-after --info=progress2 --numeric-ids @:/{usr,lib} + ``` + + On Linux, it is recommended to repair some symlinks which can be problematic: + Navigate to the folder containing the symlinks first: + + ```sh + cd /usr/lib/arm-linux-gnueabihf + ``` + + You can now use + + ```sh + readlink libpthread.so + ``` + + which will show an absolute location of a shared library the symlinks points to. This location + needs to be converted into a relative path. + + Run the following command to create a relative symlinks instead of an absolute ones. The pointed + to location might change to check it with `readlink` first before removing the symlinks: + + ```sh + rm libpthread.so + rm librt.so + ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so + ln -s ../../../lib/arm-linux-gnueabihf/librt.so.1 librt.so + ``` + + For more information on issues which can occur when cloning the root filesystem, + see the [troubleshooting](#troubleshooting) section. + +5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host + computer. This is not required if the `tcf-agent` is used. + + ```sh + sudo apt-get install multiarch + ``` + +6. Perform the steps [in the following chapter](#cross-test) to build the + software for the BBB and test it. ## Cross-Compiling on a Windows Host @@ -126,15 +207,15 @@ These prerequisites are valid for Linux as well as Windows hosts. Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, which might result in errors when cross-compiling and cross-linking. It is recommended to run - the following commands in addition to the `rsync` command: + the following commands in addition to the `rsync` command on Windows: ```sh scp @:/lib/arm-linux-gnueabihf/{libc.so.6,ld-linux-armhf.so.3,libm.so.6} /lib/arm-linux-gnueabihf scp @:/usr/lib/arm-linux-gnueabihf/{libpthread.so,libc.so,librt.so} /usr/lib/arm-linux-gnueabihf ``` - See the [troubleshooting](#troubleshooting) section for more details if the compilation process - is problematic. + For more information on issues which can occur when cloning the root filesystem, + see the [troubleshooting](#troubleshooting) section. 5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. Replace `x86_64` with the correct processor architecture for other architectures. @@ -281,25 +362,36 @@ There might be some issues with the pthread symbolic links. Navigate to the folder containing the symlinks ```sh -cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf +cd /usr/lib/arm-linux-gnueabihf ``` -Type `more libpthread`, press `TAB` and check whether the symbolic -link `libpthread.so` is shown. If it is not, we are going to set it up -manually to avoid issues when linking against `pthread` later. + Type `more libpthread`, press `TAB` and check whether the symbolic + link `libpthread.so` is shown. If it is not, we are going to set it up + manually to avoid issues when linking against `pthread` later. + Now you can find out where `libpthread.so` points with `readlink libpthread.so`. + This information is used to convert the absolute symlink to relative ones, for example with: -Run the following command to create a symlink to `libpthread.so.0` +Run the following command to copy the symlink `libpthread.so.0` if it does not exist yet: ```sh scp @:/usr/lib/arm-linux-gnueabihf/libpthread.so . ``` -Alternatively, you can also create the symlink pointing to the correct library with +Alternatively, you can correct the symlinks to use relative paths, for example with: ```sh -ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +ln -s ../../../lib/arm-linux-gnueabihf/librt.so.1 librt.so ``` - + +Please note that there might also be issues with some symlinks or libraries not being copied +properly, especially on Windows. This has occured with files like `libc.so.6`. +If there are linker issues at a later stage, you can try to copy the symlinks manually from the +Linux board to the sysroot with `scp`. + +For example, you can copy `libc.so.6` from the Linux board to the sysroot with +the following command + If there are issues with the cross-compilation process, manually copying the following symlinks can help: From c6c75c92dc54eb1d49974ed6d9ca0ef98dd80b73 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 May 2021 14:53:02 +0200 Subject: [PATCH 12/15] updating READMEs for bbb and rpi --- doc/README-bbb.md | 19 ++++++------- doc/README-rpi.md | 72 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index a5cf38b..159e92c 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -280,7 +280,7 @@ and running it on the BBB via command line. Navigate into the `fsfw_example` fol ```sh cmake -G "Unix Makefiles" -DOS_FSFW=linux -DTGT_BSP=arm/beagleboneblack -DLINUX_CROSS_COMPILE=ON -DCMAKE_BUILD_TYPE=Debug .. ``` - + On Windows, replace `-G "Unix Makefiles"` with `-G "MinGW Makefiles"`. Alternatively, you can use the helper shell scripts located inside `cmake/scripts/BBB/crosscompile` @@ -310,7 +310,6 @@ The toolchain path needs to be corrected, for example like shown in the followin - ## Setting up the TCF agent on the BBB It is recommended to set up a [TCF agent](https://wiki.eclipse.org/TCF) for comfortable @@ -365,11 +364,11 @@ Navigate to the folder containing the symlinks cd /usr/lib/arm-linux-gnueabihf ``` - Type `more libpthread`, press `TAB` and check whether the symbolic - link `libpthread.so` is shown. If it is not, we are going to set it up - manually to avoid issues when linking against `pthread` later. - Now you can find out where `libpthread.so` points with `readlink libpthread.so`. - This information is used to convert the absolute symlink to relative ones, for example with: +Type `more libpthread`, press `TAB` and check whether the symbolic +link `libpthread.so` is shown. If it is not, we are going to set it up +manually to avoid issues when linking against `pthread` later. +Now you can find out where `libpthread.so` points with `readlink libpthread.so`. +This information is used to convert the absolute symlink to relative ones, for example with: Run the following command to copy the symlink `libpthread.so.0` if it does not exist yet: @@ -383,15 +382,15 @@ Alternatively, you can correct the symlinks to use relative paths, for example w ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so ln -s ../../../lib/arm-linux-gnueabihf/librt.so.1 librt.so ``` - + Please note that there might also be issues with some symlinks or libraries not being copied properly, especially on Windows. This has occured with files like `libc.so.6`. If there are linker issues at a later stage, you can try to copy the symlinks manually from the Linux board to the sysroot with `scp`. - + For example, you can copy `libc.so.6` from the Linux board to the sysroot with the following command - + If there are issues with the cross-compilation process, manually copying the following symlinks can help: diff --git a/doc/README-rpi.md b/doc/README-rpi.md index 085e38f..7374ed4 100644 --- a/doc/README-rpi.md +++ b/doc/README-rpi.md @@ -125,18 +125,35 @@ toolchain binaries are added to the path accordingly. ```sh rsync -avHAXR --numeric-ids --info=progress2 @:/{lib,usr} ``` - - Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, - which might result in errors when cross-compiling and cross-linking. It is recommended to run - the following commands in addition to the `rsync` command: - + + On Linux, it is recommended to repair some symlinks which can be problematic: + Navigate to the folder containing the symlinks first: + ```sh - scp @:/lib/arm-linux-gnueabihf/{libc.so.6,ld-linux-armhf.so.3,libm.so.6} /lib/arm-linux-gnueabihf - scp @:/usr/lib/arm-linux-gnueabihf/{libpthread.so,libc.so,librt.so} /usr/lib/arm-linux-gnueabihf + cd /usr/lib/arm-linux-gnueabihf ``` - - See the [troubleshooting](#troubleshooting) section for more details if the compilation process - is problematic. + + You can now use + + ```sh + readlink libpthread.so + ``` + + which will show an absolute location of a shared library the symlinks points to. This location + needs to be converted into a relative path. + + Run the following command to create a relative symlinks instead of an absolute ones. The pointed + to location might change to check it with `readlink` first before removing the symlinks: + + ```sh + rm libpthread.so + rm librt.so + ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so + ln -s ../../../lib/arm-linux-gnueabihf/librt.so.1 librt.so + ``` + + For more information on issues which can occur when cloning the root filesystem, + see the [troubleshooting](#troubleshooting) section. 3. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. This step is not required if the `tcf-agent` is used. @@ -202,15 +219,23 @@ toolchain binaries are added to the path accordingly. ```sh rsync -vR --progress -rl --delete-after --safe-links pi@:/{lib,usr,opt/vc/lib} ``` - + Please note that `rsync` sometimes does not copy shared libraries or symlinks properly, - which might result in errors when cross-compiling and cross-linking. See the - [troubleshooting](#troubleshooting) section for more details. + which might result in errors when cross-compiling and cross-linking. It is recommended to run + the following commands in addition to the `rsync` command on Windows: + + ```sh + scp @:/lib/arm-linux-gnueabihf/{libc.so.6,ld-linux-armhf.so.3,libm.so.6} /lib/arm-linux-gnueabihf + scp @:/usr/lib/arm-linux-gnueabihf/{libpthread.so,libc.so,librt.so} /usr/lib/arm-linux-gnueabihf + ``` + + For more information on issues which can occur when cloning the root filesystem, + see the [troubleshooting](#troubleshooting) section. 5. It is recommended to install `gdb-multiarch`. This tool will allow remote debugging on the host computer. Replace `x86_64` with the correct processor architecture for other architectures. This is not required if the `tcf-agent` is used. - + ```sh pacman -S mingw-w64-x86_64-gdb-multiarch ``` @@ -356,25 +381,36 @@ There might be some issues with the pthread symbolic links. Navigate to the folder containing the symlinks ```sh -cd /c/User//beaglebone/rootfs/usr/lib/arm-linux-gnueabihf +cd /usr/lib/arm-linux-gnueabihf ``` Type `more libpthread`, press `TAB` and check whether the symbolic link `libpthread.so` is shown. If it is not, we are going to set it up manually to avoid issues when linking against `pthread` later. +Now you can find out where `libpthread.so` points with `readlink libpthread.so`. +This information is used to convert the absolute symlink to relative ones, for example with: -Run the following command to create a symlink to `libpthread.so.0` +Run the following command to copy the symlink `libpthread.so.0` if it does not exist yet: ```sh scp @:/usr/lib/arm-linux-gnueabihf/libpthread.so . ``` -Alternatively, you can also create the symlink pointing to the correct library with +Alternatively, you can correct the symlinks to use relative paths, for example with: ```sh -ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +ln -s ../../../lib/arm-linux-gnueabihf/libpthread.so.0 libpthread.so +ln -s ../../../lib/arm-linux-gnueabihf/librt.so.1 librt.so ``` +Please note that there might also be issues with some symlinks or libraries not being copied +properly, especially on Windows. This has occured with files like `libc.so.6`. +If there are linker issues at a later stage, you can try to copy the symlinks manually from the +Linux board to the sysroot with `scp`. + +For example, you can copy `libc.so.6` from the Linux board to the sysroot with +the following command + If there are issues with the cross-compilation process, manually copying the following symlinks can help: From 5dda86a9da73bb333996053c82d0c1fd80247a54 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 May 2021 15:09:17 +0200 Subject: [PATCH 13/15] bbb support complete --- .../crosscompile/bbb_path_helper.sh | 3 ++ .../crosscompile/create_cmake_debug_cfg.sh | 30 +++++++++++++++++++ .../crosscompile/create_cmake_release_cfg.sh | 30 +++++++++++++++++++ .../create_cmake_relwithdeb_cfg.sh | 30 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 cmake/scripts/BeagleBoneBlack/crosscompile/bbb_path_helper.sh create mode 100644 cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_debug_cfg.sh create mode 100644 cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_release_cfg.sh create mode 100644 cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_relwithdeb_cfg.sh diff --git a/cmake/scripts/BeagleBoneBlack/crosscompile/bbb_path_helper.sh b/cmake/scripts/BeagleBoneBlack/crosscompile/bbb_path_helper.sh new file mode 100644 index 0000000..340713e --- /dev/null +++ b/cmake/scripts/BeagleBoneBlack/crosscompile/bbb_path_helper.sh @@ -0,0 +1,3 @@ +export PATH=$PATH:"$HOME/beaglebone//bin" +export CROSS_COMPILE="arm-linux-gnueabihf" +export BBB_ROOTFS="${HOME}/raspberrypi/rootfs" diff --git a/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_debug_cfg.sh b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_debug_cfg.sh new file mode 100644 index 0000000..b413d07 --- /dev/null +++ b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_debug_cfg.sh @@ -0,0 +1,30 @@ +#!/bin/sh +counter=0 +while [ ${counter} -lt 5 ] +do + cd .. + if [ -f "cmake_build_config.py" ];then + break + fi + counter=$((counter=counter + 1)) +done + +if [ "${counter}" -ge 5 ];then + echo "cmake_build_config.py not found in upper directories!" + exit 1 +fi + +os_fsfw="linux" +tgt_bsp="arm/beagleboneblack" +build_generator="" +builddir="build-Debug-BBB" +defines="LINUX_CROSS_COMPILE=ON" +if [ "${OS}" = "Windows_NT" ]; then + build_generator="MinGW Makefiles" +# Could be other OS but this works for now. +else + build_generator="Unix Makefiles" +fi + +python3 cmake_build_config.py -o "${os_fsfw}" -g "${build_generator}" -b "debug" -t "${tgt_bsp}" \ + -l "${builddir}" -d "${defines}" diff --git a/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_release_cfg.sh b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_release_cfg.sh new file mode 100644 index 0000000..81e3322 --- /dev/null +++ b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_release_cfg.sh @@ -0,0 +1,30 @@ +#!/bin/sh +counter=0 +while [ ${counter} -lt 5 ] +do + cd .. + if [ -f "cmake_build_config.py" ];then + break + fi + counter=$((counter=counter + 1)) +done + +if [ "${counter}" -ge 5 ];then + echo "cmake_build_config.py not found in upper directories!" + exit 1 +fi + +os_fsfw="linux" +tgt_bsp="arm/beagleboneblack" +build_generator="" +builddir="build-Release-BBB" +defines="LINUX_CROSS_COMPILE=ON" +if [ "${OS}" = "Windows_NT" ]; then + build_generator="MinGW Makefiles" +# Could be other OS but this works for now. +else + build_generator="Unix Makefiles" +fi + +python3 cmake_build_config.py -o "${os_fsfw}" -g "${build_generator}" -b "debug" -t "${tgt_bsp}" \ + -l "${builddir}" -d "${defines}" diff --git a/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_relwithdeb_cfg.sh b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_relwithdeb_cfg.sh new file mode 100644 index 0000000..81e3322 --- /dev/null +++ b/cmake/scripts/BeagleBoneBlack/crosscompile/create_cmake_relwithdeb_cfg.sh @@ -0,0 +1,30 @@ +#!/bin/sh +counter=0 +while [ ${counter} -lt 5 ] +do + cd .. + if [ -f "cmake_build_config.py" ];then + break + fi + counter=$((counter=counter + 1)) +done + +if [ "${counter}" -ge 5 ];then + echo "cmake_build_config.py not found in upper directories!" + exit 1 +fi + +os_fsfw="linux" +tgt_bsp="arm/beagleboneblack" +build_generator="" +builddir="build-Release-BBB" +defines="LINUX_CROSS_COMPILE=ON" +if [ "${OS}" = "Windows_NT" ]; then + build_generator="MinGW Makefiles" +# Could be other OS but this works for now. +else + build_generator="Unix Makefiles" +fi + +python3 cmake_build_config.py -o "${os_fsfw}" -g "${build_generator}" -b "debug" -t "${tgt_bsp}" \ + -l "${builddir}" -d "${defines}" From 895193c9a6b5bf409ed42db98c3af4aefa14f829 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Sun, 2 May 2021 15:13:33 +0200 Subject: [PATCH 14/15] typos --- doc/README-bbb.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/README-bbb.md b/doc/README-bbb.md index 159e92c..4350668 100644 --- a/doc/README-bbb.md +++ b/doc/README-bbb.md @@ -1,7 +1,7 @@ -Image taken from [Beagle Bone website](https://beagleboard.org/logo) and used in -accordance to their trademark rules. +Image taken from [Beagle Board website](https://beagleboard.org/logo) and used in +accordance with their trademark rules. # Getting started on the Beagle Bone Black From 4bddaf483246aeb3bd5a61460fc6cbe0deeb576a Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Tue, 4 May 2021 14:10:30 +0200 Subject: [PATCH 15/15] fsfw update --- fsfw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fsfw b/fsfw index f3530d3..86431c8 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit f3530d3c7ede036e02a65963fcf36da4e5dc024a +Subproject commit 86431c854b3bcf509c01173171c25689a781dd60