====DEY如何优化成实时操作系统==== RT-Preempt Patch是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足硬实时的需求。 DEY官方不对RT进行集成,但客户可以根据项目需要使用相关的补丁. RT补丁下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ 注意DEY1.6 ~ 2.4不同的版本对应的内核版本也不尽相同,请根据您的DEY内核版本选用RT补丁。RT补丁用法请参考[[https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup#howto-setup-linux-with-preempt_rt-properly|RT官方文档]]。 下面以ccim6sbc为例,用不同的方法具体演练几个版本的实时补丁应用方法: ====DEY 2.0==== * [[#rt-devshell|本地快速应用RT补丁]] * [[#rt-yocto|用Yocto方式编译打RT补丁源]] * [[#rt-local|本地直接编译打RT补丁Linux内核]] 从Digi官方https://github.com/digi-embedded/meta-digi/tree/jethro/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.0下,ConnectCore 6 SBC使用3.14的内核。我们以这个平台为例实际操作一下。 首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。 bitbake core-image-base 成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录: bitbake -c devshell virtual/kernel 在出来的shell中,就是一个git的linux内核源码树,可以查看一下 git status 会打印出来git信息 HEAD detached at 281cebe nothing to commit, working directory clean 我们可以直接下载并应用RT补丁: wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/3.14/patch-3.14.79-rt85.patch.xz xzcat ./patch-3.14.79-rt85.patch.xz | patch -p1 补丁如果成功应用,出来的"patching file ..."没有错误提示。 ===配置内核选项=== 我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置: 选中这两项 Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz 禁用这一项 Kernel hacking -> Debug preemptible kernel 另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。 DEBUG_PREEMPT \\ Lock Debugging (spinlocks, mutexes, etc. . . ) \\ DEBUG_OBJECTS \\ … \\ 要配置内核选项 bitbake -c menuconfig virtual/kernel 然后改变内核选项并保存 退出后,可以用 bitbake -C compile virtual/kernel 来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码 ===编译排错=== 编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用"grep error"并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件: arch/arm/mach-imx/下面这三个文件 clk-pllv3.c clk-gate2.c clk-pfd.c 解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。 +#include #include 注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件 我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件 一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码 sudo install -o robin -g robin -d /usr/local/linux-dey cd /usr/local/linux git clone -b v3.14/dey2.0/maint https://github.com/peyoot/linux.git 打上RT补丁 wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/3.14/patch-3.14.79-rt85.patch.xz xzcat ./patch-3.14.79-rt85.patch.xz | patch -p1 三、安装DEY 2.0 SDK cd ~/Downloads wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.0/r5/sdk/40002891_E/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh ./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh 安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后 cd /usr/local/linux-dey/linux source /opt/dey/2.0-r5/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi unset LDFLAGS 下面我们生成平台的内核配置文件并配置它 make ccimx6sbc_defconfig (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了 make menuconfig 只需改动: 选中这两项 Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz 禁用这一项 Kernel hacking -> Debug preemptible kernel 然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中 mv ccimx6sbc_rt_defconfig arch/arm/configs/ 这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件 因为我们刚才是另存为defconfig,所以我们就这样做一次 make ccimx6sbc_rt_defconfig 接下来就可以直接编译内核了 make -j4 编译出来的zImage文件在arch/arm/boot下,而dtb设备树文件在rch/arm/boot/dts下 但在DEY 2.0,我们用的是uImage,所以最好编译一下uImage \\ make LOADADDR=0x10800000 uImage 我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig git checkout -b v3.14/dey-2.0/rtpreempt git add -A . git commit -a git push origin v3.14/dey-2.0/rtpreempt 我们修改DEY 2.0的linux源码git路径,以便用yocto的方式来编译镜像 cd /usr/local/dey-2.0/sources/meta-digi/meta-digi-arm/recipes-kernel/linux nano linux-dey_3.14.bb 添加 SRC_URI = "git://github.com/peyoot/linux.git" SRC_URI = "git://github.com/peyoot/linux.git;branch=v3.14/dey-2.0/rtpreempt file://defconfig" 修改: SRCBRANCH = "v3.14/dey-2.0/rtpreempt" SRCREV = "${AUTOREV}" 注意,我们用了打了rt_preempt实时补丁的内核,这个自定义的内核选项也需拷贝到dey2.0的源码下,才能编译出该内核特性,原始的meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig文件很小,但我们生成的是完整的内核选项,里面有许多不用的平台的配置,虽然大很多,但没关系。您可以直接从https://github.com/peyoot/linux/blob/v4.9/dey-2.4/maint/arch/arm/configs/ccimx6sbc_defconfig下载,并重命名为defconfig去覆盖原来在dey源码目录内的同名文件。 为了使上ssh的方式访问git,您还需要生成ssh密钥并添加到git帐户中, ssh-keygen -t rsa -b 4096 -C "您的email" ssh-add ~/.ssh/id_rsa 注意添加到github上的key是id_rsa.pub git push origin v3.14/dey-2.0/rtpreempt ====DEY 2.2/DEY2.4==== * [[#dey22|DEy 2.2]] * [[#dey24|DEY 2.4]] * [[#dey22rt-devshell|本地快速应用RT补丁]] * [[#dey22rt-yocto|用Yocto方式编译打RT补丁源]] * [[#dey22rt-local|本地直接编译打RT补丁Linux内核]] 从Digi官方https://github.com/digi-embedded/meta-digi/tree/morty/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.2下,ConnectCore 6 SBC使用4.1的内核。我们以这个平台为例实际操作一下。 首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。 bitbake core-image-base 成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录: bitbake -c devshell virtual/kernel 在出来的shell中,就是一个git的linux内核源码树,可以查看一下 git status 会打印出来git信息 HEAD detached at 281cebe nothing to commit, working directory clean 我们可以直接下载并应用RT补丁: wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.46-rt52.patch.xz ./patch-4.1.46-rt52.patch.xz | patch -p1 补丁如果成功应用,出来的"patching file ..."没有错误提示。 ===配置内核选项=== 我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置: Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz 另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。 DEBUG_PREEMPT \\ Lock Debugging (spinlocks, mutexes, etc. . . ) \\ DEBUG_OBJECTS \\ … \\ 要配置内核选项 bitbake -c menuconfig virtual/kernel 然后改变内核选项并保存 退出后,可以用 bitbake -C compile virtual/kernel 来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码 ===编译排错=== 编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用"grep error"并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件: arch/arm/mach-imx/下面这三个文件 clk-pllv3.c clk-gate2.c clk-pfd.c 解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。 +#include #include 注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件 我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件 一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码 sudo install -o robin -g robin -d /usr/local/linux-dey cd /usr/local/linux git clone -b v4.1/dey-2.2/maint https://github.com/peyoot/linux.git 打上RT补丁 https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.46-rt52.patch.xz ./patch-4.1.46-rt52.patch.xz | patch -p1 三、安装DEY 2.2 SDK cd ~/Downloads wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.2/r3/sdk/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh ./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh 安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后 cd /usr/local/linux-dey/linux source /opt/dey/2.2-r3/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi unset LDFLAGS 下面我们生成平台的内核配置文件并配置它 make ccimx6sbc_defconfig (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了 make menuconfig 只需改动: Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz (注意,根据你平台的处理器主频来设置) 然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中 mv ccimx6sbc_rt_defconfig arch/arm/configs/ 这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件 因为我们刚才是另存为defconfig,所以我们就这样做一次 make ccimx6sbc_rt_defconfig 接下来就可以直接编译内核了 make -j4 我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig * [[#dey24rt-devshell|本地快速应用RT补丁]] * [[#dey24rt-yocto|用Yocto方式编译打RT补丁源]] * [[#dey24rt-local|本地直接编译打RT补丁Linux内核]] 从Digi官方https://github.com/digi-embedded/meta-digi/tree/jethro/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.4下,ConnectCore 6 SBC使用4.9的内核。我们以这个平台为例实际操作一下。 首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。 bitbake core-image-base 成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录: bitbake -c devshell virtual/kernel 在出来的shell中,就是一个git的linux内核源码树,可以查看一下 git status 会打印出来git信息 HEAD detached at 281cebe nothing to commit, working directory clean 我们可以直接下载并应用RT补丁: wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.98-rt76.patch.xz ./patch-4.9.98-rt76.patch.xz | patch -p1 补丁如果成功应用,出来的"patching file ..."没有错误提示。 ===配置内核选项=== 我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置: Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz 另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。 DEBUG_PREEMPT \\ Lock Debugging (spinlocks, mutexes, etc. . . ) \\ DEBUG_OBJECTS \\ … \\ 要配置内核选项 bitbake -c menuconfig virtual/kernel 然后改变内核选项并保存 退出后,可以用 bitbake -C compile virtual/kernel 来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码 ===编译排错=== 编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用"grep error"并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件: arch/arm/mach-imx/下面这三个文件 clk-pllv3.c clk-gate2.c clk-pfd.c 解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。 +#include #include 注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件 我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件 一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码 sudo install -o robin -g robin -d /usr/local/linux-dey cd /usr/local/linux git clone -b v4.9/dey-2.4/maint https://github.com/peyoot/linux.git 打上RT补丁 wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.98-rt76.patch.xz ./patch-4.9.98-rt76.patch.xz | patch -p1 三、安装DEY 2.4 SDK cd ~/Downloads wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.4/r1/sdk/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh ./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh 安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后 cd /usr/local/linux-dey/linux source /opt/dey/2.4-r1/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi unset LDFLAGS 下面我们生成平台的内核配置文件并配置它 make ccimx6sbc_defconfig (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了 make menuconfig 只需改动: Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT) Kernel Features -> Timer frequency -> 1000Hz (注意,根据你平台的处理器主频来设置) 然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中 mv ccimx6sbc_rt_defconfig arch/arm/configs/ 这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件 因为我们刚才是另存为defconfig,所以我们就这样做一次 make ccimx6sbc_rt_defconfig 接下来就可以直接编译内核了 make -j4 编译出来的zImage文件在arch/arm/boot下,而dtb设备树文件在rch/arm/boot/dts下 我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig