Kernel 和设备树
Kernel defconfig
在 yocto 环境下执行
devtool menuconfig linux-mthreads
MTT E300 SoC 相关配置路径:
- Platform selection > MTT E300 SoC Family
- Device Drivers > SOC (System On Chip) specific Drivers > Moore Threads 64-bit ARM SoCs drivers > Moore Threads MTT E300 SoC & MTT E300 PWM support
- 其他驱动配置由相关章节描述;
建立 defconfig 文件
-
进入 arch/arm64/configs 目录,输入:
cp aimodule_defconfig boardx_defconfig -
修改 yocto meta 文件(meta/meta-m1000/recipes-kernel/linux/linux- mthreads_6.6.bbappend)以关联 kernel 和 boardx_defconfig,如图所示:
设备树
以下列出相关设备树文件(设备树源文件格式为 .dts,设备树包含文件格式为 .dtsi)
$ls arch/arm64/boot/dts/m1000/
m1000-main.dtsi m1000-aimodule.dts m1000-aimodule.dtsi
m1000-isp.dtsi m1000-videv.dtsi m1000-pmu.dtsi
m1000-smmu.dtsi
步骤 1:建立设备树文件
- 进入 arch/arm64/boot/dts/m1000/目录,输入:
cp m1000-aimodule.dts boardx.dtscp m1000-aimodule.dtsi boardx.dtsi
- 修改 Makefile 文件增加:
dtb-$(CONFIG_ARCH_M1000_SOC) += boardx.dtb
步骤 2:配置设备树
MTT E300 的设备树文件分为 .dtsi(设备树包含文件)和 .dts(设备树源文件)两种。.dts 文件中 include 了 .dtsi 文件。其中主要的配置在 m1000-main.dtsi/m1000-aimodule.dts 文件中,管脚相关的配置在 m1000-aimodule.dtsi 等其他文件中。用户自己的设备树文件(如上一节中的 boardx.dts 文件)中应包含这两个文件,如下图所示:
一般情况下,用户无需修改 m1000-main.dtsi/m1000-aimodule.dtsi。如果确实需要修改其中的某个配置项,不建议直接修改该文件,而是在 m1000- aimodule.dts 文件中重新定义这个配置项。
步骤 3:编译设备树 dtb
-
修改 yocto meta 文件(meta/meta-m1000/conf/machine/aimodule.conf)以关联 kernel 和 boardx.dtb,如图所示:
-
执行编译 kernel 命令即可同时生成 boardx.dtb
RT-linux
如果开启了RT-kernel,可用如下测试实例:
- 空载,非隔离场景,cpu 1~11 开启优先级90的实时任务,运行12小时
#Uboot env
# 设置unbound workqueue 只在 cpu0 上执行:
setenv bootextraarg 'quiet splash workqueue.unbound_cpus=0'
#系统测试
sudo su
./non-isolcpus_rtlinux.sh 90 12
- 负载,非隔离场景,cpu 1~11 开启优先级90的实时任务,运行12小时
#Uboot env
# 设置unbound workqueue 只在 cpu0 上执行:
setenv bootextraarg 'quiet splash workqueue.unbound_cpus=0'
#系统测试
sudo su
./non-isolcpus_rtlinux.sh 90 12 --stress
- 负载,隔离场景,cpu 0
7为housekeeping & cpu 811为被隔离cpu,在被隔离核cpu 8~11 开启优先级90的实时任务,运行12小时
#Uboot env
setenv bootextraarg 'quiet splash isolcpus=managed_irq,domain,8-11 rcu_nocbs=8-11 irqaffinity=0-7 cpuidle.off=1'
#系统测试
sudo su
./isolcpus_rtlinux.sh 90 12 --stress
- 模型,非隔离场景无实时任务
#Uboot env
setenv bootextraarg 'quiet splash'
#无实时任务,跑模型即可
- 模型,隔离场景,cpu 0
7为housekeeping & cpu 811为被隔离cpu,在被隔离核cpu 8~11 开启优先级90的实时任务
#Uboot env
setenv bootextraarg 'quiet splash isolcpus=managed_irq,domain,8-11 rcu_nocbs=8-11 irqaffinity=0-7 cpuidle.off=1'
#被隔离实时任务启动
time taskset -c 8-11 sudo cyclictest -m -Sp90 -i200 -D12h -b50
- 参考脚本: isolcpus_rtlinux.sh
#!/bin/bash
check_running_as_root() {
uid="$(id -u 2>/dev/null)"
if [ "$uid" = "0" ]; then
echo "pass: running as root"
else
echo "fail: not running as root"
echo "info: please run with <sudo su> first"
exit
fi
}
check_running_as_root
echo
if [ $# -lt 2 ];then
echo "./isolcpus_rtlinux.sh <优先级> <测试时长:小时> [--stress:否则为空载]"
exit
fi
## Disable powercapping:
#echo "read power capping enable[0]/disable[2]: $(ac_tool register r32 -a 0x280fd2c0)"
##echo "disable power capping: $(ac_tool register w32 -a 0x280fd2c0 -v 2)"
#echo "disabling power capping $(echo 1 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/powercapping_disable) ..."
#echo "read power capping enable[0]/disable[2]: $(ac_tool register r32 -a 0x280fd2c0)"
#echo
#
## Enable VPU performance
#echo "read VPU devfs governor: $(cat /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor)"
#echo "enabling VPU performance $(echo performance > /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor) ..."
#echo "read VPU devfs governor: $(cat /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor)"
#echo
#
## Disable cpuidle state0:
#echo -e "cpuidle state0 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state0/disable)"
#echo "disabling cpuidle state0 on core 8~11 ..."
##echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state0/disable
##echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state0/disable
#echo 1 > /sys/devices/system/cpu/cpu8/cpuidle/state0/disable
#echo 1 > /sys/devices/system/cpu/cpu9/cpuidle/state0/disable
#echo 1 > /sys/devices/system/cpu/cpu10/cpuidle/state0/disable
#echo 1 > /sys/devices/system/cpu/cpu11/cpuidle/state0/disable
#echo -e "cpuidle state0 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state0/disable)"
#echo
#
## Disable cpuidle state1:
#echo -e "cpuidle state1 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable)"
#echo "disabling cpuidle state1 on core 8~11 ..."
##echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state1/disable
##echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state1/disable
#echo 1 > /sys/devices/system/cpu/cpu8/cpuidle/state1/disable
#echo 1 > /sys/devices/system/cpu/cpu9/cpuidle/state1/disable
#echo 1 > /sys/devices/system/cpu/cpu10/cpuidle/state1/disable
#echo 1 > /sys/devices/system/cpu/cpu11/cpuidle/state1/disable
#echo -e "cpuidle state1 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable)"
#echo
#
## Disable cpu_manage on acdev:
#echo "cpu manage enable[1]/disable[0]: $(cat /sys/kernel/cpu_manage/enable)"
#echo "disabling cpu manage on acdev $(echo 0 > /sys/kernel/cpu_manage/enable) ..."
#echo "cpu manage enable[1]/disable[0]: $(cat /sys/kernel/cpu_manage/enable)"
#echo
if [ $# -eq 3 ] && [ "$3"x == "--stress"x ];then
echo "12 cpus stress:"
stress --cpu 12 &
sleep 2
echo
fi
date
echo
# Housekeeping cpu : core 0~7
# Isolated cpus : core 8~11
echo "time taskset -c 8-11 sudo cyclictest -m -Sp$1 -i200 -D$2h -b50"
echo
time taskset -c 8-11 sudo cyclictest -m -Sp$1 -i200 -D$2h -b50
echo
date
non-isolcpus_rtlinux.sh
#!/bin/bash
check_running_as_root() {
uid="$(id -u 2>/dev/null)"
if [ "$uid" = "0" ]; then
echo "pass: running as root"
else
echo "fail: not running as root"
echo "info: please run with <sudo su> first"
exit
fi
}
check_running_as_root
echo
if [ $# -lt 2 ];then
echo "./non-isolcpus_rtlinux.sh <优先级> <测试时长:小时> [--stress:否则为空载]"
exit
fi
# Disable powercapping:
echo "read power capping enable[0]/disable[2]: $(ac_tool register r32 -a 0x280fd2c0)"
#echo "disable power capping: $(ac_tool register w32 -a 0x280fd2c0 -v 2)"
echo "disabling power capping $(echo 1 > /sys/devices/platform/soc@0/75b000.i2c/i2c-18/18-0040/hwmon/hwmon0/powercapping_disable) ..."
echo "read power capping enable[0]/disable[2]: $(ac_tool register r32 -a 0x280fd2c0)"
echo
# Enable VPU performance
echo "read VPU devfs governor: $(cat /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor)"
echo "enabling VPU performance $(echo performance > /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor) ..."
echo "read VPU devfs governor: $(cat /sys/devices/platform/soc@0/200000.vpu/devfreq/200000.vpu/governor)"
echo
# Disable cpuidle state0:
echo -e "cpuidle state0 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state0/disable)"
echo "disabling cpuidle state0 on core 1~11 ..."
#echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu8/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu9/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu10/cpuidle/state0/disable
echo 1 > /sys/devices/system/cpu/cpu11/cpuidle/state0/disable
echo -e "cpuidle state0 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state0/disable)"
echo
# Disable cpuidle state1:
echo -e "cpuidle state1 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable)"
echo "disabling cpuidle state1 on core 1~11 ..."
#echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu8/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu9/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu10/cpuidle/state1/disable
echo 1 > /sys/devices/system/cpu/cpu11/cpuidle/state1/disable
echo -e "cpuidle state1 enable[0]/disable[1]: \n$(cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable)"
echo
# Disable cpu_manage on acdev:
echo "cpu manage enable[1]/disable[0]: $(cat /sys/kernel/cpu_manage/enable)"
echo "disabling cpu manage on acdev $(echo 0 > /sys/kernel/cpu_manage/enable) ..."
echo "cpu manage enable[1]/disable[0]: $(cat /sys/kernel/cpu_manage/enable)"
echo
if [ $# -eq 3 ] && [ "$3"x == "--stress"x ];then
echo "12 cpus stress:"
stress --cpu 12 &
sleep 2
echo
fi
date
echo
# Housekeeping cpu : core 0
# Isolated cpus : core 1~11
#echo "time taskset -c 1-11 sudo cyclictest -m -Sp$1 -i200 -D$2h -b50"
#echo
#time taskset -c 1-11 sudo cyclictest -m -Sp$1 -i200 -D$2h -b50
# Housekeeping task : core 0
# Real-Time task : core 1~11
echo "time sudo cyclictest -m -p$1 -i200 -D$2h -b50 -t 11 -a 1-11"
echo
time sudo cyclictest -m -p$1 -i200 -D$2h -b50 -t 11 -a 1-11
echo
date

