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 移植之前,请阅读以下所有要点。
- 源代码组织
- 演示应用程序
- 配置和使用详情
另请参阅常见问题:
我的应用程序未运行,问题可能出在哪里?
源代码组织
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 编译器。
要构建应用程序:
- 在 MPLAB IDE 中打开演示应用程序工作区。
- 在 IDE 中的 “Project” 菜单中,选择 “Build Options”,然后选择 “Project”。 将打开项目选项对话框。
- 编辑 “Include Path” 文本框中的路径以正确安装 FreeRTOS。 例如,如果您已安装
d:FreeRTOS 目录下的 FreeRTOS 源代码,则使用此路径代替默认的 c:DevFreeRTOS。
所包含的路径选项,其中包括到达所需目录的绝对路径
- 在 “Project” 菜单中,选择 “Build All”。 项目的构建应该不会报错或出现警告。
要在 MPLAB 模拟器中运行应用程序:
- 在 MPLAB IDE 中的 “Debugger” 菜单中,选择 “Select Tool”,然后选择 “MPLAB SIM”。
- 在 main() 函数(包含在 main.c 中)中设置第一个指令的断点。
- 在 “Program” 菜单中,选择 “Run'”。 应用程序将开始执行,并在达到断点时停止。 应用程序可以
使用标准调试器命令进行操作。
在模拟器内执行时,标准 ComTest 接收任务将不会接收任何字符(没有环回连接器),导致
“检查”任务在通信测试任务中检测到一个错误。
要使用 ICD 2 接口调试 Explorer 16 上的应用程序:
- 按照 Explorer 16 手册中的说明,将 ICD 2 连接到 Explorer 16 开发板。
- 在 MPLAB IDE 的 “Debugger” 菜单中,选择 “'Select Tool” ,然后选择 “MPLAB ICD 2”。
- 在 MPLAB IDE 的 “'Select Tool” 菜单中,选择 “Connect”。 这将在 MPLAB 和 ICD 2 设备之间生成连接。
- 依然在 “Debugger” 菜单中选择 “Program”,将演示应用程序和调试桩编程到微控制器闪存中。
- 在 main() 函数(包含在 main.c 内)中设置第一个指令的断点。
- 在 “Program” 菜单中,选择 “Run'”。 应用程序将开始执行,并在达到断点时停止。 应用程序可以
使用标准调试器命令进行操作。
在微控制器闪存中独立运行应用程序:
- 按照 Explorer 16 手册中的说明,将 ICD 2 连接到 Explorer 16 开发板。
- 在 MPLAB IDE 的 “Programmer” 菜单中,选择 “'Select Programmer” ,然后选择 “MPLAB ICD 2”。
- 依然在 MPLAB IDE 的 “Programmer” 菜单中,选择 “'Program”。 这会将演示应用程序编程到微控制器闪存中。
- 从 Explorer 16 板上拔下电源,然后拔下 ICD 2 接口电缆。
- 最后,再次通电以开始执行应用程序。
RTOS 移植特定配置
此移植的特定配置项目位于
FreeRTOS/Demo/[PIC24_MPLAB | dsPIC_MPLAB]/FreeRTOSConfig.h 中。 可编辑此文件中定义的常量,
在本文件中定义的常量,以适配您的应用程序。 特别是-
- configTICK_RATE_HZ
可通过该常量设置 RTOS tick 的频率。演示项目提供的数值 1000 Hz 可用于测试 RTOS 内核功能,
但高于大多数应用程序所要求的频率。降低此值可提高效率。
- configKERNEL_INTERRUPT_PRIORITY
此常量设置了 RTOS 内核使用的中断优先级。RTOS 内核应使用低中断优先级,以允许更高优先级的中断不受
RTOS 内核进入临界区的影响。临界区不是全局禁用中断,而是仅禁用
低于 RTOS 内核中断优先级的中断。
因此中断处理非常灵活:
- 在 RTOS 内核的优先级上,可以根据系统中的任何其他任务编写中断处理“任务”并设置优先级。
这些是被中断唤醒的任务。编写的中断服务程序 (ISR) 本身应尽可能短小
——它只获取数据,然后唤醒高优先级处理程序任务。然后 ISR 直接返回到被唤醒的
处理程序任务——因此,中断处理在时间上是连续的,就像所有处理都是在 ISR 本身中完成的一样。这样的好处是,
在处理程序任务执行期间,所有中断都保持启用状态。
- 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.