下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

PIC24 MCU 和 dsPIC® DSC RTOS 移植
[RTOS 移植]



此页介绍了 FreeRTOS 移植和演示应用程序, 用于 Microchip' 的 16 位微控制器产品。

提供了两个演示应用程序,一个预配置为用于 PIC24FJ128GA010, 另一个用于 dsPIC33FJ256GP710。 这两个演示都面向 Explorer16 开发板(如果您想使用其他开发板,可以参考说明) 并使用 MPLAB® C30 编译器MPLAB ICD 2 调试/编程接口

FreeRTOS V4.3.0(及更高版本)的下载文件中加入了对 dsPIC 和 PIC24 移植和演示的修改,具体如下:

  • 现已将演示项目配置为使用 MPLAB C30 编译器的 V3.0 版本进行构建。
  • 已引入配置宏 configKERNEL_INTERRUPT_PRIORITY,以允许更灵活的中断管理。 更多详细信息请参阅本页的“配置和使用详细信息”章节 。
  • 演示应用程序已经更新,以便使用 Explorer16 LCD。


重要提示!PIC24 和 dsPIC DSC 移植使用说明

使用此 RTOS 移植之前,请阅读以下所有要点。

  1. 源代码组织
  2. 演示应用程序
  3. 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?

源代码组织

FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码,因此包含的文件比此演示使用的文件更多。 请参阅源代码组织部分,查看 下载文件的描述和有关创建新项目的信息。

PIC24 移植的 MPLAB 演示应用程序工作区称为 RTOSDemo.mcw ,可在 FreeRTOS/Demo/PIC24_MPLAB 目录中找到。

dsPIC DSC 移植的 MPLAB 演示应用程序工作区也称为 RTOSDemo.mcw,可在 FreeRTOS/Demo/dsPIC_MPLAB 目录中找到。


演示应用程序

本节内容与 PIC24 和 dsPIC DSC 演示应用程序有关。


演示应用程序硬件设置

所有 Explorer 16 跳线都可以保留在默认位置,特别是,应配备 JP2 以确保 LED 能正确运作。

演示应用程序包括经由 UART2 发送和接收字符的任务。 一个任务发送的字符必须由另一个任务接收, 如果丢失了任何字符或接收顺序错误,则应标记一个错误条件。 需要将环回连接器连接到 Explorer16 的 9 路 D 型插口上, 才能运行此机制(插口的引脚 2 和 3 应连接在一起)。 默认情况下不使用 UART 本身的内部环回模式。

演示应用程序使用内置在原型板上的 LED ,因此不需要其他硬件设置。


功能

演示应用程序可创建 14 个任务(包括空闲任务)、5 个协程和一个高频中断测试。 正确执行时,演示设置如下:
  • 标记为 D3 至 D7 的 LED 由 "flash" 协程控制。 每个 LED 将以恒定频率闪烁,LED D3 的频率最高, LED D7 的频率最低。 这个基本示例演示了如何将协程与任务混合。

  • 串行端口上每传输一个字符, LED D9 都会切换。 该频率使您无法区分字符之间的每一次切换, 尽管您可以查看完整消息传输之间的间隔。

  • 每当在串行端口上接收和验证字符时, LED D10 都会闪烁(通过环回连接器)。 同样,由于频率太高, 无法区分每一次切换。

  • 大多数任务不会更新 LED ,因此没有明确迹象表明它们运行正常。 因此,创建了一个“检查”任务,用于确保在其他任务或协程中 没有检测到任何错误。 检查任务每三秒钟监控一次系统运行,然后向 LCD 写入 PASS 或 FAIL 消息。 任何失败都会被 锁定,显示的消息指示检测到故障的任务(可以通过在演示执行时移除环回连接器来测试此功能)。 如下一个要点所述,PASS 消息是一个时间度量,以纳秒为单位。

  • 使用一个自由运行的定时器 生成的高频周期性中断,来演示 configKERNEL_INTERRUPT_PRIORITY 配置常数的使用。 中断 服务程序测量每个中断之间发生的处理器时钟的数量, 从而测量中断计时的 抖动。 测得的最大抖动时间锁定在 usMaxJitter 变量中, 并如上所述,通过“检查”任务显示在 LCD 上。 中断频率设置为 20KHz。 此测试演示如何配置 RTOS 内核,使其不会影响中断服务程序的延迟。

  • 该应用程序还演示了如何使用“网关守卫”任务,在这种情况下使用的是 LCD 网关守卫。 LCD 任务是唯一 被允许直接访问 LCD 的任务。 其他任务要向 LCD 写入消息,需将消息发送到一条队列中,然后再向 LCD 任务发送该队列,而不是 直接访问 LCD。 LCD 任务只在队列中阻塞, 等待消息,在消息到达时唤醒,并显示消息。


构建和执行演示应用程序

这些说明假设您的主机计算机上已正确安装了 MPLAB 和 MPLAB C30 编译器。


要构建应用程序:

  1. 在 MPLAB IDE 中打开演示应用程序工作区。
  2. 在 IDE 中的 “Project” 菜单中,选择 “Build Options”,然后选择 “Project”。 将打开项目选项对话框。
  3. 编辑 “Include Path” 文本框中的路径以正确安装 FreeRTOS。 例如,如果您已安装 d:FreeRTOS 目录下的 FreeRTOS 源代码,则使用此路径代替默认的 c:DevFreeRTOS


    所包含的路径选项,其中包括到达所需目录的绝对路径

  4. 在 “Project” 菜单中,选择 “Build All”。 项目的构建应该不会报错或出现警告。


要在 MPLAB 模拟器中运行应用程序:

  1. 在 MPLAB IDE 中的 “Debugger” 菜单中,选择 “Select Tool”,然后选择 “MPLAB SIM”。
  2. 在 main() 函数(包含在 main.c 中)中设置第一个指令的断点。
  3. 在 “Program” 菜单中,选择 “Run'”。 应用程序将开始执行,并在达到断点时停止。 应用程序可以 使用标准调试器命令进行操作。
在模拟器内执行时,标准 ComTest 接收任务将不会接收任何字符(没有环回连接器),导致 “检查”任务在通信测试任务中检测到一个错误。


要使用 ICD 2 接口调试 Explorer 16 上的应用程序:

  1. 按照 Explorer 16 手册中的说明,将 ICD 2 连接到 Explorer 16 开发板。
  2. 在 MPLAB IDE 的 “Debugger” 菜单中,选择 “'Select Tool” ,然后选择 “MPLAB ICD 2”。
  3. 在 MPLAB IDE 的 “'Select Tool” 菜单中,选择 “Connect”。 这将在 MPLAB 和 ICD 2 设备之间生成连接。
  4. 依然在 “Debugger” 菜单中选择 “Program”,将演示应用程序和调试桩编程到微控制器闪存中。
  5. 在 main() 函数(包含在 main.c 内)中设置第一个指令的断点。
  6. 在 “Program” 菜单中,选择 “Run'”。 应用程序将开始执行,并在达到断点时停止。 应用程序可以 使用标准调试器命令进行操作。


在微控制器闪存中独立运行应用程序:

  1. 按照 Explorer 16 手册中的说明,将 ICD 2 连接到 Explorer 16 开发板。
  2. 在 MPLAB IDE 的 “Programmer” 菜单中,选择 “'Select Programmer” ,然后选择 “MPLAB ICD 2”。
  3. 依然在 MPLAB IDE 的 “Programmer” 菜单中,选择 “'Program”。 这会将演示应用程序编程到微控制器闪存中。
  4. 从 Explorer 16 板上拔下电源,然后拔下 ICD 2 接口电缆。
  5. 最后,再次通电以开始执行应用程序。

配置和用法详情


RTOS 移植特定配置

此移植的特定配置项目位于 FreeRTOS/Demo/[PIC24_MPLAB | dsPIC_MPLAB]/FreeRTOSConfig.h 中。 可编辑此文件中定义的常量, 在本文件中定义的常量,以适配您的应用程序。 特别是-
  • configTICK_RATE_HZ

    可通过该常量设置 RTOS tick 的频率。演示项目提供的数值 1000 Hz 可用于测试 RTOS 内核功能, 但高于大多数应用程序所要求的频率。降低此值可提高效率。

  • configKERNEL_INTERRUPT_PRIORITY

    此常量设置了 RTOS 内核使用的中断优先级。RTOS 内核应使用低中断优先级,以允许更高优先级的中断不受 RTOS 内核进入临界区的影响。临界区不是全局禁用中断,而是仅禁用 低于 RTOS 内核中断优先级的中断。

    因此中断处理非常灵活:

    1. 在 RTOS 内核的优先级上,可以根据系统中的任何其他任务编写中断处理“任务”并设置优先级。 这些是被中断唤醒的任务。编写的中断服务程序 (ISR) 本身应尽可能短小 ——它只获取数据,然后唤醒高优先级处理程序任务。然后 ISR 直接返回到被唤醒的 处理程序任务——因此,中断处理在时间上是连续的,就像所有处理都是在 ISR 本身中完成的一样。这样的好处是, 在处理程序任务执行期间,所有中断都保持启用状态。

    2. ISR 运行在 RTOS 内核的优先级之上,不会被 RTOS 内核本身屏蔽,因此其响应度不会受到 RTOS 内核功能的影响。但是,此类 ISR 无法使用 FreeRTOS API 函数。此演示中的快速定时器中断测试 演示了此配置。

    不幸的是,由于 GCC 内联汇编程序的限制, 修改该值需要对与中断掩码(由内联汇编程序指令访问)有关的移植源代码进行小更新。 移植源代码中包含一个 #error 指令,用于指示所需更新的位置,并提供所需更新的指令。

每个移植会定义 (#define) 'BaseType_t' 为该处理器的最有效数据类型。 本端口将 BaseType_t 定义为短整型。

请注意,vPortEndScheduler() 尚未实现。


设备特定配置

用于特定目标微控制器的 MPLAB C30 头文件应位于 FreeRTOSConfig.h 顶部。

MPLAB 项目必须分别为 PIC24 或 dsPIC DSC 目标定义 MPLAB_PIC24_PORT 或 MPLAB_DSPIC_PORT。 MPLAB C30 构建选项的 “宏定义”部分为该定义提供了一个方便的位置。


中断服务程序

不会引起上下文切换的中断服务程序没有特殊要求,可以按照编译器文档编写。

可以引起上下文切换的中断服务程序必须以优先级 portKERNEL_INTERRUPT_PRIORITY 执行, 并且只能在中断源被清除,在服务程序的最末端调用 taskYIELD()。 如需示例,请参阅演示应用程序中包含的文件 serial.c。


临界区

退出临界区会始终将中断优先级掩码设置为 0(所有中断均已启用),无论在进入临界区时的 级别为何。 FreeRTOS API 函数本身将使用临界区。


Shadow 寄存器

Shadow 寄存器不会被保存为任务上下文的一部分。


PSV 位处理

必须为每个任务设置同等的 CORCON 寄存器中的 PSV 位。 如果需要更改默认位设置,则必须在 创建任何任务之前进行。


在抢占式和协同式 RTOS 内核之间切换

FreeRTOS/Demo/[PIC24_MPLAB | dsPIC_MPLAB]/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1 即可使用抢占式, 或设置为 0,则可使用协作式。 如果 configIDLE_SHOULD_YIELD 设置为 1,则仅当 configUSE_PREEMPTION 设置为 0 时,演示应用程序才会正确执行 。


编译器选项

与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点, 最佳方法是基于提供的演示应用程序文件构建您的应用程序。


内存分配

PIC24 和 dsPIC DSC 演示应用程序项目中内置 ource/Portable/MemMang/heap_1.c, 以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。


串行端口驱动器

此外还需注意的是,编写串行驱动程序是为了测试部分实时内核功能,并不是 用于表示优化过的解决方案。






Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.