ARTICLE DETAIL

资讯详情

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

深入解析 Atmel SAMA5D2x Software Package:FreeRTOS 工程内的驱动库架构与构建调试实战

深入解析 Atmel SAMA5D2x Software Package:FreeRTOS 工程内的驱动库架构与构建调试实战 深入解析 Atmel SAMA5D2x Software PackageFreeRTOS 工程内的驱动库架构与构建调试实战【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS导读本文以 FreeRTOS 仓库中 CORTEX_A5_SAMA5D2x_Xplained_IAR 工程 内随附的 AtmelFiles/README.md 为骨架系统讲解 Atmel SAMA5D2x 软件包Software Package下称 softpack的目录架构、外设驱动覆盖范围、示例清单以及基于 GNU ARM Embedded / IAR 两套工具链的构建、生成工程与调试流程。读完本文你将掌握该软件包在 FreeRTOS 工程中的角色定位——drivers/与utils/如何为 FreeRTOS 移植提供底层驱动支撑并能够独立完成 make 构建、IAR 工程生成与 GDB 调试。说明本文引用路径均以仓库根目录为起点。该软件包在仓库中仅保留了drivers/与utils/两个子目录FreeRTOS 移植实际使用的部分README 中描述的完整 softpack 目录如target/、scripts/、examples/属于 Atmel 原始发布形态在仓库中未全部包含阅读时请留意。软件包概览定位与版本它是什么Atmel SAMA5D2x Software Package是面向 SAMA5D2x 系列微处理器的板级支持软件包README 明确声明This softpack comes as an early delivery and all presented APIs are subject to change.即它属于早期交付形态所有公开 API 都可能发生变动——这提醒我们在基于该软件包做二次开发时应尽量通过其头文件封装访问外设避免直接依赖未公开的内部实现细节。每个软件模块均随附完整源码、使用示例和可直接使用的工程Each software module is provided with full source code, example of usage, and ready-to-use projects。支持的平台与依赖工具链操作系统依赖GNU GCC ARM EmbeddedWindows / LinuxMac OS X 预期可用但未测试GNU make、bashWindows 下需 MinGW/Cygwin/GnuWin32 提供IAR Embedded WorkbenchWindowsIAR EW for ARM 7.40文档注明测试版本、bash、GNU make、mktemp后三者用于 IAR 工程生成文档原文提示 GCC ARM Embedded 工具链可在https://launchpad.net/gcc-arm-embedded下载Segger J-Link 的JLinkGDBServer可在http://www.segger.com下载。按本文链接规范这里仅作背景说明请在需要时自行检索官方渠道获取。版本演进来自 ChangeLog仓库中的 AtmelFiles/ChangeLog.md 记录了该软件包的演进历史可帮助我们理解其成熟度V0.32015-08新增 ACC、ADC、AES/TDES/SHA、L2CC、GMAC含 ad-hoc/LWIP/UIP 三种协议栈示例、SHDWC 驱动GCC 启动代码启用 FPUMMU 增加非缓存 DDR 区域供 LCD 与 GMAC 示例使用。V1.02015-09新增 MCAN 驱动与示例sama5d2-xplained目标适配最终 revA 板时钟初始化更可靠PMC 驱动支持生成时钟。V1.12015-10新增 Class-D 音频驱动UART 驱动支持 ISO7816 与 LIN 模式PMC 驱动增强UPLL、AudioPLL修复 ADC 驱动与 MMU 内存区域配置。V1.22015-12新增 USB Device 示例栈CDC Serial、HID Keyboard/Mouse、Audio、Mass Storage 及复合示例、NAND flashMLC/SLC最高 32-bit ECC、SDMMC/eMMC 驱动、低功耗示例IAR 工程生成器改为从CFLAGS_DEFS/CFLAGS_INC变量读取宏定义与包含目录修复 CP15 缓存使能顺序问题先失效缓存再使能避免陈旧数据导致锁死。值得注意ChangeLog 中提到的examples/USB、NAND、SDMMC、低功耗示例与storagemedia库属于 Atmel 完整发布包的内容当前 FreeRTOS 仓库仅保留了驱动与工具库部分这正是 FreeRTOS 移植只依赖drivers/与utils/的体现。目录架构软件包的组织方式README 中描述了完整 softpack 的目录架构target/sama5d2所有芯片与板级相关源码target/sama5d2/toolchain/链接脚本与调试脚本scripts/生成器与构建脚本模板Makefiledrivers/驱动源码examples/所有示例。在当前仓库中AtmelFiles/下实际保留的是drivers/与utils/两个子树其真实结构如下AtmelFiles/ ├── drivers/ │ ├── cortex-a/ # Cortex-A 架构层中断、CP15、MMU、CPSR、PMU │ ├── misc/ # 杂项BMP280 传感器、控制台、LED │ ├── peripherals/ # 外设驱动ADC/AES/AIC/CAN/GMAC/ISC/L2CC/PMC/QSPI/RTC/SPI/TWI/TRNG/UART/USART/WDT/XDMA 等 │ ├── power/ # 电源管理ACT8945A PMIC │ └── Makefile.inc ├── utils/ # 通用工具库异步、CRC、LCD 绘图、互斥、环形缓冲、定时器、跟踪、WAV 等 ├── ChangeLog.md └── README.mddrivers/peripheralsFreeRTOS 移植直接消费的外设驱动drivers/peripherals/是软件包的核心FreeRTOS 工程正是从这里获取底层外设支持。以本工程的 FreeRTOS_tick_config.c 为例它直接调用了peripherals/aic.h、peripherals/pio.h、peripherals/pit.h中的接口来完成系统节拍中断的配置#include peripherals/aic.h #include peripherals/pio.h #include peripherals/pit.h #include board.h void vConfigureTickInterrupt( void ) { /* Enable the PIT clock. */ PMC-PMC_PCER0 1 ID_PIT; /* Initialize the PIT to the desired frequency - specified in uS. */ pit_init( 1000000UL / configTICK_RATE_HZ ); /* Configure interrupt on PIT ... */ aic_configure( ID_PIT, AIC_SMR_SRCTYPE_EXT_POSITIVE_EDGE ); aic_set_source_vector( ID_PIT, FreeRTOS_Tick_Handler ); aic_enable( ID_PIT ); pit_enable_it(); /* Enable the pit. */ pit_enable(); }从中可以看到 FreeRTOS 与软件包的分工节拍时钟源使用 PITPeriodic Interval Timer频率由configTICK_RATE_HZ换算为微秒传入pit_init()中断控制器使用 AICAdvanced Interrupt Controller通过aic_configure/aic_set_source_vector/aic_enable注册 PIT 中断中断向量地址在 FreeRTOSConfig.h 中通过configAIC_BASE_ADDRESS、configPIT_BASE_ADDRESS、configINTERRUPT_VECTOR_ADDRESS、configEOI_ADDRESS等宏将 AIC/PIT 寄存器地址暴露给 Cortex-A5 RTOS 移植层由移植层的vApplicationIRQHandler()见 main.c在管理中断进入/嵌套后分发执行。此外main.c 的prvSetupHardware()演示了启动阶段对软件包的使用顺序先wdt_disable()关闭看门狗再通过 AIC 寄存器设置保护模式便于调试随后vParTestInitialise()初始化 LED 端口最后若定义了ddram执行MMU_Initialize、CP15_EnableMMU、CP15_EnableDcache、CP15_EnableIcache完成 MMU 与缓存初始化——这些接口正是来自drivers/cortex-a/下的mmu.c、cp15.c。drivers/miscLED 抽象FreeRTOS 的 LED 抽象层ParTest在 LEDs.c 中实现通过misc/led.h的led_configure/led_set/led_clear/led_toggle完成void vParTestInitialise( void ) { led_configure( 0 ); led_configure( 1 ); led_configure( 2 ); } void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) { led_toggle( uxLED ); }需要注意 main.c 顶部注释特别说明本 demo并未使用 SAMA5D2 Xplained 板载 LED而是通过板级头文件中的LEDS_ON_J17预处理宏将PIN_LED定义重映射到 J17 连接器的 30/32/34 引脚1.8V 高驱动推挽输出最大可灌 18mA低正向压降 LED 经 100Ω 限流电阻接至 35/36 脚 GND。实际动手运行 demo 时请按此说明接线。utils通用工具库utils/提供与具体外设解耦的通用模块包括crc校验、lcd_draw/lcd_font/lcd_colorLCD 绘图与字体、mutex含 GCC/IAR 两套汇编实现mutex_gcc.S/mutex_iar.s、ring.h环形缓冲、timer、trace调试跟踪、async、wav、dbg_util等。它们在 FreeRTOS 之外可独立复用也体现了软件包模块可裁剪的设计思路。示例清单软件包覆盖的功能面README 列出了该版本发布时包含的全部示例属于 Atmel 完整发布包内容仓库中未附examples/目录但可作为了解软件包能力的参考示例说明adcADC 使用示例canCAN 使用示例crypto_aesAES 硬件计算含/不含 DMAcrypto_shaSHA 硬件计算含/不含 DMAcrypto_tdesTriple-DES 硬件计算含/不含 DMAfifoFlexcom USART FIFO 测试getting-startedLED 闪烁使用 PIT 与 PIOgmac基于简单 IP 协议栈的 GMAC 示例gmac_lwip基于 LWIP 协议栈的 GMAC 示例gmac_uip_helloworld / telnetd / webserver基于 UIP 协议栈的 GMAC 示例helloworld / telnetd / webserveriscISC 控制器示例OV7740 传感器lcdLCD 控制器示例qspi_flashQSPI 串行 flash 的读/写/擦除命令rtcRTC 示例spi_serialflashSPI 串行 flash 的读/写/擦除命令trng硬件随机数发生器中断模式twi_eeprom双线Two-WireEEPROM 的读/写/擦除命令wdt看门狗定时器示例xdma内存到内存 DMA 传输示例xdma_usartUSART-内存双向 DMA 传输示例从示例分布可以看出软件包覆盖了模拟外设ADC、通信外设CAN、GMAC、SPI、TWI、USART、安全外设AES/SHA/TDES/TRNG、存储QSPI/SPI flash、EEPROM、多媒体LCD、ISC以及系统外设RTC、WDT、DMA、PIT/PIO等完整功能面。其中与 FreeRTOS 工程关联最直接的是getting-startedPITPIO 的 LED 闪烁正是本工程 blinky demo 的雏形与gmac_lwipTCP/IP 协议栈集成路径。从源码结构看drivers/peripherals/中出现的gmac.c/gmacd.c、spid.c/twid.c/usartd.c/xdmad.c带d后缀为 DMA 变体README 与 ChangeLog 中with and without DMA的示例划分与此一一对应。GCC ARM Embedded 工具链的使用环境变量README 定义了三个构建相关环境变量变量含义默认值TARGET目标板名称sama5d2-xplained对应 SAMA5D2 XPLAINED ULTRA 板无必填可每次 make 时通过命令行传入DEBUG以调试标志构建默认启用RELEASE以发布标志构建未启用TRACE_LEVEL日志级别5 为全量输出0 为不输出5文档强调只有TARGET必须在每次 make 调用时提供或预先设置其余变量均有默认值。即构建前至少执行export TARGETsama5d2-xplained或在每条 make 命令后追加TARGETsama5d2-xplained。构建在示例目录下运行make # 或若 TARGET 未预先设置 make TARGETwanted_targetwanted_target即目标板名称对本工程而言是sama5d2-xplained。make默认走 DEBUG 路径并携带TRACE_LEVEL5的全量日志。用 GDB 运行与调试调试流程需要两个环节配合启动 JLinkGDBServer先在主机侧启动 Segger J-Link 的 GDB Server按平台从官方渠道下载让它接管 SAMA5D2 目标板的调试通道调用 make 调试目标README 提供了封装好 gdb 参数的 make targetmake debug # 或 make TARGETwanted_target debug # 若 TARGET 未预先设置make debug会自动携带正确的 gdb 命令行参数连接已启动的 JLinkGDBServer无需手工拼接target remote、monitor等命令。IAR Embedded Workbench 的使用预生成工程Windows 版发布包自带与IAR EW for ARM 7.40兼容的预生成 IAR 工程。README 特别提示C-SPY 器件描述文件device description files与器件选择文件未随包提供需要手工安装。IAR 工程生成如果需要重新生成 IAR 工程可在示例目录下运行make iar # 或 make TARGETwanted_target iar # 若 TARGET 未预先设置生成的所有IAR 工程文件.ewp工程、.ewd调试配置以及默认 workspace 文件.eww都会被放入示例目录。在本 FreeRTOS 工程中仓库已随附了预生成的 RTOSDemo.eww、RTOSDemo.ewp 与 RTOSDemo.ewd可直接用 IAR 打开编译settings/目录下还保留着.wsdt、.dni、.dbgdt等 IAR 工作区/调试状态文件。从 ChangeLog 可知工程生成器会从CFLAGS_DEFS与CFLAGS_INC读取宏定义与包含目录并生成选中 CMSIS-DAP 调试器、设置合适优化级别的工程。Windows 下的已知问题README 末尾给出一个实用的排错提示GNU make may fail on Windows platforms if the Makefile contains UNIX line endings. You can useunix2doson all Makefile files inscripts/directory to fix this issue.即Windows 平台上若 Makefile 为 UNIX 换行符LFGNU make 可能构建失败解决办法是对scripts/目录下所有 Makefile 执行unix2dos转换为 CRLF。仓库中drivers/、drivers/cortex-a/、drivers/misc/、drivers/peripherals/、drivers/power/、utils/各目录均带有Makefile.inc这些正是软件包 make 体系的组成部分。FreeRTOS 工程视角软件包如何被消费两套 demo 的切换本 FreeRTOS 工程通过 main.c 中的mainCREATE_SIMPLE_BLINKY_DEMO_ONLY宏选择运行哪套 demo置 1运行 blinky_demo/main_blinky.c 的简单 blinky——创建 1 个队列与 2 个任务发送任务每 200ms 向队列写入值 100接收任务阻塞等待队列数据、收到后翻转一次 LED置 0运行 Full_Demo/main_full.c 的完整测试/演示应用并在 main.c 的vApplicationTickHook()中周期驱动软件定时器、队列覆写、事件组等标准 demo 的 ISR 测试。节拍中断与配置宏的联动FreeRTOSConfig.h 中与 Atmel 硬件强相关的配置包括configCPU_CLOCK_HZ留空注释说明本移植不使用时钟值来自 Atmel 库即板级库负责 CPU 主频初始化configAIC_BASE_ADDRESS 0xFC020000UL、configPIT_BASE_ADDRESS 0xF8048030ULAIC 与 PIT 的寄存器基址configINTERRUPT_VECTOR_ADDRESS AIC 基址 0x10从中读取当前中断处理函数地址configEOI_ADDRESS AIC 基址 0x38End of Interrupt 寄存器configPIT_PIVR与configCLEAR_TICK_INTERRUPT()通过读 PIT_PIVR基址 0x8清除节拍中断configFPU_D32 0Cortex-A 专用设置FPU 仅 16 个 d 寄存器configSETUP_TICK_INTERRUPT()由应用提供vConfigureTickInterrupt()即上文FreeRTOS_tick_config.c中的实现。由此可以梳理出 FreeRTOS 内核与 Atmel 软件包之间的调用链FreeRTOS 内核Cortex-A5 移植层 │ configSETUP_TICK_INTERRUPT() ▼ vConfigureTickInterrupt() ← FreeRTOS_tick_config.c │ pit_init / aic_configure / aic_set_source_vector / aic_enable / pit_enable_it / pit_enable ▼ Atmel softpackdrivers/peripherals/{pit.c, aic.c, pio.c} 板级 board.h │ 中断进入后 ▼ vApplicationIRQHandler() ← main.c读取 AIC IVR、回写 IVR、使能 IRQ、分发执行这条链路正是README 描述的软件包与FreeRTOS 工程的接缝所在软件包提供寄存器级外设驱动FreeRTOS 提供任务调度与中断管理二者通过配置宏与 hook 函数解耦。中断嵌套测试与运行时统计configGENERATE_RUN_TIME_STATS被置 1且运行时统计时基复用了 Full_Demo 中 20KHz 高频定时器中断Full_Demo/IntQueueTimer.c维护的ulHighFrequencyTimerCounts计数器从而省去独立统计定时器。这体现了 FreeRTOS 工程对软件包/板级外设资源的复用思路。从 RAM 加载执行的烧录流程板级实操main.c 头部注释给出了从 RAM 下载并执行代码的完整板级操作步骤对使用该 demo 的开发者非常实用闭合跳线JP9BOOT_DIS与JP2DEBUG_DIS断开跳线JP1EDBG_DIS通过 J14EDBG_JTAG的 USB 连接为板上电打开 EDBG 虚拟串口参数为57600, 8, N, 1在超级终端输入#收到回复即进入命令模式调试期间不要复位板子IAR 侧将调试器设为 CMSIS-DAP并选择Disabled (no reset)选项。这套流程与 README 中预生成 IAR 工程 CMSIS-DAP 调试器的说明相互印证是实际运行本工程前必须完成的硬件准备。常见问题与注意事项汇总API 稳定性软件包为早期交付API 可能变化README 明确声明升级软件包版本时需关注 ChangeLog.md 中的修复与增强项例如 V1.2 修复的 CP15 缓存使能顺序问题若板子偶发锁死可优先核对此项。TARGET 必须显式提供TARGET无默认值构建与生成工程前务必设置或每次 make 追加TARGETsama5d2-xplained。IAR 器件文件需手动安装C-SPY 器件描述文件与器件选择文件不随包提供。Windows 构建换行符问题Makefile 若为 LF 行尾可能导致 GNU make 失败用unix2dos转换scripts/下 Makefile仓库中对应各目录的Makefile.inc。LED 不在板载本 demo 的 LED 输出映射到 J17 的 30/32/34 引脚需按 main.c 注释自行接线1.8V、高驱动、100Ω 限流。PIT 中断共享FreeRTOS_tick_config.c 注释提醒PIT 中断与其他系统外设共享系统中断若系统还有其他中断需要服务应改用System_Handler()统一分发而非直接把FreeRTOS_Tick_Handler()装成 PIT 中断入口。总结Atmel SAMA5D2x Software Package 为 SAMA5D2 平台提供了层次清晰、可裁剪的驱动与工具库drivers/cortex-a负责架构层MMU/CP15/中断drivers/peripherals覆盖十余类外设含 DMA 变体drivers/misc与utils提供 LED、控制台与通用算法支撑。在本 FreeRTOS 仓库中它被 FreeRTOS_tick_config.c、main.c、LEDs.c 等文件实际消费配合 FreeRTOSConfig.h 中的硬件地址宏构成一套完整的寄存器级驱动 实时内核方案。无论你是在 SAMA5D2 Xplained Ultra 上跑 blinky还是借助make/make debug/make iar扩展自定义外设示例本文梳理的目录结构、构建变量与调用链都可以作为直接的上手指南。【免费下载链接】FreeRTOSClassic FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表