深入解析 Atmel SAMA5D2x Software Package:FreeRTOS 工程内的驱动库架构与构建调试实战
【免费下载链接】FreeRTOS'Classic' 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 Embedded | Windows / Linux(Mac OS X 预期可用但未测试) | GNU make、bash(Windows 下需 MinGW/Cygwin/GnuWin32 提供) |
| IAR Embedded Workbench | Windows | IAR 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.3(2015-08):新增 ACC、ADC、AES/TDES/SHA、L2CC、GMAC(含 ad-hoc/LWIP/UIP 三种协议栈示例)、SHDWC 驱动;GCC 启动代码启用 FPU;MMU 增加非缓存 DDR 区域(供 LCD 与 GMAC 示例使用)。
- V1.0(2015-09):新增 MCAN 驱动与示例;
sama5d2-xplained目标适配最终 revA 板;时钟初始化更可靠,PMC 驱动支持生成时钟。 - V1.1(2015-10):新增 Class-D 音频驱动;UART 驱动支持 ISO7816 与 LIN 模式;PMC 驱动增强(UPLL、AudioPLL);修复 ADC 驱动与 MMU 内存区域配置。
- V1.2(2015-12):新增 USB Device 示例栈(CDC Serial、HID Keyboard/Mouse、Audio、Mass Storage 及复合示例)、NAND flash(MLC/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/:生成器与构建脚本模板(Makefile);drivers/:驱动源码;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/peripherals:FreeRTOS 移植直接消费的外设驱动
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 与软件包的分工:
- 节拍时钟源:使用 PIT(Periodic Interval Timer),频率由
configTICK_RATE_HZ换算为微秒传入pit_init(); - 中断控制器:使用 AIC(Advanced 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/misc:LED 抽象
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_color(LCD 绘图与字体)、mutex(含 GCC/IAR 两套汇编实现mutex_gcc.S/mutex_iar.s)、ring.h(环形缓冲)、timer、trace(调试跟踪)、async、wav、dbg_util等。它们在 FreeRTOS 之外可独立复用,也体现了软件包"模块可裁剪"的设计思路。
示例清单:软件包覆盖的功能面
README 列出了该版本发布时包含的全部示例(属于 Atmel 完整发布包内容,仓库中未附examples/目录,但可作为了解软件包能力的参考):
| 示例 | 说明 |
|---|---|
| adc | ADC 使用示例 |
| can | CAN 使用示例 |
| crypto_aes | AES 硬件计算(含/不含 DMA) |
| crypto_sha | SHA 硬件计算(含/不含 DMA) |
| crypto_tdes | Triple-DES 硬件计算(含/不含 DMA) |
| fifo | Flexcom USART FIFO 测试 |
| getting-started | LED 闪烁(使用 PIT 与 PIO) |
| gmac | 基于简单 IP 协议栈的 GMAC 示例 |
| gmac_lwip | 基于 LWIP 协议栈的 GMAC 示例 |
| gmac_uip_helloworld / telnetd / webserver | 基于 UIP 协议栈的 GMAC 示例(helloworld / telnetd / webserver) |
| isc | ISC 控制器示例(OV7740 传感器) |
| lcd | LCD 控制器示例 |
| qspi_flash | QSPI 串行 flash 的读/写/擦除命令 |
| rtc | RTC 示例 |
| spi_serialflash | SPI 串行 flash 的读/写/擦除命令 |
| trng | 硬件随机数发生器(中断模式) |
| twi_eeprom | 双线(Two-Wire)EEPROM 的读/写/擦除命令 |
| wdt | 看门狗定时器示例 |
| xdma | 内存到内存 DMA 传输示例 |
| xdma_usart | USART-内存双向 DMA 传输示例 |
从示例分布可以看出,软件包覆盖了模拟外设(ADC)、通信外设(CAN、GMAC、SPI、TWI、USART)、安全外设(AES/SHA/TDES/TRNG)、存储(QSPI/SPI flash、EEPROM)、多媒体(LCD、ISC)以及系统外设(RTC、WDT、DMA、PIT/PIO)等完整功能面。其中与 FreeRTOS 工程关联最直接的是getting-started(PIT+PIO 的 LED 闪烁,正是本工程 blinky demo 的雏形)与gmac_lwip(TCP/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 TARGET=sama5d2-xplained(或在每条 make 命令后追加TARGET=sama5d2-xplained)。
构建
在示例目录下运行:
make # 或(若 TARGET 未预先设置) make TARGET=wanted_targetwanted_target即目标板名称,对本工程而言是sama5d2-xplained。make默认走 DEBUG 路径并携带TRACE_LEVEL=5的全量日志。
用 GDB 运行与调试
调试流程需要两个环节配合:
- 启动 JLinkGDBServer:先在主机侧启动 Segger J-Link 的 GDB Server(按平台从官方渠道下载),让它接管 SAMA5D2 目标板的调试通道;
- 调用 make 调试目标:README 提供了封装好 gdb 参数的 make target:
make debug # 或 make TARGET=wanted_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 TARGET=wanted_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 use
unix2doson all Makefile files inscripts/directory to fix this issue.
即:Windows 平台上若 Makefile 为 UNIX 换行符(LF),GNU 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 = 0xF8048030UL:AIC 与 PIT 的寄存器基址;configINTERRUPT_VECTOR_ADDRESS = AIC 基址 + 0x10:从中读取当前中断处理函数地址;configEOI_ADDRESS = AIC 基址 + 0x38:End of Interrupt 寄存器;configPIT_PIVR与configCLEAR_TICK_INTERRUPT():通过读 PIT_PIVR(基址 + 0x8)清除节拍中断;configFPU_D32 = 0:Cortex-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 softpack:drivers/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 的开发者非常实用:
- 闭合跳线
JP9(BOOT_DIS)与JP2(DEBUG_DIS); - 断开跳线
JP1(EDBG_DIS); - 通过 J14(EDBG_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 追加TARGET=sama5d2-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扩展自定义外设示例,本文梳理的目录结构、构建变量与调用链都可以作为直接的上手指南。
【免费下载链接】FreeRTOS'Classic' FreeRTOS distribution. Started as Git clone of FreeRTOS SourceForge SVN repo. Submodules the kernel.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考