tag 标签: arm

相关帖子
相关博文
  • 热度 1
    2020-4-13 11:57
    462 次阅读|
    0 个评论
    更加精确评估ARM IP的模型工具——ARM Cycle Models
    Arm公司的 Cycel Model是100%周期精确的Arm IP模型,用于性能分析和精确的评估Arm IP。 ARM· Cycle Models Cycle Models是由Arm RTL直接编译而来,保留了完整的功能以及精准的周期,借助Cycle Models,您可以放心的选择和配置Arm IP,还可以自信地做出体系结构决策、优化系统性能,并在芯片可用之前做裸机固件开发。 CycleModels特点 1.精准的IP性能参考 Cortex处理器和系统IP,包括NIC,CCI,CCN,以及CMN连接的精确周期模型。在使用硬件之前先证明你的假设,分析复杂的内部互连问题。快速探索设计方案,以及发现软件硬件上的瓶颈。 2.加速系统层级的调试 Cycle Model能实现对Arm IP的快速、详细的调试和分析。集成Arm调试器,以及Cach内存可视化功能。 3.统一软件硬件分析 软件团队可以查看代码、设置断点、检查寄存器和内存。硬件团队可以检查信号、转储波形并跟踪整个系统的执行情况。所有用户都可以获取到内部寄存器的瞬时状态。 4.降低设计风险 加速系统调试以及硬件实现和软件的更改,通过验证运行实际系统软件的硬件实现,可以降低风险,消除软件开发的瓶颈:Cycle Model 拥有模拟实际硬件的能力。 5.灵活性和扩展性 Cycle Model能全天候提供来自Arm IP Exchange网站已验证的IP配置选项。它们可被用于Soc设计器,SystemC,Synopsis Platform Architect MCO以便于重新配置,构建或扩展你的虚拟样机。 6.高效易用的GUI 内建的规则检查确保了从广泛的模型和格式到第一轮SOC成功所需要的准确性、性能和灵活性。包含了SystemC,由Cycle Model Studio编译的精准周期模型,Verilog和VHDL的联合仿真通过使用主流的RTL仿真装置。 CPU Cycle Models CPU系列 处理器架构 Cortex-A Cortex-A75,Cortex-A65,Cortex-A65AE,Cortex-A76AE,Cortex-A55,Cortex-A53,Cortex-A35,Cortex-A3 Cortex-R Cortex-R52,Cortex-R8,Cortex-R5 Cortex-M Cortex-M33,Cortex-M23,Cortex-M7,Cortex-M3,Cortex-M0+ 系统IP Cycle Models 系统IP 产品 互联总线 NIC-400,CMN-600,CCI-550 中断控制器 GIC-600,GIC-500 系统内存管理 MMU-600 内存 BP-140, DMC-400 官网参考: https://www.arm.com/products/development-tools/simulation/cycle-models
  • 2020-3-20 14:08
    556 次阅读|
    0 个评论
    ARM全新DSTREAM-HT仿真器!带你看懂DSTREAM系列产品差异
    DSTREAM-HT是ARM公司开发的一款高速占用引脚少的仿真调试器,更快速更少的引脚:非常适合收集大量追踪数据,其中SoC引脚数排除了并行追踪。捕获多个高速串行追踪通道(HSSTP)以启用软件分析,配合arm DS-5可对所有的ARM内核芯片进行开发。 优势功能 快速的数据传输: 高达12.5 Gbps的单通道线路速率(60 Gbps组合通道速率),可配置和捕获CoreSight和自定义IP设备的详细追踪信息; 更少的追踪引脚: 在单通道上 - 2个引脚 - HSSTP可以以与16引脚并行追踪端口相当的速率传输追踪数据; 支持多种协议: 支持Arm HSSTP和Marvell®SETM; 可编译的IO: 用户I / O端口提供脚本功能和8个数字I / O引脚,以实现自动化测试和验证工作流程; 丰富的调试功能: 添加设备特定寄存器,查看指令和数据追踪历史记录,自定义设备特定寄存器的连接,使目标无法复位等等。 更快速的调试速度: 代码下载速度高达12 MB/S,JTAG速率高达180 MHz。SWD速率高达125MHz,可以大大缩短单核或多核设备的调试周期。 远程调试: 远程千兆以太网或USB 3.0主机连接,可实现远程和快速访问。 产品特性 基于CoreSight trace的Arm处理器调试与跟踪 USB3.0和千兆以太网连接接口。 8GB大小的缓冲区。 可定制以支持ASIC 代码下载速度高达12MB/S 最多支持1022个coresight设备 灵活的追踪时钟定位 遥控目标设备复位 设备启动和测试实用程序 支持第三方IP和调试器的灵活架构 ...... 参数信息 Debug 协议 Arm HSSTP, Marvell SETM 单道速率带宽 12.5 Gbps 高速串行追踪带宽 60 Gbps 通道数 1到6路 JTAG/SWD信号电压 1.2V-3.3V 由目标板配置 最大的JTAG时钟速率 180MHZ 支持的Macrocell CoreSight Trace for example ETM, ETB, STM, ITM 目标板连接头 40路SAMTEC ERF8(调试和跟踪) Arm 20 pin 软件要求 Arm Development Studio 产品清单 *以上配件图片仅供参考,如有更新以实物为准 DSTEAM系列特点 Arm 公司的 DSTREAM高性能调试和跟踪单元可在任何基于Arm处理器的硬件目标上进行强大的软件调试和优化。 DSTREAM调试探针具有许多开发平台的加速硬件启动功能以及与第三方工具一起使用的开放式调试接口等功能,与Arm Development Studio配合使用时,可为复杂SoC的开发和调试提供全面的解决方案。 支持至Armv8 高 速 率 追踪 扩展跟踪缓冲 灵活的调试 调试和跟踪Arm架构直至Armv8。 无论是旧版还是最新版,DSTREAM探针系列都涵盖了它。 并行跟踪高达19.2 Gbps,或串行跟踪(HSSTP,SETM)高达60 Gbps 。 即使在最快的目标上也可以捕获扩展的跟踪,以获取软件执行的详细情况。 JTAG , CoreSight,TI和MIPI的适配器。 与第三方IP和调试器兼容,为您提供最大的灵活性。 各个版本的DSTREAM仿真器比较如下: 更多产品信息请看: http://www.myir-tech.com/product/dstream_ht.htm
  • 2020-2-20 11:50
    377 次阅读|
    0 个评论
    By Toradex 秦海 1). 简介 NXP iMX7 是 NXP 基于 Cortex-A7 和 Coretex-M4 异构多核架构的 ARM 处理器,其中 iMX7 Dual 型号 SoC 支持两路 MAC 控制器,可以通过外置百兆或者千兆 PHY 芯片扩展两路以太网接口,本文就基于 Toradex 基于 NXP iMX7 Dual SoC 的 ARM 核心板模块 Colibri iMX7D 示例扩展两路以太网。 2). 第一路以太网 a). Colibri iMX7D 模块已经通过模块上面部署的一个 Microchip KSZ8041NL 百兆 PHY 芯片默认支持了第一路百兆以太网 b). KSZ8041NL 的参考电路请参考 这里 (原理图示例的 SoC MAC 端来自 Toradex VF61 ARM 模块的定义,在 iMX7 或者其他平台上面不能直接引用,请只参考 PHY 一侧的连接) c). 由于选择的 iMX7D ENET1 MAC RMII 接口 50MHz 参考时钟输出引脚 GPIO1_IO12 和另外一个 M4 核心的 NMI 输入引脚冲突,因此最终在设计中,这一路的 KSZ8041PHY 使用了外部参考时钟,没有使用 iMX7 ENET1 的参考时钟输出 d). 基于上述配置的第一步以太网对应的 device tree 节点定义和 pinmux 定义请参考如下,内核基于 4.9.166 版本 --------------------------------------- # arch/arm/boot/dts/imx7-colibri.dtsi …… &fec1 { pinctrl-names = "default", "sleep"; pinctrl-0 = ; pinctrl-1 = ; clocks = , , , ; clock-names = "ipg", "ahb", "ptp", "enet_clk_ref"; assigned-clocks = , ; assigned-clock-parents = ; assigned-clock-rates = , ; phy-mode = "rmii"; phy-supply = ; fsl,magic-packet; }; … &iomuxc { … pinctrl_enet1: enet1grp { fsl,pins = < MX7D_PAD_ENET1_RGMII_RX_CTL__ENET1_RGMII_RX_CTL 0x73 MX7D_PAD_ENET1_RGMII_RD0__ENET1_RGMII_RD0 0x73 MX7D_PAD_ENET1_RGMII_RD1__ENET1_RGMII_RD1 0x73 MX7D_PAD_ENET1_RGMII_RXC__ENET1_RX_ER 0x73 MX7D_PAD_ENET1_RGMII_TX_CTL__ENET1_RGMII_TX_CTL 0x73 MX7D_PAD_ENET1_RGMII_TD0__ENET1_RGMII_TD0 0x73 MX7D_PAD_ENET1_RGMII_TD1__ENET1_RGMII_TD1 0x73 MX7D_PAD_GPIO1_IO12__CCM_ENET_REF_CLK1 0x73 MX7D_PAD_SD2_CD_B__ENET1_MDIO 0x3 MX7D_PAD_SD2_WP__ENET1_MDC 0x3 ; }; pinctrl_enet1_sleep: enet1sleepgrp { fsl,pins = < MX7D_PAD_ENET1_RGMII_RX_CTL__GPIO7_IO4 0x0 MX7D_PAD_ENET1_RGMII_RD0__GPIO7_IO0 0x0 MX7D_PAD_ENET1_RGMII_RD1__GPIO7_IO1 0x0 MX7D_PAD_ENET1_RGMII_RXC__GPIO7_IO5 0x0 MX7D_PAD_ENET1_RGMII_TX_CTL__GPIO7_IO10 0x0 MX7D_PAD_ENET1_RGMII_TD0__GPIO7_IO6 0x0 MX7D_PAD_ENET1_RGMII_TD1__GPIO7_IO7 0x0 MX7D_PAD_GPIO1_IO12__GPIO1_IO12 0x0 MX7D_PAD_SD2_CD_B__GPIO5_IO9 0x0 MX7D_PAD_SD2_WP__GPIO5_IO10 0x0 ; }; --------------------------------------- 3). 第二路以太网 a). 第二路以太网通过模块预留的 RMII 或者 RGMII 接口连接百兆 PHY 或者千兆 PHY 来扩展, Colibri iMX7D RMII 或者 RGMII 接口管脚定义请参考 手册 5.4 章节。 b). 同样使用 KSZ8041NL 百兆 PHY 扩展的参考电路请参考 这里 (原理图示例的 SoC MAC 端来自 Toradex VF61 ARM 模块的定义,在 iMX7 或者其他平台上面不能直接引用,须按照上面手册定义连接),如需要连接千兆 PHY ,请参考所使用的千兆 PHY (如 Microchip KSZ9031RNL )手册进行连接 c). 通过 ENET2 RMII 接口连接 KSZ8041NL 百兆 PHY 的 device tree 配置参考如下 patch ,和上面第一路以太网不同,这次使用的 iMX7 SoC 内部的参考时钟输出给 PHY ,因此在 clock 项目配置会有不同 https://github.com/simonqin09/colibri_imx7_2nd_ethernet/blob/master/0001-imx7d-2nd-ethernet-support_update_20200218.patch // 对于 &fec2 节点中的 “fsl,mii-exclusive” 参数,因为 ENET1 和 ENET2 分别使用其对应的 MDIO 总线,而不是共享一个 MDIO 总线,在 4.9 kernel 下,如果不配置这个参数,驱动会默认都使用 ENET1 的 MDIO 去配置 ENET2 ,因此在这里是必须的。但在其他 i.MX 平台或者 mainline kernel 下则不一定需要。 // MX7D_PAD_EPDC_BDR0__CCM_ENET_REF_CLK2 配置为 0x40000073 ,因为使用 iMX7 SoC 内部参考时钟,这个时钟要同时给 PHY 和 MAC 提供参考时钟,因此 Input 和 Output 都要配置使能,因此需要为 0x40000073 ,关于 pinctrl 的更多说明请参考 这里 。 d). 通过 RGMII 连接千兆 PHY 的 device tree 配置请参考 这里 4). 总结 本文基于 iMX7 示例了双路以太网的设计和配置思路,同时对于其他支持双路 MAC 的 NXP i.MX ARM 处理器(如 iMX8 )的配置思路也都是一致的,只是具体的 clock 和 pinmux 定义等要做对应的适配
  • 热度 1
    2020-2-13 15:57
    2971 次阅读|
    1 个评论
    By Toradex 胡珊逢 1). 简介 定时器任务在 Linux 系统中是一项很普遍的应用,例如定期清理文件,在嵌入式系统则可以定时调用任务采集数据等。 Cron 是一个广为人知的定时计划任务管理器,但随着 systemd 兴起, systemd timers 也逐渐开始取代传统的 cron 。本文就将基于 Toradex Linux BSP 在 Colibri iMX8X 上如使用 systemd 定时器。 Systemd 定时器从触发时间上可以分为两种: • 单调定时器:从一个特定的时间开始后过一段时间触发,通常可以是系统启动或者 systemd 服务单元执行的开始时间 • 实时定时器:在某个特定时间触发,一般指时钟时间,这个就类似于 cron 定时任务 两种定时满足不同要求的任务,例如需要在某个明确并固定的时间来执行任务,如每周日晚上 12 点清理日志文件,则可以选择实时定时器。而对于有些无法实现预测执行时间,通常是要在系统启动后才定期执行,如某个任务在启动后每隔 10 分钟采样传感器数据,由于不确定系统启动时间,所有可以采用单调定时器。或者同时使用两个定时器功能。 Systemd 定时器的配置文件可以分为两部分,定时器单元以 .timer 后缀的 systemd 单元文件,以及服务单元以 .service 后缀的 systemd 单元文件。每个 .timer 文件通常对应一个同名的 .service 文件。定时器单元 .timer 文件中的 定义了该定时器何时以及如何触发。该定时器被触发后,执行对应的服务单元 .service ,其中的 定义了最终被执行的脚本或者应用。下面我们将演示如何使用。 2). 单调定时器 我们将设置一个系统启动 2 分钟后启动并在此之后每隔 15 分钟定期执行的定时任务。下面是所需的定时器单元 test1.timer 和服务单元 test1.service 。 ./ test1.timer ----------------------------------------- Description=Run every 15min and on boot OnBootSec=2min OnUnitActiveSec=15min WantedBy=timers.target ----------------------------------------- ./ test1.service ----------------------------------------- Description=Hello World ExecStart=/home/root/HelloWorld ----------------------------------------- 在 .timer 中 OnBootSec= 设置了该定时器需要在系统启动 2 分钟后被执行, OnUnitActiveSec= 设置了该定时器在成功执行后,每隔 15 分钟需要再次被执行。服务单元 test1.service 中 定义了 /home/root/HelloWorld 是需要被执行的应用。 把上面两个文件复制到 /etc/system/systemd 目录下, systemd-analyze 命令来核对文件是否有效。 ----------------------------------------- root@colibri-imx8x:/etc/systemd/system# systemd-analyze verify test1* # 启用 test1 定时任务,并在每次启动后都生效。设置完成后马上重启,查看该任务。 root@colibri-imx8x:/etc/systemd/system# systemctl start test1.timer root@colibri-imx8x:/etc/systemd/system# systemctl enable test1.timer root@colibri-imx8x:/etc/systemd/system# sync root@colibri-imx8x:/etc/systemd/system# reboot # 命令 systemctl list-timers 可以列出目前激活的定时任务。 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 16:39:19 CST 1min 30s left n/a n/a test1.timer test1.service Tue 2020-02-11 16:52:19 CST 14min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service 2 timers listed. Pass --all to see loaded but inactive timers, too. ----------------------------------------- 可以看到在系统启动后,还剩下 1 分 30 秒执行 test1.service ,这个是由 OnBootSec=2min 参数所设置的。 在等待数分钟再次查看定时器任务, test1.service 在 14 分钟后会被执行,这是由 OnUnitActiveSec=15min 参数所设置。 ----------------------------------------- root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 16:52:19 CST 12min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Tue 2020-02-11 16:54:28 CST 14min left Tue 2020-02-11 16:39:28 CST 26s ago test1.timer test1.service ----------------------------------------- 从系统日志里也可以观察到自 16:37:25 系统启动后,在 16:39:28 时 HelloWorld 被执行。 ----------------------------------------- root@colibri-imx8x:~# journalctl -u test1.service -- Logs begin at Tue 2020-02-11 16:37:25 CST, end at Tue 2020-02-11 16:40:49 CST. -- Feb 11 16:39:28 colibri-imx8x systemd : Started Hello World. Feb 11 16:39:28 colibri-imx8x HelloWorld : Hello world! ----------------------------------------- 再次等待 15 分钟以后,重新查看日志和定时器任务,在 16:54:30 时 HelloWorld 被执行,并且在 13 分钟后会再次执行。这符合定时器任务 test1 的设置预期。 ----------------------------------------- root@colibri-imx8x:~# journalctl -u test1.service -- Logs begin at Tue 2020-02-11 16:37:25 CST, end at Tue 2020-02-11 16:56:21 CST. -- Feb 11 16:39:28 colibri-imx8x systemd : Started Hello World. Feb 11 16:39:28 colibri-imx8x HelloWorld : Hello world! Feb 11 16:54:30 colibri-imx8x systemd : Started Hello World. Feb 11 16:54:30 colibri-imx8x HelloWorld : Hello world! root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 17:09:30 CST 13min left Tue 2020-02-11 16:54:30 CST 1min 31s ago test1.timer test1.service Wed 2020-02-12 16:52:20 CST 23h left Tue 2020-02-11 16:52:20 CST 3min 42s ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service ----------------------------------------- 3). 实时定时器 这里我们将设置在每个小时第 10 分钟被执行的实时定时任务。下面是所需的定时器单元 test2.timer 和服务单元 test2.service 。 ./ test2.timer ----------------------------------------- Description=Run each 10min of hours OnCalendar=*-*-* *:10:00 WantedBy=timers.target ----------------------------------------- ./ test2.service ----------------------------------------- Description=Hello Toradex ExecStart=/home/root/HelloToradex ----------------------------------------- 在 test2.timer 中, OnCalendar= 设置定时器任务触发的时间。 OnCalendar 的时间格式为 DayOfWeek Year-Month-Day Hour:Minute:Second 。 其中 weekday 部分是可以省略的,定时器不匹配星期几,由后面的日期和时间部分来指定。如果填写则必须是英文中星期的缩写或者全称,如星期二是 Web 或者 Wednesday 。可以使用 “,” ,来指定多个星期天如 Mon,Web,Fri 。 “..” 用于指定连续的一段时间,如 Mon..Fri 指从周一到周五。 “,” 和 “..” 还可以混合使用来指定一周的几天。 日期和时间部分,可以使用 “*” 表示任何符合的日期或者时间。如 2020-*-* 1:23:00 表示 2020 年中每天的 1:23:00 时间触发定时器任务。也可以使用 “,” 来指定具体的而时间或日期, 2020-1,2-* 1,2:23:00 表示 2020 年中 1 月和 2 月每天的 1:23:00 和 2:23:00 触发定时器任务。日期、时间还有多种表达方式,包括时区,具体可以查看文章最后的参考链接。 在 .timer 中 OnCalendar=*-*-* *:10:00 将定时器设置为每天每小时第 10 分钟触发。 同样将上述两个文件复制到 /etc/systemd/system 目录,并启动该定时器。 ----------------------------------------- root@colibri-imx8x:/etc/systemd/system# systemctl enable test2.timer root@colibri-imx8x:/etc/systemd/system# systemctl start test2.timer # 系统当前时间是 17:29:28 ,距离 18:10:00 还有 40 分钟,因此在 40 分钟后 test2 定时器将被触发。 root@colibri-imx8x:~# date Tue Feb 11 17:29:28 CST 2020 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 17:41:57 CST 12min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Tue 2020-02-11 18:10:00 CST 40min left n/a n/a test2.timer test2.service 2 timers listed. Pass --all to see loaded but inactive timers, too. # 在等待一段时间后,查看日志, 18:10:01 的时候 test2 定时器被触发,并执行 /home/root/HelloToradex 程序。 root@colibri-imx8x:~# journalctl -u test2.service -- Logs begin at Tue 2020-02-11 17:27:02 CST, end at Tue 2020-02-11 18:11:11 CST. -- Feb 11 18:10:01 colibri-imx8x systemd : Started Hello Toradex. Feb 11 18:10:01 colibri-imx8x HelloToradex : Hello Toradex! # 而距下一次触发的时间 19:10:00 还有一个小时。 root@colibri-imx8x:/etc/systemd/system# date Tue Feb 11 18:10:43 CST 2020 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 19:10:00 CST 59min left Tue 2020-02-11 18:10:01 CST 47s ago test2.timer test2.service Wed 2020-02-12 17:41:58 CST 23h left Tue 2020-02-11 17:41:58 CST 28min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service 2 timers listed. Pass --all to see loaded but inactive timers, too. # 那么在一个小时再次查看日志文件, 19:10:09 的时候 test2 定时器被触发。 root@colibri-imx8x:~# journalctl -u test2.service -- Logs begin at Tue 2020-02-11 17:27:02 CST, end at Tue 2020-02-11 19:23:40 CST. -- Feb 11 18:10:01 colibri-imx8x systemd : Started Hello Toradex. Feb 11 18:10:01 colibri-imx8x HelloToradex : Hello Toradex! Feb 11 19:10:09 colibri-imx8x systemd : Started Hello Toradex. Feb 11 19:10:09 colibri-imx8x HelloToradex : Hello Toradex! ----------------------------------------- 4). 混合定时器 除了上面单独使用单调或者实时定时器外,我们还可以同时利用两种定时器配置属性。 ./ test3.timer ----------------------------------------- Description=Run each 10min of hours and on boot OnBootSec=2min OnCalendar=*-*-* *:10:00 WantedBy=timers.target ----------------------------------------- ./ test3.service ----------------------------------------- Description=Hello Torizon ExecStart=/home/root/HelloTorizon ----------------------------------------- 这里 test3 定时器首先通过 OnBootSec=2min 设置为系统启动后 2 分钟触发,并且由 OnCalendar=*-*-* *:10:00 设置在每个小时第 10 分钟被执行的实时定时任务。这两个参数分别来自单调定时器和实时定时器配置。 ----------------------------------------- # 启动该定时器后重启系统 root@colibri-imx8x:/etc/systemd/system# systemctl enable test3.timer root@colibri-imx8x:/etc/systemd/system# sync root@colibri-imx8x:/etc/systemd/system# reboot # 系统启动后看到 test3 将会在 1 分 43 秒后触发。 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 19:27:30 CST 1min 42s left n/a n/a test3.timer test3.service Tue 2020-02-11 19:40:30 CST 14min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service # 在等待 2 分钟后, test3 已经被触发,并会在 42 分钟后再次触发,即 20:10:00 。 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 19:40:30 CST 12min left n/a n/a systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service Tue 2020-02-11 20:10:00 CST 42min left Tue 2020-02-11 19:27:31 CST 19s ago test3.timer test3.service # 从日志中看到,系统在 19:25:35 左右启动,在其后 2 分钟 19:27:31 触发了 test3 并执行 /home/root/HelloTorizon 。 root@colibri-imx8x:~# journalctl -u test3.service -- Logs begin at Tue 2020-02-11 19:25:35 CST, end at Tue 2020-02-11 19:28:09 CST. -- Feb 11 19:27:31 colibri-imx8x systemd : Started Hello Torizon. Feb 11 19:27:31 colibri-imx8x HelloTorizon : Hello Torizon! # 在等到 20:10:00 后查看定时器任务, test3 如预期在 20:10:04 的时候被触发, 44 分钟后下一次触发。 root@colibri-imx8x:~# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Tue 2020-02-11 21:10:00 CST 44min left Tue 2020-02-11 20:10:04 CST 15min ago test3.timer test3.service Wed 2020-02-12 19:40:31 CST 23h left Tue 2020-02-11 19:40:31 CST 44min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service # 日志也记录了 20:10:04 时候 test3 被触发并执行 /home/root/HelloTorizon 。 root@colibri-imx8x:~# journalctl -u test3.service -- Logs begin at Tue 2020-02-11 19:25:35 CST, end at Tue 2020-02-11 20:25:26 CST. -- Feb 11 19:27:31 colibri-imx8x systemd : Started Hello Torizon. Feb 11 19:27:31 colibri-imx8x HelloTorizon : Hello Torizon! Feb 11 20:10:04 colibri-imx8x systemd : Started Hello Torizon. Feb 11 20:10:04 colibri-imx8x HelloTorizon : Hello Torizon! ----------------------------------------- 到这里我们已经演示了不同类型定时器的使用方法,有些读者可能已经发现定时器任务被触发的时间并不是很严格得按照所设定的时间。例如上面 test3 在第二次被触发的时间是 20:10:04 ,不是 20:10:00 。这是因为 Toradex Linux BSP 默认是普通的 Linux 内核,而非实时 Linux ,这就导致在任务时间分配上会存在一定的时间抖动。其次, systemd 定时器中的 AccuracySec 参数默认是 1min ,这设置了定时器的精度。定时器触发时间窗口为 OnCalendar= 、 OnActiveSec= 、 OnBootSec= 、 OnStartupSec= 、 OnUnitActiveSec= 所设置的时间开始到 AccuracySec= 结束。这样做的目的是减少不必要的 CPU 唤醒,从而降低功耗。为了提高定时器精度,可以将 AccuracySec= 设置到最小的 1us 。 为了避免在同一个时间触发多个定时器任务,从而导致系统资源紧张,可以使用 RandomizedDelaySec= 参数,为定时任务添加一个从 0 到 RandomizedDelaySec 的随机延时。 5). Systemd vs. Cron 上面的几个例子已经展示了 systemd 定时器的特点,其于传统的 Cron 比较如下: 优点: ./ Systemd 定时器可以利用 systemd 的依赖关系(如等待网络连接、某个文件的创建、其他应用就位后执行任务) ./ 定时任务会被记录到 journald 日志 ./ 定时器任务可以在系统 / 应用启动后触发 ./ 可以利用 cgroups ./ 可以单独执行任务而不依赖定时器( .timer 和 .service 分开配置) 缺点: ./ 相对复杂的配置过程, Cron 仅需一行命令即可 ./ Systemd 定时器默认不支持 MAILTO 功能 6). 总结 定时器任务作为嵌入式系统中常见的应用, systemd 定时器为用户提供更多的可配置功能以及优化选项。本文列举了 systemd 定时器基本操作方法,以及和 cron 对比,帮助用户更快得使用。更多的技术细节和功能请参考下面的链接内容。 参考: https://wiki.archlinux.org/index.php/Systemd/Timers https://www.freedesktop.org/software/systemd/man/systemd.timer.html https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.time.7 https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd.timer.5
  • 热度 1
    2020-1-6 12:11
    1047 次阅读|
    1 个评论
    By Toradex 秦海 1). 简介 NXP iMX8 已经正式发布,相较于之前 NXP i.MX 系列的主力产品 iMX6 ,其性能有了大幅提升,本文就针对网络接口对 NXP iMX8 和 iMX6 两款 ARM 处理器进行对比测试。 本文演示所使用的 ARM 平台来自 Toradex 基于 NXP iMX8 SoC 的 Apalis iMX8 ARM 核心板和基于 NXP iMX6Q SoC 的 Apalis iMX6 ARM 核心板。 2). 准备 a). Apalis iMX8QM ARM 核心版配合 Apalis Evaluation Board 载板 , Apalis iMX8QM 安装 Toradex V3.0b2 Linux demo image ,同时连接调试串口 UART1 (载板 X29 )到开发主机方便调试。更多关于 Apalis iMX8 配合 Apalis Evaluation Board 载板的说明请参考 Datasheet 和 开发上手指南 。 b). Apalis iMX6Q ARM 核心版配合 Apalis Evaluation Board 载板 , Apalis iMX6Q 安装 Toradex V2.8 Linux demo image ,同时连接调试串口 UART1 (载板 X29 )到开发主机方便调试。更多关于 Apalis iMX6 配合 Apalis Evaluation Board 载板的说明请参考 Datasheet 和 开发上手指南 。 c). Ubuntu linux PC 主机, 用于分别和 Apalis iMX8 、 Apalis iMX6 进行收发测试。 d). 测试工具软件使用 iperf3 工具, Toradex Linux demo image 里面已经默认集成, Ubuntu 系统(这里以 18.04 为例)要通过 apt 命令来安装 iperf3 ---------------------- $ sudo apt update $ sudo apt install iperf3 ---------------------- e). 网络连接拓扑为 Apalis iMX8QM 、 Apalis iMX6Q 以及 Ubuntu PC 都通过千兆有线网络连接到同一个局域网。 3). TCP 网络传输性能测试对比 a). Apalis iMX6Q/Apalis iMX8QM 作为 Server 端接收, Ubuntu PC 作为 Client 端发送测试 ./ Apalis iMX6Q/Apalis iMX8QM Server 端运行下面命令 ---------------------- $ iperf3 -s ---------------------- ./ Apalis iMX6Q ---------------------- $ iperf3 -c -t 60 -i 10 -w 300K … Interval Transfer Bandwidth Retr 0.00-60.00 sec 4.01 GBytes 574 Mbits/sec 1 sender 0.00-60.00 sec 4.01 GBytes 574 Mbits/sec receiver ---------------------- ./ Apalis iMX8QM ---------------------- $ iperf3 -c -t 60 -i 10 … Interval Transfer Bandwidth Retr 0.00-60.00 sec 6.52 GBytes 934 Mbits/sec 0 sender 0.00-60.00 sec 6.52 GBytes 934 Mbits/sec receiver ---------------------- b). Apalis iMX6Q/Apalis iMX8QM 作为 Client 端发送, Ubuntu PC 作为 Sever 端接收测试 ./ Ubuntu PC server 端运行下面命令 ---------------------- $ iperf3 -s ---------------------- ./ Apalis iMX6Q Client 端连接测试 ---------------------- root@apalis-imx6:~# iperf3 -c -t 60 -i 10 … Interval Transfer Bitrate Retr 0.00-60.00 sec 2.84 GBytes 406 Mbits/sec 0 sender 0.00-60.00 sec 2.84 GBytes 406 Mbits/sec receiver ---------------------- ./ Apalis iMX8QM Client 端连接测试 ---------------------- root@apalis-imx8:~# iperf3 -c -t 60 -i 10 … Interval Transfer Bitrate Retr 0.00-60.00 sec 6.39 GBytes 915 Mbits/sec 0 sender 0.00-60.00 sec 6.39 GBytes 915 Mbits/sec receiver ---------------------- c). 测试结果汇总 项目 TCP 发送测试 TCP 接收测试 Apalis iMX6Q 406 Mb/s 574 Mb/s Apalis iMX8QM 915 Mb/s 934 Mb/s 4). UDP 网络传输性能测试对比 a). Apalis iMX6Q/Apalis iMX8QM 作为 Server 端接收, Ubuntu PC 作为 Client 端发送测试 ./ Apalis iMX6Q/Apalis iMX8QM Server 端运行下面命令 ---------------------- $ iperf3 -s ---------------------- ./ Apalis iMX6Q ---------------------- /* 100M 带宽测试 */ $ iperf3 -c -u -b 100M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 714 MBytes 99.9 Mbits/sec 0.110 ms 0/91424 (0%) /* 400M 带宽测试 */ $ iperf3 -c -u -b 400M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 2.79 GBytes 400 Mbits/sec 0.098 ms 4374/365993 (1.2%) /* 1000M 带宽测试 */ $ iperf3 -c -u -b 1000M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 2.98 GBytes 426 Mbits/sec 0.167 ms 2304/390206 (0.59%) ---------------------- ./ Apalis iMX8QM ---------------------- /* 100M 带宽测试 */ $ iperf3 -c -u -b 100M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 714 MBytes 99.9 Mbits/sec 0.078 ms 84/91416 (0.092%) /* 400M 带宽测试 */ $ iperf3 -c -u -b 400M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 2.79 GBytes 400 Mbits/sec 0.092 ms 121/366076 (0.033%) /* 1000M 带宽测试 */ $ iperf3 -c -u -b 1000M -t 60 -i 10 … Interval Transfer Bandwidth Jitter Lost/Total Datagrams 0.00-60.00 sec 6.63 GBytes 949 Mbits/sec 0.064 ms 284/868752 (0.033%) ---------------------- b). Apalis iMX6Q/Apalis iMX8QM 作为 Client 端发送, Ubuntu PC 作为 Sever 端接收测试 ./ Ubuntu PC server 端运行下面命令 ---------------------- $ iperf3 -s ---------------------- ./ Apalis iMX6Q Client 端连接测试 ---------------------- /* 100M 带宽测试 */ root@apalis-imx6:~# iperf3 -c -u -b 100M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 715 MBytes 100 Mbits/sec 0.000 ms 0/517952 (0%) sender 0.00-60.00 sec 715 MBytes 100 Mbits/sec 0.005 ms 0/517952 (0%) receiver /* 400M 带宽测试 */ root@apalis-imx6:~# iperf3 -c -u -b 400M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 1.91 GBytes 273 Mbits/sec 0.000 ms 0/1413705 (0%) sender 0.00-60.00 sec 1.91 GBytes 273 Mbits/sec 0.021 ms 0/1413705 (0%) receiver /* 1000M 带宽测试 */ root@apalis-imx6:~# iperf3 -c -u -b 1000M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 1.92 GBytes 274 Mbits/sec 0.000 ms 0/1421514 (0%) sender 0.00-60.00 sec 1.92 GBytes 274 Mbits/sec 0.057 ms 0/1421509 (0%) receiver ---------------------- ./ Apalis iMX8QM Client 端连接测试 ---------------------- /* 100M 带宽测试 */ root@apalis-imx8:~# iperf3 -c -u -b 100M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 715 MBytes 100 Mbits/sec 0.000 ms 0/517950 (0%) sender 0.00-60.00 sec 715 MBytes 100 Mbits/sec 0.035 ms 0/517950 (0%) receiver /* 400M 带宽测试 */ root@apalis-imx8:~# iperf3 -c 10.20.1.126 -u -b 400M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 2.79 GBytes 400 Mbits/sec 0.000 ms 0/2071798 (0%) sender 0.00-60.00 sec 2.79 GBytes 400 Mbits/sec 0.026 ms 68/2071798 (0.0033%) receiver /* 1000M 带宽测试 */ root@apalis-imx8:~# iperf3 -c 10.20.1.126 -u -b 1000M -t 60 -i 10 … Interval Transfer Bitrate Jitter Lost/Total Datagrams 0.00-60.00 sec 4.71 GBytes 674 Mbits/sec 0.000 ms 0/3489592 (0%) sender 0.00-60.00 sec 4.71 GBytes 674 Mbits/sec 0.030 ms 103/3489586 (0.003%) receiver ---------------------- c). 测试结果汇总 UDP 发送测试 UDP 接收测试 100M 带宽 400M 带宽 1000M 带宽 100M 带宽 400M 带宽 1000M 带宽 Apalis iMX6Q 100 Mb/s 273 Mb/s 274 Mb/s 99.9 Mb/s 400 Mb/s * 426 Mb/s * Apalis iMX8QM 100 Mb/s 400 Mb/s 674 Mb/s 99.9 Mb/s 400 Mb/s 949 Mb/s * 注意此时丢包率已经到 1% 左右 5). 总结 本文对比测试了 NXP iMX6 和 NXP iMX8 处理器的网络性能,对于 iMX6 ,由于这个 Eratta 的限制, 400Mb/s 左右的性能也就把符合文档的描述, iMX8 则在大多数情况下能够接近千兆带宽。
相关资源
广告