QEMU

Download VxWorks SDK for IA - QEMU (x86-64) VxWorks Version 23.09 with the link

Installation Prerequisite(s)

sudo apt install build-essential libc6:i386

Having an FTP server installed on your development host will make application deployment easier and allow you to access the host file system from a VxWorks target.

To accommodate for the varying runtime configurations of the VxWorks kernel images included in the SDKs, you may be interested in using an FTP server option based on pyftpdlib.

Install pyftpdlib:

sudo apt install python-pip
sudo pip install pyftpdlib

Starting a local FTP server on port 21 with user "target" and password "vxtarget" and FTP root in the current user's home can be done as follows

$ sudo python -m pyftpdlib -p 21 -u target -P vxTarget -i 127.0.0.1 -d $HOME

Running the VxWorks kernel and the applications created with the SDK requires installing QEMU

$ sudo apt install qemu-system-x86

Booting VxWorks on QEMU (IA)

QEMU can be used to run the VxWorks kernel included in the SDK and to deploy VxWorks applications.

Start by opening a Linux terminal window and going to the location of your unpacked VxWorks SDK. The following command can be used to start a VxWorks guest in QEMU.

qemu-system-x86_64 -m 512M -kernel vxsdk/bsps/itl_generic_3_0_0_1/vxWorks \
-net nic -net user,hostfwd=tcp::1534-:1534,hostfwd=tcp::2345-:2345 \
-display none -serial stdio -monitor none \
-append "bootline:fs(0,0)host:vxWorks h=10.0.2.2 e=10.0.2.15 u=target pw=vxTarget o=gei0" 

Output

Customizing the values for the user (u) and password (pw) parameters to the ones matching a valid FTP user on your development host will allow you to access the host file system from the VxWorks instance running in QEMU. The VxWorks instance will have access to the root folder of your FTP server.

Application development

Start by opening a Linux terminal window and going to the location of your unpacked VxWorks SDK.

Source the SDK development environment before using the SDK.

source sdkenv.sh

Developing applications from the command line

The VxWorks compiler driver (wr-cc/wr-c++) utility lets you invoke VxWorks toolchains to compile your real time process (RTP) application from command line. The SDK development environment includes a set of environment variables (CC, CXX, CPP, etc) which match the various compiler driver utilities.

Procedure:

  1. Create a C source file foo.c:

#include <stdio.h>

int main(void)
    {
    printf("hello, world!\n");
    return 0;
    }
  1. Compile the source file foo.c to create a Real Time Process application.

wr-cc -rtp foo.c -static -o foo.vxe

or

$CC -rtp foo.c -static -o foo.vxe

Alternatively, you can also create a Makefile and then call make to compile the source file.

$CC -rtp foo.c -static -o foo.vxe
make

Developing applications using CMake

By default, a generated VxWorks SDK includes CMake. When the application developer sources the SDK environment, they will automatically have access to CMake. There is no need to download, install and configure CMake separately. With VxWorks CMake, you can build existing CMake examples that are included in the generated SDK, or you can create your own projects.

CMake examples can be found in the directories <SDK_DIR>/examples/rtp/hello_cmake_rtp and <SDK_DIR>/examples/dkm/hello_cmake_dkm

Procedure:

  1. Create a project directory, called my_project.

mkdir my_project
  1. Create the CMakeLists.txt file in the project folder.

  2. To build your project, run the following command:

cmake -D CMAKE_TOOLCHAIN_FILE=${WIND_SDK_HOME}/vxsdk/sysroot/mk/rtp.toolchain.cmake .

Running applications

Start an FTP server on port 21 with user "target" and password "vxtarget" and FTP root in the current user's home.

sudo python -m pyftpdlib -p 21 -u target -P vxTarget -d $HOME &

After booting VxWorks on your target, switching to the "cmd" shell will allow you to navigate to the location of your application with greater ease.

E.g.

-> cmd
[vxWorks *]# 

Placing the application in a location accessible over FTP will make it visible with minimal configuration to the VxWorks instance.

Assuming the application is located in $HOME/opt and the FTP server uses a minimal configuration which provides FTP access to $HOME:

[vxWorks *]# cd opt
[vxWorks *]# ls
opt/./hello
opt/./hello.c
[vxWorks *]# more hello.c
#include <stdio.h>

int main(int argc, char **argv) {
	printf("Hello World\n");
	return 0;
}
[vxWorks *]# hello
Launching process 'hello' ...
Process 'hello' (process Id = 0xffff8000004bb6e0) launched.
Hello World

Creating and deploying Python applications

The VxWorks image included with the SDK contains all the prerequisites for running python applications on VxWorks.

Launch Python from the cmd shell to print the Hello World! string:

[vxWorks *] cd /usr
[vxWorks *]# python3
Launching process 'python3' ...
Process 'python3' (process Id = 0xffff800000641380) launched.
Python 3.8.0 (default, Feb  2 2021, 19:28:52) 
[Clang 10.0.1.1 (http://gitlab.devstar.cloud/compilers/llvm/clang.git 5449acbae on vxworks
Type "help", "copyright", "credits" or "license" for more information.

>>> import sys
>>> print("Hello World!")
Hello World!
>>> print (sys.platform)
vxworks

Python scripts can be executed as

[vxWorks *] python3 helloworld.py

Hello World!

Creating Rust applications

The Rust development environment is set up in a similar manner to the standard application development environment, i.e. by sourcing the SDK environment file.

E.g.

source <SDK_DIR>/toolkit/wind_sdk_env.linux 

Building a simple hello world Rust program

cargo new hello
cd hello
cargo build

This will create an RTP called hello.vxe in the directory target/vxworks-target/build-mode where vxworks-target is one of the targets listed below and build-mode is either debug or release.

For example you might see an RTP in the directory: target/armv7-wrs-vxworks-eabihf/debug/hello.vxe

VxWorks Rust targets:

  • ARM 32-bit: armv7-wrs-vxworks-eabihf

  • ARM 64-bit: aarch64-wrs-vxworks

  • Intel 32-bit: i686-wrs-vxworks

  • Intel 64-bit: x86_64-wrs-vxworks

Run the hello.vxe in the VxWorks shell. You will see the following output:

Hello, world!

Last updated