Zynq + FreeRTOS 笔试题3
一、基础知识(每题2分,共20分)
- Zynq-7000系列芯片的PS和PL分别指什么?它们如何协作?
- FreeRTOS中任务优先级范围是多少?优先级数值越大表示优先级越高还是越低?
- AXI4-Lite和AXI4-Stream协议的主要区别是什么?各适用于什么场景?
- 在Zynq中,如何通过Vivado配置GPIO外设并生成设备树(DTS)?
- FreeRTOS的
xTaskCreate()
函数参数中uxStackDepth
的单位是什么?如何确定合适的栈大小? - Zynq的双核(Cortex-A9)运行FreeRTOS时,如何实现核间通信(IPC)?列举两种方法。
- 解释DMA在Zynq PS-PL数据传输中的作用,并说明如何通过AXI DMA IP核实现零拷贝传输。
- FreeRTOS的软件定时器回调函数中能否调用
vTaskDelay()
?为什么? - Zynq的FCLK_CLK0时钟默认频率是多少?如何修改其频率并在FreeRTOS中使用?
- 在FreeRTOS中,如何防止任务优先级反转?请说明优先级继承机制的原理。
二、综合应用(共50分)
-
系统设计题(15分)
设计一个基于Zynq+FreeRTOS的工业传感器采集系统,要求:- PS端通过UART接收PL端ADC采集的数据(1kHz采样率)。
- 数据存储到SD卡(FAT32格式),存储满后循环覆盖。
- 通过以太网每5秒上传一次平均值到服务器。
请画出系统架构图,并说明各模块的实现方法(包括FreeRTOS任务划分、外设配置、同步机制)。
-
代码编写题(15分)
编写一个FreeRTOS任务,实现以下功能:- 任务1:从消息队列接收字符串数据(最大长度64字节),收到"EMERGENCY"时立即触发紧急处理函数。
- 任务2:每200ms向队列发送一次状态数据(“NORMAL"或"WARNING”)。
要求使用信号量保证队列访问的线程安全,并处理队列满的情况。
-
性能优化题(10分)
某系统使用Zynq PL端实现图像处理算法,PS端通过FreeRTOS任务接收处理后的数据并显示。发现显示延迟高达100ms,请分析可能瓶颈并提出至少3种优化方案。 -
双核协作题(10分)
Zynq双核(CPU0和CPU1)均运行FreeRTOS,需共享一个长度为100的浮点数组。- 如何确保双核读写数据的一致性?
- 编写代码片段,使用OpenAMP框架实现CPU0向CPU1发送中断通知数据就绪。
三、故障排查(共30分)
-
问题现象(5分)
某Zynq系统运行FreeRTOS时,任务A(优先级3)和任务B(优先级2)均阻塞在xQueueReceive()
,但消息队列中已有数据。请分析可能原因。 -
代码诊断(10分)
以下代码用于PL端触发中断后,PS端读取数据并通知FreeRTOS任务:void ISR_Handler() { BaseType_t xHigherPriorityTaskWoken = pdFALSE; uint32_t data = XGpio_DiscreteRead(&gpio, 1); xQueueSendFromISR(xQueue, &data, &xHigherPriorityTaskWoken); // 缺失代码 }
发现中断只能触发一次,后续无法响应。请指出缺失的关键代码并修复。
-
内存问题(8分)
系统运行一段时间后出现HardFault,经查是某个任务栈溢出。- 如何在FreeRTOS中动态监测任务栈使用情况?
- 如何通过修改链接脚本(lscript.ld)增加栈空间?
-
时序分析(7分)
使用ILA抓取AXI总线信号时,发现PL端写入PS端DDR的数据偶尔丢失。- 列举3种可能导致数据丢失的原因。
- 如何通过Vivado设置约束保证时序收敛?
四、参考答案与评分标准
(以下为简略答案,实际需详细展开)
一、基础知识
- PS:处理系统(ARM Cortex-A9),PL:可编程逻辑(FPGA)。PS负责控制流,PL加速数据流。
- 0~(configMAX_PRIORITIES-1),数值越大优先级越高。
- AXI4-Lite:寄存器映射控制,AXI4-Stream:高速流数据。
- Vivado Block Design添加GPIO IP → Generate Output Products → 导出到Vitis生成DTS。
- 单位:字(4字节)。通过
uxTaskGetStackHighWaterMark()
确定。
二、综合应用
-
架构图需包含:
- PL:ADC控制+AXI DMA → PS DDR → FreeRTOS任务(UART解析、SD存储、以太网发送)。
- 任务优先级:以太网 > SD存储 > UART解析。
- 同步机制:信号量保护SD卡访问,事件组触发上传。
-
代码要点:
- 使用
xQueueCreate()
+xSemaphoreCreateMutex()
。 - 任务1中检查队列并处理紧急信号,任务2周期发送。
- 使用
三、故障排查
- 可能原因:队列项大小定义错误,或接收任务未及时取走数据。
- 缺失
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
。 - 使用
uxTaskGetStackHighWaterMark()
;修改lscript.ld中的_stack
和_heap
值。 - 原因:时序违例、FIFO溢出、DMA未对齐。约束:设置
set_max_delay
和set_false_path
。
注:实际考试需根据岗位需求调整难度和知识点权重,建议配合实验环境进行实操考核。