news 2026/9/16 18:45:41

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析 Atmel SAMA5D2x Software Package:FreeRTOS 工程内的驱动库架构与构建调试实战

深入解析 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 EmbeddedWindows / Linux(Mac OS X 预期可用但未测试)GNU make、bash(Windows 下需 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.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.md

drivers/peripherals:FreeRTOS 移植直接消费的外设驱动

drivers/peripherals/是软件包的核心,FreeRTOS 工程正是从这里获取底层外设支持。以本工程的 FreeRTOS_tick_config.c 为例,它直接调用了peripherals/aic.hperipherals/pio.hperipherals/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_ADDRESSconfigPIT_BASE_ADDRESSconfigINTERRUPT_VECTOR_ADDRESSconfigEOI_ADDRESS等宏将 AIC/PIT 寄存器地址暴露给 Cortex-A5 RTOS 移植层,由移植层的vApplicationIRQHandler()(见 main.c)在管理中断进入/嵌套后分发执行。

此外,main.c 的prvSetupHardware()演示了启动阶段对软件包的使用顺序:先wdt_disable()关闭看门狗,再通过 AIC 寄存器设置保护模式便于调试,随后vParTestInitialise()初始化 LED 端口,最后(若定义了ddram)执行MMU_InitializeCP15_EnableMMUCP15_EnableDcacheCP15_EnableIcache完成 MMU 与缓存初始化——这些接口正是来自drivers/cortex-a/下的mmu.ccp15.c

drivers/misc:LED 抽象

FreeRTOS 的 LED 抽象层(ParTest)在 LEDs.c 中实现,通过misc/led.hled_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(环形缓冲)、timertrace(调试跟踪)、asyncwavdbg_util等。它们在 FreeRTOS 之外可独立复用,也体现了软件包"模块可裁剪"的设计思路。

示例清单:软件包覆盖的功能面

README 列出了该版本发布时包含的全部示例(属于 Atmel 完整发布包内容,仓库中未附examples/目录,但可作为了解软件包能力的参考):

示例说明
adcADC 使用示例
canCAN 使用示例
crypto_aesAES 硬件计算(含/不含 DMA)
crypto_shaSHA 硬件计算(含/不含 DMA)
crypto_tdesTriple-DES 硬件计算(含/不含 DMA)
fifoFlexcom USART FIFO 测试
getting-startedLED 闪烁(使用 PIT 与 PIO)
gmac基于简单 IP 协议栈的 GMAC 示例
gmac_lwip基于 LWIP 协议栈的 GMAC 示例
gmac_uip_helloworld / telnetd / webserver基于 UIP 协议栈的 GMAC 示例(helloworld / telnetd / webserver)
iscISC 控制器示例(OV7740 传感器)
lcdLCD 控制器示例
qspi_flashQSPI 串行 flash 的读/写/擦除命令
rtcRTC 示例
spi_serialflashSPI 串行 flash 的读/写/擦除命令
trng硬件随机数发生器(中断模式)
twi_eeprom双线(Two-Wire)EEPROM 的读/写/擦除命令
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-started(PIT+PIO 的 LED 闪烁,正是本工程 blinky demo 的雏形)与gmac_lwip(TCP/IP 协议栈集成路径)。

从源码结构看,drivers/peripherals/中出现的gmac.c/gmacd.cspid.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_target

wanted_target即目标板名称,对本工程而言是sama5d2-xplainedmake默认走 DEBUG 路径并携带TRACE_LEVEL=5的全量日志。

用 GDB 运行与调试

调试流程需要两个环节配合:

  1. 启动 JLinkGDBServer:先在主机侧启动 Segger J-Link 的 GDB Server(按平台从官方渠道下载),让它接管 SAMA5D2 目标板的调试通道;
  2. 调用 make 调试目标:README 提供了封装好 gdb 参数的 make target:
make debug # 或 make TARGET=wanted_target debug # 若 TARGET 未预先设置

make debug会自动携带正确的 gdb 命令行参数连接已启动的 JLinkGDBServer,无需手工拼接target remotemonitor等命令。

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_DEFSCFLAGS_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 换行符(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 = 0xFC020000ULconfigPIT_BASE_ADDRESS = 0xF8048030UL:AIC 与 PIT 的寄存器基址;
  • configINTERRUPT_VECTOR_ADDRESS = AIC 基址 + 0x10:从中读取当前中断处理函数地址;
  • configEOI_ADDRESS = AIC 基址 + 0x38:End of Interrupt 寄存器;
  • configPIT_PIVRconfigCLEAR_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 的开发者非常实用:

  1. 闭合跳线JP9(BOOT_DIS)与JP2(DEBUG_DIS);
  2. 断开跳线JP1(EDBG_DIS);
  3. 通过 J14(EDBG_JTAG)的 USB 连接为板上电;
  4. 打开 EDBG 虚拟串口,参数为57600, 8, N, 1
  5. 在超级终端输入#,收到>回复即进入命令模式;
  6. 调试期间不要复位板子:IAR 侧将调试器设为 CMSIS-DAP,并选择"Disabled (no reset)"选项。

这套流程与 README 中"预生成 IAR 工程 + CMSIS-DAP 调试器"的说明相互印证,是实际运行本工程前必须完成的硬件准备。

常见问题与注意事项汇总

  1. API 稳定性:软件包为早期交付,API 可能变化(README 明确声明),升级软件包版本时需关注 ChangeLog.md 中的修复与增强项(例如 V1.2 修复的 CP15 缓存使能顺序问题,若板子偶发锁死,可优先核对此项)。
  2. TARGET 必须显式提供TARGET无默认值,构建与生成工程前务必设置,或每次 make 追加TARGET=sama5d2-xplained
  3. IAR 器件文件需手动安装:C-SPY 器件描述文件与器件选择文件不随包提供。
  4. Windows 构建换行符问题:Makefile 若为 LF 行尾可能导致 GNU make 失败,用unix2dos转换scripts/下 Makefile(仓库中对应各目录的Makefile.inc)。
  5. LED 不在板载:本 demo 的 LED 输出映射到 J17 的 30/32/34 引脚,需按 main.c 注释自行接线(1.8V、高驱动、100Ω 限流)。
  6. 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/miscutils提供 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:44:25

心理咨询行业的发展前景与趋势深度分析-中国心理学会心理咨询师水平评价-长春心理咨询培训机构

心理咨询行业的发展前景与趋势深度分析中国心理学会心理咨询师水平评价-心理咨询培训机构 很多人选择学心理咨询时会考虑&#xff1a;这个行业未来会怎样&#xff1f;值不值得投入&#xff1f;今天就来做一个相对客观的行业前景分析&#xff0c;帮你做出理性的判断。 一、行业发…

作者头像 李华
网站建设 2026/9/16 18:43:49

WeChatMsg 免费教程:本地导出微信聊天记录并生成年度聊天报告

WeChatMsg 免费教程&#xff1a;本地导出微信聊天记录并生成年度聊天报告 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/w…

作者头像 李华