iMX8M Industrial Environmental chamber testing
On this page environmental stress testing results of iMX8M Industrial Development Kit are displayed. Detailed instructions how to setup boards are also shown.
Hardware configuration
All of the modules used standard specification except of the temperature ranges for the key components as described below:
- 1x iMX8M Industrial Development Kit in Max configuration
- i.MX 8M Quad 1.5GHz CPU - extended industrial temperature range (-40°C to +105°C)
- 4GB LPDDR4 Memory - extended industrial temperature range (-40°C to +105°C)
- eMMC 32GB - industrial temperature range (-40°C to +85°C)
- WiFi & Bluetooth - industrial temperature range (-40°C to +85°C)
- 1x iMX8M Industrial Development Kit in Pro configuration
- i.MX 8M Quad 1.5GHz CPU - extended industrial temperature range (-40°C to +105°C)
- 2GB LPDDR4 Memory - automotive temperature range (-40°C to +125°C)
- eMMC 16GB - industrial temperature range (-40°C to +85°C)
- WiFi & Bluetooth - industrial temperature range (-40°C to +85°C)
- 1x iMX8M Industrial Development Kit in Pro Commercial configuration
- i.MX 8M Quad 1.5GHz CPU - extended industrial temperature range (0°C to +95°C)
- 2GB LPDDR4 Memory - automotive temperature range (-40°C to +125°C)
- eMMC 16GB - Commercial temperature range (-25°C to +85°C)
- WiFi & Bluetooth - industrial temperature range (-30°C to +85°C)
- 1x iMX8M Industrial Development Kit in Basic configuration
- i.MX 8M Quad 1.5GHz CPU - extended industrial temperature range (-40°C to +105°C)
- 1GB LPDDR4 Memory - industrial temperature range (-40°C to +95°C)
- eMMC 8GB - industrial temperature range (-40°C to +85°C)
- WiFi & Bluetooth - industrial temperature range (-40°C to +85°C)
All of the tested modules used standard configuration of iMX8M Development Baseboard with extended temperature range (-20°C to +85°C). The majority of tested kits used a standard heatsink. This heatsink sized 25x25x25mm is included in every development kit package. Thus these measurements show the actual performance of web shop based configuration. One of the board was mounted with extra large heatsink and one of the board was mounted with standard heatsink plus Fan to test effect on performance.
The setup in the environmental chamber:
Test description
Four iMX8M Industrial Development Kits (one in Max configuration, one in Pro configuration, one in Pro Commercial configuration and one in Basic configuration) were running full peripheral test and stressed all the peripherals in different range of temperatures to check the reliability and stability of the firmware and hardware design.
Configuration, software and testing threads in details:
1x iMX8M Industrial Development Kit [No 7] in Max configuration peripheral stress testing
- 1 thread of extensive Memory stress test
- 1 thread of CPU stress test
- sending HDMI Output to external monitor
- copying a file from the first USB device to SD card and vice versa
- copying a file from the second USB device to SD card and vice versa
- pinging the host PC via Ethernet
- all the messages were printed out on the serial console through connected Micro USB cable
- firmware running from eMMC
- standard 25x25x25mm heatsink plus fan
1x iMX8M Industrial Development Kit [No 4B] in Pro configuration Memory stress testing
- 1 thread of extensive Memory stress test
- 1 thread of CPU stress test
- sending HDMI Output to external monitor
- copying a file from the first USB device to SD card and vice versa
- copying a file from the second USB device to SD card and vice versa
- pinging the host PC via Ethernet
- all the messages were printed out on the serial console through connected Micro USB cable
- firmware running from eMMC
- Extra large 48x48x16mm heatsink
1x iMX8M Industrial Development Kit [No 3] in Pro Commercial configuration Memory stress testing
- 1 thread of extensive Memory stress test
- 1 thread of CPU stress test
- sending HDMI Output to external monitor
- copying a file from the first USB device to SD card and vice versa
- copying a file from the second USB device to SD card and vice versa
- pinging the host PC via Ethernet
- all the messages were printed out on the serial console through connected Micro USB cable
- firmware running from eMMC
- standard 25x25x25mm heatsink
1x iMX8M Industrial Development Kit [No 2B] in Basic configuration peripheral stress testing
- 1 thread of extensive Memory stress test
- 1 thread of CPU stress test
- sending HDMI Output to external monitor
- copying a file from the first USB device to SD card and vice versa
- copying a file from the second USB device to SD card and vice versa
- pinging the host PC via Ethernet
- all the messages were printed out on the serial console through connected Micro USB cable
- firmware running from eMMC
- standard 25x25x25mm heatsink
USB flash devices were placed outside the environmental chamber. All the scripts running during the test and the board setup instructions can be found in section How to prepare the test.
Testing Results
The picture below shows the temperature profile during the whole testing process:
680px
Running the boards at -40°C – PASS
Test description: CPU, Memory and peripheral stress tests were running at -40°C. All the tested kits were working without errors during the whole time, even if some components used for iMX8M PRO QuadLite Commercial were only rated for temperature range between 0°C and +95°C. iMX8M Industrial Development Base Boards were running at this temperature with components certified only from 0°C to +85°C temperature range.
A closer image on the temperature chamber displaying the minimum temperature is shown below. These readouts are available on the display:
- the first number shows current temperature
- the second one set temperature
- the last two shows rerelative humidity. Humidity was not controlled during testing process.
Running the kits at high temperatures (from +60°C to +100°C) – PASS
Test description: The ambient temperature was gradually increasing (from 60°C up to 100°C) while CPU, Memory and peripheral stress tests were running. The moment when CPU frequency had decreased was used as a test threshold (this occurred when CPU temperature reached +70°C up to +100°C). Components used for iMX8 Base Boards were only rated from 0°C to +85°C operating temperature range.
Switch ON/OFF test at -40°C– PASS
Test description: At temperature -40°C the boards were switched OFF, left OFF for at least 10 minutes (to cool down completely) and then switched ON to see if they boot up without problems. Once booted up into Linux, the test scrip was launched to test RAM memory and all peripherals. The boards were turned off again multiple times to see potential problems at lowest temperature level. All of the tested boards booted up successfully.
Cooling performance at high temperatures
Test description: As mentioned above, different heatsinks and enclosures were utilized in order to compare the cooling abilities. All these tests were performed with Max version which generate the most heat by itself. All setup reached temperature +85°C in the chamber while still successfully running. The board in the enclosure with the biggest height and cooling fins on the top size reached +100°C.
PC setup
The PC was used during test while controlling / monitoring all the boards through serial console sessions. The control computer was running Windows 10 operating system.
HDMI and Serial consoles
To control iMX8M Industrial Development Kit, one TeraTerm serial console was opened per board. The boards was connected to external HDMI switch to monitoring HDMI output.
The setup of the environmental chamber cables and out-of-chamber equipment:
800px
Preparing the test
Boot device and software
eMMC was selected as a booting device for all the boards. U-Boot settings were not adjusted as the default configuration was used. The only change compared to standard software package was running a multimedia filesystem. To prepare a fresh eMMC follow these instructions. Here is an example of creating a eMMC suitable for Max configuration:
git clone https://github.com/voipac/imx6tinyrex_bin_linux cd imx6tinyrex_bin_linux/ sudo ./fsl-sdcard-partition.sh -max /dev/mmcblk0
Downloading stress test
Stressapptest package was selected to check CPU and memory integrity. Placing this file into the same directory where the testing script will be stored is important:
wget http://downloads.voipac.com/files/iMX6_TinyRex_Development_Kit/module/documents/Environmental_chamber_testing/stressapptest
Setup the cron
To be able to check the CPU temperature every minute a new cron job was setup. For Ubuntu file systems postfix package installation is required:
sudo apt-get install postfix
To setup a cron tab, the file containing all cron jobs needs to be altered. Before running the crontab for the first time, selecting a text editor is required:
sudo crontab -e
Paste the following line to the end of the cron list file. The output time format will be set the same as for stressapptest. Cron job performs a current CPU temperature readout and the data are saved in the log file. The log format was selected identical to the one used by stressapptest package:
* * * * * { echo -n $(date +%Y/%m/%d-%T); echo -n "("; echo -n $(date +%Z); echo -n ") "; cat /sys/devices/virtual/thermal/thermal_zone0/temp; } >> ~/testing-env-chamber/cpu-temp.log
Note: The percent sign '%' has a special purpose in the cron file. As this sign is needed to write the date formats, the backslash is required to be placed before the percent sign: '\%'.
Setting up the date
If the master PC is equipped with a timeserver, server date and time can be automatically obtained using this Linux feature:
ntpdate 192.168.0.2
Time and date can also be set up manually (use format MMDDhhmmYYYY e.g. 07th of July 2016 4:27 pm):
date 071116272016
Setup the CPU temperature printout
Open one SSH client per board where CPU temperature will be shown. Tail command is utilized to display the last part of the log file, which is filled up as the CRON job outputs the current readouts:
tail -F cpu-temp-measuring.log
Error checking during peripheral test
To make sure tests are running smoothly, potential errors can be detected by opening another SSH session:
tail -f env-chamber-testing.log | grep -i "error"
Play video file for peripheral test
To be able to test HDMI Input during the peripheral testing, a video file was played from boards which were running memory stress tests only. Infinite loop is opened in another SSH session:
while [ true ]; do gst-play-1.0 /media/ploughing.mp4; done
Start CPU and memory stress test
Navigate into the directory, where stressapptest feature and test are stored.
Stress command for Max configuration:
./stressapptest -s 600000 -M 1000 -m 4 -C 4 -W -l ~/env-chamber-testing/stressapptest.log --printsec 100
Stress command for Pro configuration:
./stressapptest -s 600000 -M 700 -m 2 -C 2 -W -l ~/env-chamber-testing/stressapptest.log --printsec 100
Stress command for Basic configuration:
./stressapptest -s 600000 -M 150 -m 1 -C 1 -W -l ~/env-chamber-testing/stressapptest.log --printsec 100
Start peripheral test
Before the test start it is a good practice to make sure that all the devices were plugged in successfully. To find out where the devices were mounted following command can be used:
fdisk -l
The testing script uses multiple variables to specify its operation. As the first parameter board configuration is used (-max, -pro or -basic). As other parameters device names
are written in the following order: the first USB stick, the second USB, SD card and SATA drive (if used). All logs are stored into a single file.
Starting peripheral test for Max configuration:
./imx6-tinyrex-v1i1-peripheral-test.sh -max sdb1 sdc1 mmcblk2p2 sda2 2>&1 | tee -i trx-env-chamber-testing.log
Starting peripheral test for Pro configuration:
./imx6-tinyrex-v1i1-peripheral-test.sh -pro sdb1 sdc1 mmcblk2p2 sda1 2>&1 | tee -i trx-env-chamber-testing.log
Starting peripheral test for Basic configuration:
./imx6-tinyrex-v1i1-peripheral-test.sh -basic sda1 sdb1 mmcblk2p2 2>&1 | tee -i trx-env-chamber-testing.log
The complete script can be found in the download section or down below:
#!/bin/sh # iMX8MQ environmental chamber peripheral test mountDevice() { mkdir -p "/media/$2" mount /dev/$1 /media/$2 cat /proc/mounts | grep -F "/dev/$1 /media/$2" if [ "$?" -eq "0" ]; then echo "$2 mounted" else echo "$2 not mounted"; exit 2 fi } # prepare files cd ~/ mkdir -p env-chamber-testing/ cd env-chamber-testing/ touch env-chamber-testing.log touch cpu-temp.log basic=0 pro=0 max=0 case $1 in -basic) basic=1 ;; -pro) pro=1 ;; -max) max=1 ;; *) esac # mount devices mountDevice $2 usb0 mountDevice $3 usb1 mountDevice $4 mmc0 updateLogFiles() { # obtain board ID from IP address - be sure addresses are allocated based on MAC boardID=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1 | cut -d'.' -f4 | cut -d'2' -f2); # be sure time server is running on DHCP server currentTime=`date +%Y-%m-%d.%H:%M` mv env-chamber-testing.log trx-board-$boardID-env-chamber.log.$currentTime mv cpu-temp.log trx-board-$boardID-env-cpu-temp.log.$currentTime } finish_test_now() { echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Ctrl+C Detected: End of the test" precced=0; #kill -INT $vid_pid $str_pid $log_pid; sleep 3; test_status=`cat env-chamber-testing.log | grep -i "error" | grep -v -e "0 errors" -e "no corrected errors"` if [ -z "$test_status" ] then echo "*********TEST PASS*********" else echo "*********TEST FAIL*********" echo "List of detected errors:" cat env-chamber-testing.log | grep -i "error" | grep -v -e "0 errors" -e "no corrected errors" -e "List of detected errors:" fi updateLogFiles exit; } # kill all processes if Ctrl+C is detected trap finish_test_now 2 # play a video stream from HDMI input - testing also HDMI output gst-launch-1.0 -q imxv4l2src ! autovideosink & # stressapptest - one thread CPU, one thread memory, sata thread (if possible) if [ "${basic}" -eq "1" ]; then stress-ng --cpu 2 --vm 4 & str_pid=$! fi if [ "${pro}" -eq "1" ]; then stress-ng --cpu 4 --vm 4 & str_pid=$! fi if [ "${max}" -eq "1" ]; then stress-ng --cpu 4 --vm 4 & str_pid=$! fi echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Starting stressapptest with PID: " $str_pid proceed=1 # create test files file1_path=`mktemp` file2_path=`mktemp` file1=`basename $file1_path` file2=`basename $file2_path` dd if=/dev/urandom of=$file1_path bs=1024 count=10000 dd if=/dev/urandom of=$file2_path bs=1024 count=10000 cp1_from="/media/mmc0/" cp1_to="/media/usb0/" cp2_from="/media/usb0/" cp2_to="/media/usb1/" #copy files in case they are missing cp $file1_path $cp1_from cp $file1_path $cp1_to cp $file2_path $cp2_from cp $file2_path $cp2_to while [ $proceed -eq 1 ] do ping -q -c1 127.0.0.1 >> env-chamber-testing.log if [ $? -ne 0 ] then echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Ping failed" else echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Ping OK" fi cp1_done=`ps | grep $cp1_pid | grep cp` if [ -z "$cp1_done" ]; then # copy finished if cmp -s $cp1_from$file1 $cp1_to$file1; then echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) PASS: Copying file from $cp1_from to $cp1_to successful" else echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Difference between files on $cp1_from and $cp1_to detected" fi cp1_temp=$cp1_from # swap destinations cp1_from=$cp1_to cp1_to=$cp1_temp rm $cp1_to$file1 # remove destination file cp $cp1_from$file1 $cp1_to$file1 & cp1_pid=$! echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Started copying file from $cp1_from to $cp1_to" fi cp2_done=`ps | grep $cp2_pid | grep cp` if [ -z "$cp2_done" ]; then # copy finished if cmp -s $cp2_from$file2 $cp2_to$file2; then echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) PASS: Copying file from $cp2_from to $cp2_to successful" else echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Difference between files on $cp2_from and $cp2_to detected" fi cp2_temp=$cp2_from # swap destinations cp2_from=$cp2_to cp2_to=$cp2_temp rm $cp2_to$file2 # remove destination file cp $cp2_from$file2 $cp2_to$file2 & cp2_pid=$! echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Started copying file from $cp2_from to $cp2_to" fi done