ZYNQ平台上关于FreeRTOS的一个简单示例

一、系统介绍

  1. UART、AXIDMA、NET的接收帧
  2. 接收帧的协议解帧处理
  3. 用户逻辑处理
  4. 路由分发到UART、AXIDMA、NET
  5. 通过网口的QSPI在线更新
  6. 软件定时器打印任务运行状况

二、基础配置

  1. PL侧构建AXI-DMA回环
  2. 构建Platform时选择对应FreeRTOS平台
  3. BSP配置中勾选lwip(基本网络协议栈)、xilffs(Fat文件系统)
  4. 修改配置:socket-api、generate_runtime_stats

三、基本系统

  1. UART中断系统,接收回调函数中拷贝数据到循环缓冲区,使用任务通知通知解帧任务
  2. AXIDMA中断系统,中断函数拷贝数据到循环缓冲区,使用任务通知通知解帧任务
  3. UART解帧子系统,阻塞等待消息通知,从循环缓冲区读出所有的数据,一字节一字节解帧,解完一帧之后发送数据到循环缓冲区,构建消息发送到用户处理任务
  4. AXIDMA解帧子系统和UART解帧子系统功能相同
  5. NET接收子系统,socket、bind、listen、accept,写循环缓冲区,并通知解帧任务
  6. NET解帧子系统,和其他解帧子系统功能相同
  7. 用户处理任务,读消息队列,从循环缓冲区拿到数据,处理,发送到另一个循环缓冲区,构建消息队列发送到路由任务
  8. 路由任务,读消息队列,从循环缓冲区拿数,组帧,发送到UART、AXIDMA、NET
  9. QSPI升级任务,socket、bind、listen、accept,读clear、文件大小、接收BOOT.BIN文件、(可增加校验)、读update进行QSPI操作
  10. 定时器回调函数,vTaskList和vTaskGetRunTimeStats,读出任务优先级、剩余栈、运行计数、使用栈
  11. 系统初始化任务,初始化UART、AXIDMA、并启动一次接收,对lwip初始化,创建NET接收子任务和QSPI升级任务,并删除自身

四、分模块配置

  1. UART接收打开接收完成中断和空闲中断
  2. 软件定时器基于硬件定时器,即TIM1,内核配置的时候使用中断控制器为xInterruptController,必须基于此对象配置UART、AXIDMA
  3. 考虑到不定长的数据帧,用循环缓冲区+消息队列实现数据传递
  4. lwip_init的调用采用官方例子sys_thread_new创建的子任务实现,并在初始化后在子任务创建NET相关任务,之后删除任务本身
  5. 解帧函数,构建parser对象、单字节解析,使用状态机
posted @ 2025-07-31 09:30  gramming  阅读(370)  评论(0)    收藏  举报