简介PIC32MX RTOS 移植本页介绍了 FreeRTOS 移植和演示应用程序,针对 PIC32MX—— 来自 Microchip 的具有 MIPS M4K 内核的 32 位微控制器 。FreeRTOS PIC32MX 移植:
FreeRTOS 是 MPLAB Harmony - Microchip' 的集成驱动程序 和中间件包的组成部分。 旧版应用程序说明 (和源代码)也可从 Microchip 网站上获得,其说明了如何将 FreeRTOS 集成到 Microchip' 的现有旧版外设和中间件库。
演示应用程序MPLAB X 和 MPLAB XC32 分别为目前构建 FreeRTOS 演示的首选 IDE 和首选编译器。 MPLAB 8 项目仍然包含在 RTOS 源代码下载中, 但会在未来的某个版本中停用。通过在 MPLAB X 项目中提供多项构建配置,可以预先配置对多个 PIC32 派生品和硬件平台的支持 。 针对下述对象提供的构建配置:
MPLAB 8 项目被预先配置为针对运行在 Explorer 16 评估板上的 PIC32MX360 微控制器 。 各构建配置均可用于构建简单的 blinky 演示或 全面测试和演示应用程序。 综合应用程序展示 并测试中断嵌套行为。 本页提供了构建说明 。
重要提示!PIC32 RTOS 移植使用说明使用此 RTOS 移植之前,请阅读以下所有要点。另请参阅常见问题:我的应用程序未运行,问题可能出在哪里? 源代码组织FreeRTOS 下载包含所有 FreeRTOS 移植的源代码,因此, 包含的文件比 PIC32 演示使用的文件多。 请参阅源代码组织部分, 了解下载文件的描述,以及关于创建新项目的信息。PIC32MX / MIPS 移植的 MPLAB 8 演示应用程序工作区称为 RTOSDemo.mcw,位于 FreeRTOS/Demo/PIC32MX_MPLAB 目录中。 MPLAB X 项目称为 RTOSDemo.X,位于该目录之外。 演示应用程序演示应用程序硬件设置 - Explorer 16所有 Explorer 16 跳线都可以保留在默认位置,特别是,应配备 JP2 以确保 LED 能正确工作。演示应用程序包括经由 UART2 发送和接收字符的任务。 一个任务发送的字符必须由另一个任务接收。 如果丢失了任何字符或接收顺序错误,则会标记错误情况。 需要将环回连接器连接到 Explorer16 9 路 D 型插口上, 才能运行此机制(插口的引脚 2 和 3 应连接在一起)。 默认情况下不使用 UART 本身的内部环回模式。 注意:UART 中断服务程序 (ISR) 使用一个 RTOS 队列从 ISR 发送单个字符到 RTOS 任务,用另外一个 RTOS 队列从 RTOS 任务发送单个字符到 ISR。 用队列 以这种方式发送单个字符非常低效。 提供的 UART 驱动程序 旨在演示从 ISR 使用的队列, 并对 RTOS 移植进行压力测试。 它并不是用来表示一个有效的中断实现。
功能可对演示应用程序进行配置,使其提供非常简单的 "blinky" 样式的功能, 或者提供 RTOS 特性子集的全面测试和演示 。常量 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 定义于 main.c 的头部,用于在上述两项之间切换。演示应用程序任务分为标准演示任务和演示特定 任务。所有 FreeRTOS 移植演示应用程序都使用标准演示任务。 这些任务仅用于演示 FreeRTOS API 和测试移植,不得用作其他用途。
当将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时,mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时,main() 会调用 main_blinky()。 main_blinky () 创建一个非常简单的示例,此示例使用两个 任务、一个队列和一个软件定时器。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时,main() 会调用 main_full()。 main_full() 创建一个非常全面的测试和演示应用程序, 用于创建大量 RTOS 任务和软件定时器。 此演示会在 Explorer 16 和 USB II 入门套件上执行,尽管在入门套件上执行时, 未使用 LCD 和 UART 任务(因为它们在硬件上不可用), 且创建了少量 flash 任务,以允许下述“检查定时器”访问 入门套件硬件上的三个可用 LED 之一。 在 Explorer 16 上执行此演示时,以下描述是正确的。
使用 MPLAB X 构建和调试演示应用程序这些说明假定您已在主机上正确安装了 MPLAB X 和 MPLAB XC32 安装在您的主机上。
配置和用法详情RTOS 移植特定配置此演示的特定配置项目包含在 FreeRTOS/Demo/PIC32MX_MPLAB/FreeRTOSConfig.h 中。 可以编辑 在该文件中定义的常量,以适配您的应用程序。 特别是——
每个移植 #defines 'BaseType_t' 为对该处理器而言最有效的 数据类型。 此移植将 BaseType_t 定义为长类型。 请注意,vPortEndScheduler() 尚未实现。 中断服务程序无法嵌套的断开服务程序没有特殊要求,可以 按照编译器文档编写。 但是,以这种方式编写的中断 将利用被中断的那个任务的堆栈, 而不是系统堆栈, 因此必须为每个创建的任务分配足够的堆栈空间。 因此,不建议以这种方式 写入中断服务程序。可以嵌套的中断服务程序需要一个简单的汇编包装器, 请参阅下文。 建议以这种方式写入所有中断。 PIC32 演示中的 UART 中断可用作示例—— 列表 1 中概述了此演示采用的汇编代码包装器, 列表 2 中概述了相应的 C 函数处理程序:
/* Prototype to be included in a C file to ensure the vector is correctly installed. Note that because this ISR uses the FreeRTOS assembly wrapper the IPL setting in the following prototype has no effect. The interrupt priority is set using the ConfigIntUART2() PIC32 peripheral library call. */ void __attribute__( (interrupt(ipl1), vector(_UART2_VECTOR))) vU2InterruptWrapper( void ); /* Header file in which portSAVE_CONTEXT and portRESTORE_CONTEXT are defined. */ #include "ISR_Support.h" /* Ensure correct instructions is used. */ .set nomips16 .set noreorder /* Interrupt entry point. */ vU2InterruptWrapper: /* Save the current task context. This line MUST be included! */ portSAVE_CONTEXT /* Call the C function to handle the interrupt. */ jal vU2InterruptHandler nop /* Restore the context of the next task to execute. This line MUST be included! */ portRESTORE_CONTEXT .end vU2InterruptWrapper 列表 1: 用于处理可导致上下文切换的中断的汇编代码包装器
关于汇编文件包装器的一些说明:
其次,由汇编文件包装器调用的 C 函数:
void vU2InterruptHandler( void ) { /* Declared static to minimise stack use. */ static BaseType_t xYieldRequired; xYieldRequired = pdFALSE; /* Are any Rx interrupts pending? */ if( mU2RXGetIntFlag() ) { /* Process Rx data here. */ /* Clear Rx interrupt. */ mU2RXClearIntFlag(); } /* Are any Tx interrupts pending? */ if( mU2TXGetIntFlag() ) { /* Process Tx data here. */ /* Clear Tx interrupt. */ mU2TXClearIntFlag(); } /* If sending or receiving necessitates a context switch, then switch now. */ portEND_SWITCHING_ISR( xYieldRequired ); } 列表 2: ISR 中可能导致上下文切换的 C 部分
关于 C 函数的一些说明:
临界区退出临界区将始终设置中断优先级,以便启用所有中断,无论输入临界区时的级别如何 。 FreeRTOS API 函数本身将使用临界区。执行上下文根据 XC32 编译器手册中记录的惯例, RTOS 内核假定所有对 K0 和 K1 寄存器的访问都是原子性的。 由 XC32 编译器生成的代码符合这一惯例,所以如果您只用 C 语言编写应用程序,就无需担心这个问题。 但是,如果使用任何手写的汇编代码,必须注意确保它也符合同样的惯例。Shadow 寄存器中断 Shadow 寄存器未被使用,因此可供主机应用程序使用。 不应在可能导致上下文切换的 中断服务程序中使用 Shadow 寄存器。软件中断RTOS 内核使用 MIPS 软件中断 0。 因此,应用程序无法使用此中断。在抢占式和协同式 RTOS 内核之间切换将 FreeRTOS/Demo/PIC32MX_MPLAB/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式;设置为 0, 可使用协同式。 如果 configIDLE_SHOULD_YIELD 设置为 1,则仅当 configUSE_PREEMPTION 设置为 0 时,演示应用程序才会正确执行 。编译器选项与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点, 最佳方法是基于提供的演示应用程序文件构建您的应用程序。内存分配Source/Portable/MemMang/heap_4.c 包含在 PIC32 演示应用程序项目中, 以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。串行端口驱动器此外还需注意的是,编写串行驱动程序是为了测试部分实时内核功能,并不是 用于表示优化过的解决方案。 特别是,它们大量使用队列机制,不使用可用的 FIFO 或 DMA。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|