User Tools

Site Tools


code:work:pi:rtpreempt:start

This is an old revision of the document!


Raspberry Pi

Installing Mini Image

  1. Download the raw image https://minibianpi.wordpress.com/
    cd ~/work/pi
    wget <<DIRECT FILE LINK>>
  2. Uncompress the image
    md5sum 2016-03-12-jessie-minibian.tar.gz
    # verify that you get
    # 136cac722a4f78f49b54971ae1cc03ee  2016-03-12-jessie-minibian.tar.gz
    tar -zxvf 2016-03-12-jessie-minibian.tar.gz
  3. Direct copy this image to your memory stick (mine is /dev/sdv but choose wisely!)
    time sudo /bin/dd bs=1M if=2016-03-12-jessie-minibian.img of=/dev/sdX
  4. Resize the partition with gparted
    1. Make /dev/sdb2 fill the sdcard
      sudo gparted /dev/sdb

:!::!: DO NOT DO THIS… USE gparted :!::!:

Manually resize partition

  1. Resize the partition to fill the entire sd scard
    1. Display the partitions and figure out which is the partition to modify
      lsblk
    2. Show the drive geometry
      sudo parted /dev/sdX
      (parted) unit chs
      (parted) print
      Model: Generic STORAGE DEVICE (scsi)
      Disk /dev/sdb: 490975,3,15
      Sector size (logical/physical): 512B/512B
      BIOS cylinder,head,sector geometry: 490976,4,16.  Each cylinder is 32.8kB.
      Partition Table: msdos
      
      Number  Start     End         Type     File system  Flags
       1      0,1,0     1953,3,15   primary  fat16
       2      1954,0,0  25407,3,15  primary  ext4
    3. Remove partition 2
      (parted) rm 2
    4. Define 2 now as all of the the drive (this goes with the geometry above)
      mkpart primary 1954,0,0 490975,3,15

Cross Compiling

Attempting to cross compile on the GUI computer

GUI Compiler Setup

  1. Grab the toolchain
    cd ~/work
    mkdir pi
    cd ~/work/pi
    git clone https://github.com/raspberrypi/tools
  2. Add this to your PATH
    1. First edit your profile
      nano ~/.profile
    2. And add this line
      # add raspberry pi toolchain to path
      PATH="$HOME/work/pi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH"
  3. Grab source code
    cd ~/work/pi
    git clone --depth=1 https://github.com/raspberrypi/linux

GUI Compile

Try compiling the source we just downloaded

  1. Step one: setup
    cd ~/work/pi/linux
    KERNEL=kernel7
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
  2. Step two: build
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j `getconf _NPROCESSORS_ONLN`

Install on the sd card

  1. Create mount points and mount the card partitions to them
    cd /mnt
    sudo mkdir pisdcard
    sudo mkdir pisdcard/fat32
    sudo mkdir pisdcard/ext4
    sudo mount /dev/sdb1 /mnt/pisdcard/fat32
    sudo mount /dev/sdb2 /mnt/pisdcard/ext4
  2. Install the kernel on the ext4 partition
    # go where the kernel is that you want to install
    cd /home/lvis/work/pi/linux_original
    sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/pisdcard/ext4 modules_install
  3. Backup the kernel on there, and then install our new kernel on the fat32 partition
    sudo cp /mnt/pisdcard/fat32/$KERNEL.img /mnt/pisdcard/fat32/$KERNEL-backup.img
    sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/pisdcard/fat32/$KERNEL.img
    sudo cp arch/arm/boot/dts/*.dtb /mnt/pisdcard/fat32/
    sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/pisdcard/fat32/overlays/
    sudo cp arch/arm/boot/dts/overlays/README /mnt/pisdcard/fat32/overlays/
    sync
    sudo umount /mnt/pisdcard/fat32
    sudo umount /mnt/pisdcard/ext4

GUI RT PREEMPT Patch Compile

  1. Copy code and patch
    cd ~/work/pi
    wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.13-rt10.patch.xz
    rsync -vaP linux_original/ linux_4.9.13_rt10/
    cd /home/lvis/work/pi/linux_4.9.13_rt10
    xz -dc ../patch-4.9.13-rt10.patch.xz | patch -p1
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
  2. Setup
    cd ~/work/pi/linux_4.9.13_rt10
    KERNEL=kernel7
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
  3. Modify the .config file to enable RT_PREEMPT
    1. Load up the x11 configuration editor
      make xconfig
    2. Search for “PREEMPT”
    3. Processor type and features
      1. Preemption Model (Fully Preemptible Kernel (RT))
      2. Timer frequency (1000 HZ)
    4. Power management and ACPI options
      1. REMOVE Device power management core functionality
      2. CPU Frequency scaling
        1. REMOVE CPU Frequency scaling
    5. Verify with a quick grep
      lvis@lvis-desktop:~/work/pi/linux_4.9.13_rt10$ cat .config | grep PREEMPT
      CONFIG_PREEMPT_RCU=y
      CONFIG_PREEMPT=y
      CONFIG_HAVE_PREEMPT_LAZY=y
      # CONFIG_PREEMPT_NONE is not set
      # CONFIG_PREEMPT_VOLUNTARY is not set
      CONFIG_PREEMPT__LL=y
      # CONFIG_PREEMPT_RTB is not set
      # CONFIG_PREEMPT_RT_FULL is not set
      CONFIG_PREEMPT_COUNT=y
      CONFIG_DEBUG_PREEMPT=y
      # CONFIG_PREEMPT_TRACER is not set
  4. Build (had to press enter a BUNCH of times to accept defaults when I changed kernel config)
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j `getconf _NPROCESSORS_ONLN`

Install on the sd card

  1. Create mount points and mount the card partitions to them
    cd /mnt
    sudo mkdir pisdcard
    sudo mkdir pisdcard/fat32
    sudo mkdir pisdcard/ext4
    sudo mount /dev/sdb1 /mnt/pisdcard/fat32
    sudo mount /dev/sdb2 /mnt/pisdcard/ext4
  2. Install the kernel on the ext4 partition
    # go where the kernel is that you want to install
    cd ~/work/pi/linux_4.9.13_rt10
    sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/pisdcard/ext4 modules_install
  3. Backup the kernel on there, and then install our new kernel on the fat32 partition
    sudo cp /mnt/pisdcard/fat32/$KERNEL.img /mnt/pisdcard/fat32/$KERNEL-backup.img
    sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/pisdcard/fat32/$KERNEL.img
    sudo cp arch/arm/boot/dts/*.dtb /mnt/pisdcard/fat32/
    sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/pisdcard/fat32/overlays/
    sudo cp arch/arm/boot/dts/overlays/README /mnt/pisdcard/fat32/overlays/
  4. Add this line to /boot/cmdline.txt which can cause kernel panic if not disabled
    1. Edit this file
      sudo nano /mnt/pisdcard/fat32/cmdline.txt
    2. and add these statements
      # found this additional one too 
      # http://www.frank-durr.de/?p=203
      # Most people also disable the Low Latency Mode (llm) for the SD card:
      
      sdhci_bcm2708.enable_llm=0 dwc_otg.fiq_enable=0 dwc_otg.fiq_fsm_enable=0 dwc_otg.nak_holdoff=0
  5. Unmount the drives
    sync  # just run this before unmounting the drives.. flush the cache
    sudo umount /mnt/pisdcard/fat32
    sudo umount /mnt/pisdcard/ext4

Boot Pi

  1. Insert sd card into Pi
  2. FIXME Insert the keyboard into the Pi (WITHOUT a device in there… the kernel panics on boot!)
  3. Default user/pass is root and raspberry which I changed to the lvis standard password

Cyclic Test

We want to run cyclic test on here to make sure that the performance on the Pi is what we need /home/lvis/work/pi/linux_4.9.13_rt10

  1. Update our software
    apt-get update
    apt-get upgrade
  2. Install gcc git
    apt-get install build-essential git
  3. Download the cyclic test code (found from here: https://rt.wiki.kernel.org/index.php/Cyclictest)
    mkdir ~/work
    cd ~/work
    git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
  4. Checkout the stable version
    cd ~/work/rt-tests
    git fetch
    git checkout stable/v1.0
  5. Compile and install
    make all
    cp ./cyclictest /usr/local/bin/
  6. Try it out
    cyclictest -a -t -n -p99
    # use priority 80 and interval of 4khz
    cyclictest -m -t -p 80 -n -i 250

Xenomai

cd /home/lvis/work/pi
mkdir download
cd download
wget https://xenomai.org/downloads/ipipe/v4.x/arm/ipipe-core-4.1.18-arm-9.patch
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.18.tar.xz
wget https://xenomai.org/downloads/xenomai/stable/latest/xenomai-3.0.3.tar.bz2

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.43.tar.xz
wget https://xenomai.org/downloads/ipipe/v4.x/arm/ipipe-core-4.4.43-arm-7.patch

# uncompress kernel
cd /home/lvis/work/pi
tar xf download/linux-4.1.18.tar.xz 
mv linux-4.1.18 linux-4.1.18-ipipe

tar xf download/linux-4.4.43.tar.xz 
mv linux-4.4.43 linux-4.4.43-ipipe


# uncompress xenomai
tar xvf download/xenomai-3.0.3.tar.bz2

# copy the latest ipipe patch for 4.1.18 in to the patch directory
cd /home/lvis/work/pi/xenomai-3.0.3
# cp ../download/ipipe-core-4.1.18-arm-9.patch kernel/cobalt/arch/arm/patches/
cp -a ../download/ipipe-core-4.4.43-arm-7.patch xenomai-3.0.3/kernel/cobalt/arch/arm/patches/

# patch kernel
cd ~/work/pi/xenomai-3.0.3
./scripts/prepare-kernel.sh --linux=~/work/pi/linux-4.1.18-ipipe
./scripts/prepare-kernel.sh --linux=~/work/pi/linux-4.4.43-ipipe
# and type "arm" for architecture (no errors)

# configure kernel (first default, then we change it)
KERNEL=kernel7
cd ../linux-4.1.18-ipipe
cd ../linux-4.4.43-ipipe
#### make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  * CPU Power Management * Turn it all off
  * Kernel Features * Preemption Model (Preemptible Kernel (Low-Latency Desktop))
  * Kernel Features * [NO] Allow for memory compaction
  * Kernel Features * [NO] Contiguous Memory Allocator
  │   Selected by: COMPACTION [=y] && MMU [=y] || CMA [=y] && HAVE_MEMBLOCK [=y] && MMU [=y]
** for sage build, not doing this ** enabling this CONFIG_XENO_OPT_SHIRQ
  * Had to disable the Intel ethernet modules... it had an error, just disabled ALL Intel ethernet...
  * Had to disable lustre driver from device -> staging
  * Had to disable  CAIF virtio transport driver

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j `getconf _NPROCESSORS_ONLN`

Xenomai Pi Compiled

This did compile for me, haven't tried it yet! — David Lloyd Rabine 2017/03/04 20:55

cd ~/work/pi
tar xf download/linux-3.18.20.tar.xz
mv linux-3.18.20 linux-3.18.20-ipipe
cd xenomai-3.0.3
scripts/prepare-kernel.sh --arch=arm --linux=~/work/pi/linux-3.18.20-ipipe
cd ~/work/pi/linux-3.18.20-ipipe
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig

# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
# no modules!?

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs -j `getconf _NPROCESSORS_ONLN`

cd /mnt
sudo mkdir pisdcard
sudo mkdir pisdcard/fat32
sudo mkdir pisdcard/ext4
sudo mount /dev/sdb1 /mnt/pisdcard/fat32
sudo mount /dev/sdb2 /mnt/pisdcard/ext4

# go where the kernel is that you want to install
cd ~/work/pi/linux_4.9.13_rt10
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/pisdcard/ext4 modules_install

# and the rest
sudo cp /mnt/pisdcard/fat32/$KERNEL.img /mnt/pisdcard/fat32/$KERNEL-backup.img
sudo scripts/mkknlimg arch/arm/boot/zImage /mnt/pisdcard/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb /mnt/pisdcard/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /mnt/pisdcard/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README /mnt/pisdcard/fat32/overlays/

Xenomai Application Example from /home/david/src/pi/xenomai-3.0.3/demo/posix/cobalt/eth_p_all.c

 pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);

 while(1)
 {

 }

Another good example /home/david/src/pi/xenomai-3.0.3/demo/posix/cobalt/xddp-echo.c

This example sends data down the pipe to keep from context switching which is probably what is causing Dan's code to not keep up.

  • This is an excellent example that has a real time thread and a non-real time thread that communicate.
code/work/pi/rtpreempt/start.1488823235.txt.gz · Last modified: 2017/03/06 18:00 by david