下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Renesas RX200 演示
使用 Renesas 编译器 和 HEW IDE
[RTOS 移植]



Renesas RX210 入门套件 (RSK)

本页面记录 Renesas RX210 FreeRTOS 移植以及使用 Renesas RX 编译器 和 HEW IDE 的演示应用程序。 该项目被预置为在 RSKRX210 入门套件上运行。

此演示应用程序会演示以下几个方面:



重要提示!关于使用 Renesas RX200 移植和演示应用程序的说明

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

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



源代码组织

RSK 开发板的 HEW 工作区名为 RTOS Demo.hws,位于 FreeRTOS/Demo/RX200_RX210-RSK_Renesas 目录。

FreeRTOS zip 文件下载内容包含所有 FreeRTOS 移植的实现和每个官方 演示应用程序项目。因此,包含的文件比此演示使用的文件多。请参阅 源代码组织部分,获取 下载文件的描述和有关创建新项目的信息。



RX210 演示应用程序

功能

该项目包括三项构建配置:

构建配置 描述
Blinky 这是一个非常简单的示例 ,它创建了两个任务和 一个队列。 任务间 通过队列通信, 每当队列成功接收消息时,LED 状态都会切换。 Blinky 构建配置的 main() 函数定义于 main-blinky.c。 另外两个构建配置的 main() 函数 定义于 main-full.c
Debug 该演示非常全面, 在启动 RTOS 调度器之前创建了 50 个任务, 随后在应用程序执行过程中,持续动态创建和删除另外两个任务。它还创建 许多队列和不同类型的信号量。 任务主要 包括标准演示任务,此任务 仅测试移植和演示 FreeRTOS API 的使用方法,并不执行其他特定功能。 此表格下方提供创建的其他任务的信息。 Debug 构建配置包括标准演示任务,该任务演示 中断嵌套,但不包含高频定时器中断。
Debug_with_optimisation 该示例与 Debug 构建配置相似,但包含 高频定时器中断。 该构建配置还对 编译器进行最大优化。

Debug 和 Debug_with_optimisation 构建配置除了创建标准演示任务之外,还创建了以下任务、定时器和测试:

  • 检查定时器和回调函数

    检查定时器是一种非常简单的监视定时器。它会监视 其他所有标准演示任务和寄存器测试任务(如下所述), 并使用 LED 为系统状态提供视觉反馈。

    检查定时器的周期最初设置为 5 秒。检查 定时器回调函数检查所有标准演示任务和 寄存器测试任务,不仅检查任务是否正在执行,还检查任务是否没有 报告任何错误,然后切换 LED。

    如果检查定时器任务发现某个任务停止,或者报告了 错误,那么它会将自己的周期从最初的 5 秒降低到 只有 200 毫秒。因此,如果 LED 每 5 秒钟切换一次,那么没有发现任何问题, 而如果 LED 每 200 毫秒切换一次,那么 至少有一个任务存在问题。

    检查定时器使用 RSK 丝网上标有 LED3 的LED。

  • 寄存器测试任务

    这两个任务会测试 RTOS 内核上下文切换机制: 首先用已知的唯一值填充各个 RX200 寄存器,然后反复检查 写入寄存器的原始值 是否在整个任务周期内均保持在寄存器中。这些任务以尽可能低的优先级执行 (空闲优先级),因此经常被抢占。这些 任务的性质要求它们必须以汇编语言编写。

  • 高频定时器测试

    此测试配置一个定时器,生成一个频率为 20 KHz 的中断。 中断优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,因此不会 被 RTOS 内核禁用。 中断定时中的抖动被测量 并存储在变量中,可供调试器检查。

  • 按钮输入中断和 LCD 演示

    该演示定义了三个由按钮点击触发的 IRQ 中断处理程序: 一个任务控制 LCD 的顶行,一个任务 控制 LCD 的底行以及一个队列用于 中断处理程序和任务间通信。

    控制 LCD 顶行的任务仅来回滚动消息, 当消息到达 LCD 末端,就改变消息的滚动方向 。

    在按下 SW2 按钮之前,控制 LCD 底行的任务的行为与控制 LCD 顶行的任务相似 。 按下 SW2 按钮生成中断。 中断处理程序使用 上述队列向任务发送指令,命令其暂停或重启 滚动动作。 滚动 暂停时,按下 SW3 和 SW1 按钮导致中断, 进而生成指令。这些指令通过同一个队列发送到任务,命令 任务分别向左和向右移动消息(每次一个字符) 。


演示应用程序执行时表现如下:

  • LED 0、1 和 2 由标准 "flash" 任务控制。 每个 LED 会以不同的固定频率切换:LED 0 的频率最高,LED 2 的频率最低。

  • LED 3 由 'check' 定时器任务控制。 如果其他所有任务报告状态为正常,它将 每 5 秒切换一次。 如有任何任务报告了错误,它将每 200 毫秒切换一次。

  • "http://www.FreeRTOS.org" 将沿着 LCD 顶行从左向右连续滚动,然后从右向左滚动。

  • 描述 RX210 可用功能的长字符串将沿着 LCD 的底行从左向右滚动,然后从右向左滚动, 直到按下 SW2 按钮。 按下 SW2 按钮将暂停滚动,再次按下 SW2 按钮将使字符串再次开始滚动。 当字符串静止时,按下 SW3 按钮会将字符串 向左移动,每次一个字符,而按下 SW1 按钮会将字符串向右移动,每次一个字符。


构建和执行演示应用程序

  1. 打开项目前,使用 RSK 套件提供的 E1 FINE 接口将 RX210 RSK 连接到主机 。 连接之后,给开发板通电。

  2. 在 HEW IDE 中打开 FreeRTOS/Demo/RTOSDemo.hws 工作区,打开项目时,按照提示 连接到目标接口。

  3. 在 HEW 的 "Build" 菜单中选择 "Build",演示应用程序应当成功构建,没有任何实质错误或警告, 尽管预处理器(莫名)查找构建中被预处理器命令省略的头文件时会产生依赖错误, 但这些错误不会影响构建。

  4. 构建完成后会出现一个对话框,询问是否要将生成的二进制文件下载到 RX210 微控制器,选择 "yes" 对闪存进行编程并启动调试会话。 调试器将在进入 main() 函数时中断。



RTOS 配置和使用详情

FreeRTOS RX200 RTOS 移植特定配置

此演示的特定配置项目位于 FreeRTOS/Demo/RX200_RX210-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h。 可以 根据您的应用需求来编辑常量。 特别是:
  • configTICK_RATE_HZ

    设置 RTOS tick 的频率。 提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但它高于大多数应用程序所需的频率。 降低该频率有助于提高效率。

  • configKERNEL_INTERRUPT_PRIORITY

    定义 tick 和 yield 中断的中断优先级 (RTOS 内核中断)。 configKERNEL_INTERRUPT_PRIORITY 通常应设置为 最低中断优先级,在 RX200 内核中为 1。 请参阅 定制页面,了解更多信息。

  • configMAX_SYSCALL_INTERRUPT_PRIORITY

    定义可以据其调用 FreeRTOS API 函数的最大中断优先级。 等于或低于该优先级的中断 可以调用 FreeRTOS API 函数,前提是该 API 函数以 "FromISR" 结尾。 高于此优先级的中断不能调用任何 FreeRTOS API 函数, 但不会被 RTOS 内核禁用。 因此,优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断适用于定时精度要求极高的功能。 此演示中的高频定时器测试 使用的优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY。 请参阅 配置页面,了解更多信息。

RX200 移植层定义 (#define) "BaseType_t" 为 "long"。


编写中断服务程序 (ISR)

可以使用标准 Renesas 编译器语法实现中断服务程序 。 例如,演示应用程序使用以下方法定义高频定时器:
/* The 'enable' in the following line causes the compiler to generate code that
re-enables interrupts on function entry.  This will allow interrupts to nest
(although in this case the high frequency timer interrupt is the highest priority
interrupt in the demo). */
#pragma interrupt ( prvTimer2IntHandler( vect = _VECT( _CMT2_CMI2 ), enable ) )
static void prvTimer2IntHandler( void )
{
    /* ISR implementation goes here. */
}
请参阅 Renesas 提供的示例和编译器文档,了解详细信息。

通常,ISR 想要触发上下文切换,因此当 ISR 处理完成时,ISR 返回的任务不同于 ISR 最初中断的任务。 如果 ISR 导致某个任务被解除阻止, 且该任务的优先级高于处于“运行”状态的任务(被中断的任务), 就会出现这种情况。 为此,我们提供了 portYIELD_FROM_ISR() 宏。 portYIELD_FROM_ISR() 采用单个参数: 如果参数为 零,则不切换上下文;如果参数不为零, 则切换上下文。 下列代码演示了上述内容, 这是 RX210 演示的一部分,并在 FreeRTOS/Demo/RX200_RX210-RSK_Renesas/RTOSDemo/ButtonAndLCD.c 中实现。

/* The 'enable' in the following line causes the compiler to generate code that
re-enables interrupts on function entry.  This will allow interrupts to nest. */
#pragma interrupt ( prvIRQ1_Handler( vect = 65, enable ) )

static void prvIRQ1_Handler( void )
{
static TickType_t xTimeLastInterrupt = 0UL;
static const unsigned char ucCommand = lcdSHIFT_BACK_COMMAND;
BaseType_t xHigherPriorityTaskWoken;

  /* prvSendCommandOnDebouncedInput() returns true or false, depending on
  whether the function unblocked a task that has equal or higher priority than the task
  that is already in the running state. */
  xHigherPriorityTaskWoken = prvSendCommandOnDebouncedInput( &xTimeLastInterrupt,
                                                             ucCommand );
  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}


FreeRTOS 使用的资源

FreeRTOS 需要独占使用软件中断。 FreeRTOS 还需要独占使用定时器,该定时器能够生成周期性嘀嗒中断,但是 要由应用程序编写者定义使用哪个定时器。

应用程序必须定义一个名为 vApplicationSetupTimerInterrupt() 的函数 来配置 tick 中断,然后定义 configTICK_VECTOR 为与所选定时器源相关的中断矢量号 。

建议使用比较匹配定时器来生成 tick 中断, 例如,vApplicationSetupTimerInterrupt() 的实现使用了比较匹配定时器 0, 包含在此演示应用程序的 main-full.cmain-blinky.c 中。 演示应用程序将 FreeRTOSConfig.h 中的 configTICK_VECTOR 定义为 _CMT0_CMI0(比较 匹配 0 中断向量号)。 提供的示例实现可用于 任何自身不需要使用比较匹配 0 定时器/中断的应用程序。


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

RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式调度; 设置为 0 以使用协作式调度。 选择协作式 RTOS 调度器时,完整的演示应用程序可能 无法正确执行。


编译器选项

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


内存分配

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


其他事项

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




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