能讲一下这是如何实现红绿灯功能的吗?


img

,有无人能讲讲这张图片是如何实现红绿灯功能的吗?详细一点,谢谢!

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7680491
  • 你也可以参考下这篇文章:【到底什么才是电角度呢?如何使用示波器精准的测量电角度呢?】
  • 除此之外, 这篇博客: 系统烧写中的 改造我们自己的烧写工具 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 39.5.1 改造 MfgTool
    本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要
    改造 MfgTool,重点是三方面:
    ①、针对不同的核心版,确定系统文件相关名字。
    ②、新建我们自己的.vbs 文件。
    ③、 修改 ucl2.xml 文件。
    1、确定系统文件名字
    确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版
    本,那么 EMMC 和 NAND 这两个版本的 uboot、 zImage、 .dtb 和 rootfs 有可能不同。
    2、新建.vbs 文件
    直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-
    alientek-alpha-emmc.vbs,文件内容不要做任何修改, .vbs 文件我们就新建好了。
    3、修改 ucl2.xml 文件
    在修改 ucl2.xml 文件之前,先保存一份原始的 ucl2.xml。将 ucl2.xml 文件改为如下所示内
    容:
    <!-- 正点原子修改后的 ucl2.xml 文件 -->
    <UCL>
    <CFG>
    <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
    <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
    <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
    </CFG>
    <!-- 向 EMMC 烧写系统 -->
    <LIST name="eMMC" desc="Choose eMMC as media">
    <CMD state="BootStrap" type="boot" body="BootStrap" file
    ="firmware/u-boot-alientek-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD>
    <CMD state="BootStrap" type="load" file="firmware/zImage-alientekemmc" address="0x80800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/%initramfs%"
    address="0x83800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
    <CMD state="BootStrap" type="load" file="firmware/imx6ull-alientekemmc.dtb" address="0x83000000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE"
    ifdev="MX6ULL">Loading device tree.</CMD>
    <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
    ...
    ucl2.xml 文件我们仅仅保留了给 EMMC 烧写系统,如果要支持 NAND 的话可以自行参考
    原版的 ucl2.xml 文件,添加相关的内容。
    
    39.5.2 烧写测试
    MfgTool 工具修改好以后就可以进行烧写测试了,将 imx6ull-alientek-emmc.dtb、 u-bootalientek-emmc.imx 和 zImage-alientek-emmc 这 三 个 文 件 复 制 到 mfgtools-withrootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。将 imx6ull-alientek-emmc.dtb、u-bootalientek-emmc.imx、 zImage-alientek-emmc 和 rootfs-alientek-emmc.tar.bz2 这四个文件复制到
    mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files 目录中。
    点击“ mfgtool2-alientek-alpha-emmc.vbs”打开 MfgTool 烧写系统,等待烧写完成,然后设
    置拨码开关为 EMMC 启动,重启开发板
    
    39.5.3 解决 Linux 内核启动失败
    上一小节我们启动系统以后发现输出“ Starting kernel ...”以后就再也没有任何信息了,难
    道是系统烧写错误了?可以确定的是 uboot 启动正常,就是在启动 Linux 的时候出问题了,仔
    细观察 uboot 输出的 log 信息
    在读取“ imx6ull-14x14-evk.dtb”这个设备树文件的时候出错了。
    重启 uboot,进入到命令行模式,输入如下命令查看 EMMC 的分区 1 里面有没有设备树文件:
    mmc dev 1 //切换到 EMMC
    ls mmc 1:1 //输出 EMMC1 分区 1 中的所有文件
    此时 EMMC 的分区 1 中是存在设备树文件的,只是文件名字为:
    imx6ull-alientek-emmc.dtb,因此读取 imx6ull-14x14-evk.dtb 肯定会出错的,因为根本就不存在
    这个文件。之所以出现这个错误的原因是因为 uboot 里面默认的设备树名字就是 imx6ull-14x14-
    evk.dtb,这个我们在讲解 uboot 的时候就已经说过了。解决方法很简单,有两种方法:
    1、重新设置 bootcmd 环境变量值
    进入 uboot 的命令行,重新设置 bootcmd 和 bootargs 这两个环境变量的值,这里要注意的
    是 bootargs 的值也要重新设置一下,命令如下:
    setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000
    imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'
    setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
    saveenv
    设置好 bootcmd 和 bootargs 这两个环境变量以后重启开发板, Linux 系统就可以正常启动。
    2、修改 uboot 源码
    第 1 种方法每次重新烧写系统以后都要先手动设置一下 bootcmd 的值,这样有点麻烦,有
    没有一劳永逸的方法呢?肯定是有的,就是直接修改 uboot 源码。打开 uboot 源码中的文件
    include/configs/mx6ull_alientek_emmc.h,在宏 CONFIG_EXTRA_ENV_SETTINGS 中找到如下所
    示内容:
    示例代码 39.5.3.1 查找设备树文件
    194 "findfdt="\
    195 "if test $fdt_file = undefined; then " \
    196 "if test $board_name = EVK && test $board_rev = 9X9; then " \
    197 "setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
    198 "if test $board_name = EVK && test $board_rev = 14X14; then " \
    199 "setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
    200 "if test $fdt_file = undefined; then " \
    201 "echo WARNING: Could not determine dtb to use; fi; " \
    202 "fi;\0" \
    findfdt 就是用于确定设备树文件名字的环境变量, fdt_file 环境变量保存着设备树文件名。
    第 196 行和 197 行用于判断设备树文件名字是否为 imx6ull-9x9-evk.dtb,第 198 行和 199 行用
    于判断设备树文件名字是否为 imx6ull-14x14-evk.dtb。这两个设备树都是 NXP 官方开发板使用
    的, I.MX6U-ALPHA 开发板用不到,因此直接将示例代码 39.5.3.1 中 findfdt 的值改为如下内
    容:
    示例代码 39.5.3.1 查找设备树文件
    194 "findfdt="\
    195 "if test $fdt_file = undefined; then " \
    196 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \
    197 "fi;\0" \
    第 196 行,如果 fdt_file 未定义的话,直接设置 fdt_file= imx6ull-alientek-emmc.dtb,简单直
    接,不需要任何的判断语句。修改后以后重新编译 uboot,然后用将新的 uboot 烧写到开发板中,
    烧写完成以后重启测试, Linux 内核启动正常。
    
  • 您还可以看一下 张传波老师的软件设计是怎样炼成的?课程中的 什么是漂亮的软件设计?小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    很抱歉,你的问题是关于红绿灯图片需要讲解实现方式,参考资料中都与此无关,无法为您提供具体的解决方案。建议您提供更详细的信息和要求。感谢您的理解。