十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RIOT OS 的 AVR-8 XMEGA CPU 驱动测试:深入剖析 ATxmega EBI 外部总线接口验证方案

RIOT OS 的 AVR-8 XMEGA CPU 驱动测试:深入剖析 ATxmega EBI 外部总线接口验证方案 物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载导读本文围绕 RIOT OS 仓库中的tests/cpu/avr8_xmega_drivers测试应用完整讲解 AVR-8 XMEGA 系列 CPU 所独有的板级驱动当前为 ATxmega 外部总线接口 EBI的验证思路。通过阅读本文你将理解该测试应用如何编译运行、EBI 驱动在内核中的初始化时机、hugemem 大内存访问 API 的底层原理以及数据总线 / 地址总线 / 数据完整性三类测试的具体算法与判定标准。一、测试应用概述为 XMEGA 独有驱动保驾护航在 RIOT OS 中tests/cpu/目录存放针对特定 CPU 架构能力的验证程序。不同于面向外设SPI、I2C、定时器的通用测试tests/cpu/avr8_xmega_drivers聚焦于AVR-8 XMEGA 系列 CPU 特有的、其他 AVR 型号没有的驱动。根据 tests/cpu/avr8_xmega_drivers/README.md 的说明The AVR-8 xmega CPU has additional drivers. This test application ensure that all these driver is OK.该测试应用的职责非常明确确保 ATxmega 的所有额外驱动可用。当前纳入测试范围的驱动是ATxmega External Bus InterfaceEBI—— 外部总线接口之所以 EBI 会被单独拎出来测试是因为它是 XMEGA 大容量型号如 A1x / A3Bx 系列的独有能力通过并行总线外接 SRAM / SDRAM / LCD 等大容量设备从而突破 AVR 8 位 CPU 内部 SRAM 有限的瓶颈。这与普通 AVR 内核微控制器的能力有本质区别值得一套专门的验证程序。二、测试应用结构与构建入口整个测试应用只有四个文件结构非常精简文件作用tests/cpu/avr8_xmega_drivers/main.c测试应用入口按模块条件编译并调度各驱动测试tests/cpu/avr8_xmega_drivers/test_ebi.cEBI 外部总线测试实现数据总线、地址总线、数据完整性tests/cpu/avr8_xmega_drivers/cpu_tests.h测试函数原型声明ebi_tests()tests/cpu/avr8_xmega_drivers/Makefile构建配置声明默认板卡与支持的板卡列表2.1 入口逻辑模块化条件编译tests/cpu/avr8_xmega_drivers/main.c 的main()采用 RIOT 常见的条件编译模式测试项与编译期模块开关一一对应int main(void) { puts(Start XMEGA tests); #if defined(MODULE_ATXMEGA_EBI) puts(Start EBI tests); ebi_tests(); #endif puts(Finished XMEGA tests); return 0; }也就是说只有当构建配置启用了MODULE_ATXMEGA_EBI即 EBI 驱动模块被链接进固件时EBI 测试才会被执行。这种设计保证了测试应用与实际驱动模块的启用状态严格同步未启用的驱动不会被误测将来若为 XMEGA 增加新的独有驱动只需在此处追加一个#if defined(...)分支即可扩展。2.2 默认板卡与支持范围tests/cpu/avr8_xmega_drivers/Makefile 定义了该测试的硬件适用范围BOARD ? atxmega-a1u-xpro include ../Makefile.cpu_common # list of ATxmega boards BOARDS_SUPPORTED \ atxmega-a1-xplained \ atxmega-a1u-xpro \ atxmega-a3bu-xplained \ #默认板卡为atxmega-a1u-xpro不指定BOARD时直接编译该目标显式支持的板卡有三块atxmega-a1-xplained、atxmega-a1u-xpro、atxmega-a3bu-xplained恰好对应仓库 boards 目录中全部三块 ATxmega 板卡通过include ../Makefile.cpu_common与include $(RIOTBASE)/Makefile.include接入 RIOT 标准的 CPU 测试构建框架。构建与烧录可沿用 RIOT 测试的常规流程例如在仓库根目录执行make -C tests/cpu/avr8_xmega_drivers BOARDatxmega-a1u-xpro flash test构建结果取决于本机是否已安装 AVR 工具链以及对应板卡调试器配置。三、EBI 驱动与 hugemem 大内存访问机制要读懂测试代码必须先理解 EBI 驱动在 RIOT 中的实现层次。EBI 相关代码位于 cpu/atxmega/ebi/ebi.c 与 cpu/atxmega/include/cpu_ebi.h。3.1 内核启动早期初始化一个值得注意的实现细节是ebi_init()的声明方式见 cpu/atxmega/ebi/ebi.cvoid ebi_init(void) __attribute__((naked, section(.init1), used));它被放置到链接脚本的.init1段这意味着EBI 在 C 运行时初始化.init系列的最早期阶段就会执行先于普通外设驱动。原因是外部存储器SRAM往往承载着部分数据段或栈必须在任何普通代码访问内存之前完成总线配置。同时cpu/atxmega/ebi/ebi.c 中通过ebi_config.addr_bits 0作为禁用开关当板级配置未启用 EBI 时ebi_init()直接返回避免误操作端口。3.2 突破 64 KB 寻址限制hugemem APIAVR 8 位架构的经典痛点是普通数据指针只能寻址 64 KB 地址空间。XMEGA 借助RAMPZ 段寄存器将指针扩展到 24 位从而访问更大的外部存储器。RIOT 在 cpu/atxmega/include/cpu_ebi.h 中把这一能力封装为统一类型与 APItypedef uint32_t hugemem_ptr_t;配套提供了一整套访问函数API功能hugemem_read8()/hugemem_write8()单字节读写内联汇编实现hugemem_read16()/hugemem_write16()双字节寄存器对读写hugemem_read32()/hugemem_write32()四字节两个寄存器对读写hugemem_read_block()/hugemem_write_block()批量搬移注意源/目的地址范围须在 64 KB 边界内以 cpu/atxmega/include/cpu_ebi.h 中的hugemem_read8()为例其内联汇编展示了 24 位寻址的精髓movw r30, %A[from] \n\t /* r31:r30 - 低16位地址 */ out %[rampz], %C[from] \n\t /* RAMPZ - 高8位地址 */ ld %[dest], Z \n\t /* 读 *(RAMPZ Z) */ out %[rampz], __zero_reg__ \n\t /* 读后立即清除 RAMPZ */即地址的低 16 位装入 Z 指针寄存器对r30:r31高 8 位写入 RAMPZ再由ld Z指令完成 24 位寻址的读取读取结束后立刻将 RAMPZ 清零避免影响后续普通指针运算。hugemem_write8()与hugemem_read32()/hugemem_write32()等函数遵循同一套约定。测试代码中所有对外部 SRAM 的读写全部经由这一层 API 完成。四、EBI 测试内容逐项剖析test_ebi.c 是整个测试应用的核心围绕外部 SRAM 的连接正确性设计了三个递进层次的测试由ebi_tests()依次调度见 test_ebi.c数据总线测试输出bus connectivity—— 检测数据线短路 / 断路地址总线测试输出addressing—— 检测地址线短路 / 断路 / 粘连数据完整性测试输出data integrity—— 验证整片存储器的读写保持能力。任一环节失败即打印TEST FAILED全部通过则打印TEST SUCCEEDED。下面逐一展开算法细节。4.1 数据总线测试walking 1s / 0s 模式ebi_test_data_bus() 采用经典的walking 1s走查 1方法在三轮循环中完成第一轮——写入 walking 1s从基地址开始对连续 32 个 32 位单元依次写入1UL ii 0..31。也就是说第 i 个单元只含一个置位位且该位的位置逐一左移覆盖 32 根数据线中的每一根。第二轮——读回并写反逐个读回若与写入的1UL i不一致则返回-EIO随后写入按位取反的~expected即 walking 0s。第三轮——读回 walking 0s逐个读回~(1UL i)再次比对。原理若某根数据线短路例如 D3 与 D4 相连写入的值在读取时会串位导致与预期不符若某根线断路对应的位永远读不到正确电平。两轮互补模式全 1 走查 全 0 走查可以同时暴露固定为高、固定为低以及相邻线间短路三类硬件缺陷。4.2 地址总线测试0x55 / 0xAA 定位法ebi_test_addr_bus() 针对的是地址线故障——地址线如果短路或断路访问某个地址时会命中错误的物理单元。算法分三步初始化填充在基地址base以及所有2 的幂次偏移位置offset 1, 2, 4, ...写入0x55。选 2 的幂次地址是因为任意一根地址线的状态恰好只改变对应幂次位的寻址结果方便逐根隔离。检查地址线卡高将基地址改写为0xaa然后逐个读回所有 2 的幂次位置若读到的不再是0x55说明访问该偏移时命中了基地址单元——即对应地址线被卡住无法拉低读取永远落到低地址。返回-EIO。检查地址线卡低或短路恢复基地址为0x55然后遍历每个 2 的幂次偏移offset向该偏移写0xaa先确认基地址仍读到0x55防止该线卡低导致offset与base混淆再检查其余所有幂次偏移是否仍为0x55防止两根地址线短路导致同时选中两个单元。这一套基地址 幂次偏移 0x55/0xAA 对照的方法是嵌入式领域验证地址总线连通性的标准做法能系统性地定位到具体是哪一根地址线出了问题。4.3 数据完整性测试整片写入 / 反相回读ebi_test_data_integrity() 在确认总线连通之后对整块可寻址外部存储器做压力级验证第一遍填充以 32 位为单位从pattern 1开始递增填充整个区域pattern每写一个单元自增 1使每个单元都载入不同的已知数据。第二遍校验并反相逐单元读回与当前pattern比对失败返回-EIO随后写入~pattern。第三遍校验反相值再次逐单元读回确认读到的是~pattern。由于每个单元的内容都不同且经过了写入 → 读回 → 反相 → 再读回的完整往返该测试可以暴露数据线在更高负载下的稳定性问题、DRAM/SRAM 单元的保持能力缺陷以及 EBI 时序配置不当导致的偶发读写错误。4.4 不同板卡的存储布局差异测试代码中通过BOARD_ATXMEGA_A1U_XPRO和BOARD_ATXMEGA_A1_XPLAINED两个宏区分三块板卡的内存布局见 test_ebi.c板卡板上安装可寻址RIOT-OS 保留用户可用被测试区域atxmega-a1u-xpro512 KB256 KB板卡布线限制64 KB192 KB0x10000起大小0x30000atxmega-a1-xplained8 MB8 MB64 KB约 8 MB - 64 KB0x10000起大小0x7F0000atxmega-a3bu-xplained默认分支128 KB128 KB64 KB64 KB0x10000起大小0x10000三块板卡的测试基地址均为0x1000064 KB 之后即 RIOT-OS 保留区之外测试区域大小则按各自实际可用容量设置。值得注意的是代码注释特别说明atxmega-a1u-xpro 虽然安装了 512 KB SRAM但由于板卡布线原因仅有 256 KB 真正可寻址可见测试区域的大小严格以实际可寻址容量为准而不是芯片标称容量。五、板级 EBI 配置periph_conf.h 中的 ebi_config测试区域之所以能成立前提是板级代码把 EBI 正确配置为 LPC低引脚数SRAM 模式。以默认板卡 atxmega-a1u-xpro 为例其 boards/atxmega-a1u-xpro/include/periph_conf.h 中的配置如下static const ebi_conf_t ebi_config { .addr_bits 18, /* A0-A17 */ .flags (EBI_PORT_LPC | EBI_PORT_CS2), .sram_ale 0, .lpc_ale 2, .sdram { 0 }, .cs { /* Reserved A16 */ { EBI_CS_MODE_DISABLED_gc, 0, EBI_CS_SRWS_0CLK_gc, 0x0UL, }, /* Reserved A17 */ { EBI_CS_MODE_DISABLED_gc, 0, EBI_CS_SRWS_0CLK_gc, 0x0UL, }, /* CS2 - 256K SRAM */ { EBI_CS_MODE_LPC_gc, EBI_CS_ASIZE_256KB_gc, EBI_CS_SRWS_1CLK_gc, 0x0UL, }, /* Reserved LCD */ { EBI_CS_MODE_DISABLED_gc, ... }, }, };关键字段含义对应 cpu/atxmega/ebi/ebi.c 中的解析逻辑addr_bits 18对外引出 A0–A17 共 18 根地址线对应 256 KB 寻址空间这也是驱动判断是否启用 EBI的依据置 0 即禁用。flags EBI_PORT_LPC | EBI_PORT_CS2选择 LPCLow Pin Count模式并启用片选 CS2。lpc_ale 2/sram_ale 0配置地址锁存使能信号——LPC 模式下由 2 号 ALE 信号承担地址锁存而传统 SRAM 的 ALE 不使用。cs数组逐项配置 4 个片选通道的模式EBI_CS_MODE_*、地址空间大小EBI_CS_ASIZE_*与 SRAM 等待周期EBI_CS_SRWS_*CLK_gc。从源码可见 A16、A17 对应的 CS0/CS1 被禁用与Reserved注释一致真正生效的是CS2 —— 256 KB SRAM等待周期为 1 个时钟。ebi_init()在启动早期读取这份配置设置 PORTH/PORTJ/PORTK 的方向与初始电平、生成 ALE 信号、配置各片选寄存器详见 cpu/atxmega/ebi/ebi.c 附近关于 SDRAM 模式与 SRAM 模式下端口初始化的分支。正是这份板级配置 .init1早期初始化的组合让测试代码可以放心地在main()中直接对0x10000起始的外部地址做完整读写。六、预期结果与验证闭环README 对测试结果的判定非常明确The test application compiles for ATxmega based boards and success run.即两个层面的验收标准编译通过测试应用能在上述三块 ATxmega 板卡atxmega-a1-xplained / atxmega-a1u-xpro / atxmega-a3bu-xplained上成功编译——这本身验证了MODULE_ATXMEGA_EBI模块的构建链路、头文件依赖与板级配置的完整性运行成功固件运行后依次输出三段过程信息bus connectivity、addressing、data integrity最终以TEST SUCCEEDED收尾参见 test_ebi.c。如果外部 SRAM 与 XMEGA 之间的数据线、地址线存在焊接缺陷或 EBI 时序/片选配置不当测试会在对应阶段提前打印TEST FAILED并退出——这也使该测试应用同时具备了硬件产线自检与板级移植调试的双重用途开发者移植一块新的 ATxmega 板卡时可通过它快速确认 EBI 引脚分配、periph_conf.h配置与实际硬件是否吻合。七、总结tests/cpu/avr8_xmega_drivers是一个小而完整的CPU 独有驱动验证范例定位上它严格服务于 AVR-8 XMEGA 的额外驱动当前为 EBI通过MODULE_ATXMEGA_EBI条件编译与应用代码解耦便于随驱动清单同步扩展原理上它依托 cpu/atxmega/ebi/ebi.c 的.init1早期初始化和 cpu/atxmega/include/cpu_ebi.h 的 hugemem 24 位寻址 API在main()中对外部 SRAM 完成数据总线、地址总线、数据完整性三类经典硬件测试工程上它通过ebi_config板级配置boards/atxmega-a1u-xpro/include/periph_conf.h 等与按板卡区分的存储布局宏优雅地适配了三块容量差异巨大的 ATxmega 开发板。对于希望将 XMEGA 大内存能力用于自家产品的开发者这份测试代码既是一份可复用的外部 SRAM 硬件自检工具也是一份理解 AVR 24 位寻址与 EBI 总线时序的最佳入门读物。赞分享物联网嵌入式操作系统实时系统【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址https://gitcode.com/GitHub_Trending/riot/RIOT点击查看免费下载相关推荐RIOT OS 驱动 SAUL 接口构建测试应用 saul_drivers 全解析RIOT OS 驱动 SAUL 接口构建测试应用 saul_drivers 全解析 SAULSensor Actuator Uber Layer是 RIOT物联网嵌入式操作系统实时系统RIOT OS 的 NXP Kinetis CPU 移植十大外设驱动配置详解与源码剖析RIOT OS 的 NXP Kinetis CPU 移植十大外设驱动配置详解与源码剖析 本文围绕 RIOT OS 仓库中 cpu/kinetis/doc.md物联网嵌入式操作系统实时系统RIOT 外设 DAC 测试应用解析10Hz 锯齿波生成、驱动接口与示波器验证RIOT 外设 DAC 测试应用解析10Hz 锯齿波生成、驱动接口与示波器验证 本文围绕 RIOT 操作系统仓库中的 DAC 外设测试应用 https://l物联网嵌入式操作系统实时系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表