下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

使用 Renesas 编译器和 IDE 的Renesas RX62N & RX63N
包括一个嵌入式 web 服务器示例
[嵌入式以太网示例]



Renesas RX62N 入门套件 (RSK)



Renesas RX62N 演示套件 (RDK)

本页展示 Renesas RX62N 和 Renesas RX63N 的 FreeRTOS 移植和演示应用程序,两者使用的是 Renesas RX 编译器 和 HEW IDE。 提供的 RX62N 项目针对的是 Renesas RX62N 入门套件 (RSK) 和 Renesas RX62N 演示套件 (RDK) 开发板。 还提供一个 RX63N 项目, 针对的是 RX63N RDK

请注意,需要使用 1.0.1.0 或更高版本的编译器。

IARGCC 编译器也可使用演示应用程序。

演示中包含一个示例 web 服务器,它是使用修改版本的 Adam Dunkels 开源 uIP 嵌入式 TCP/IP 协议栈实现的。 修改后的版本名为 FreeTCPIP,与原本的代码相比, 可实现更高的吞吐量。 CGI 脚本功能 用于显示 RTOS 和 TCP/IP 运行时间信息。 uIP 与 FreeRTOS 分开授权。 用户必须熟悉 uIP 许可,详见每一个 uIP 源文件的顶部。


重要!使用 RenesasRX62N 移植和 web 服务器演示的注意事项

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

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

源代码组织

RX62N RSK 和 RDK 开发板的 HEW 工作区的名称都是 RTOSDemo.hws,分别位于 FreeRTOS/Demo/RX600_RX62N-RSK_RenesasFreeRTOS/Demo/RX600_RX62N-RDK_Renesas 目录。

RX63N RDK 开发板的 HEW 工作区名称也是 RTOSDemo.hws,位于 FreeRTOS/Demo/RX600_RX63N-RDK_Renesas 目录。

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


RX62N & RX63N 演示应用程序

功能

应用程序提供三种构建配置:

构建配置 描述
Blinky 该配置是一个非常简单的示例 ,只创建了两个任务。 任务 通过队列进行通信,每次队列接收成功后 都会切换 LED。 Blinky 的构建配置 包括 main-blinky.c,其他的构建配置 则使用 main-full.c
Debug 一个非常全面的演示,在启动 RTOS 调度器之前创建近 50 个演示任务,然后在应用程序执行期间, 持续动态创建和删除另外两个任务。任务主要 包括标准演示任务,此任务不执行其他功能, 仅用于测试移植(包括中断嵌套)并演示 FreeRTOS API 的使用方法。 此表格下方提供创建的其他任务的信息。
Debug_with_optimisation 为 Debug 构建配置执行的任务和测试添加一个高频定时器测试,并测试 在优化程序打开时,任务和测试是否正确执行。

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

  • 检查(Check)任务

    此任务每 5 秒钟执行一次,但拥有最高的优先级以确保其拥有处理时间。 它的主要功能是检查所有标准演示任务是否仍可使用。检查任务 维护一个状态字符串,可在内建的 web 服务器提供的 "Task Stats" 页面底部查看该字符串。 它还会切换 LED5 (RSK) 或 LED9 (RDK)。 如果检查 LED 每 5 秒钟切换一次, 那么说明所有演示任务均在执行,且没有报告任何错误。 如果切换频率提高到 每 200 毫秒切换一次,则说明在至少一个任务中检测到一个错误。

    一些任务执行检查来确保自己的执行时间未超过固定限制。但执行的任务接近 50 个, 因此有时这些限制被突破时会导致报错,然而实际上并不存在任何错误。 如果 20KHz 中断也在运行,那么时间限制将承受 更大的压力。 因此,出现报错并不一定说明 FreeRTOS 移植中真的存在错误,有可能只是表明 一个任务得到的 CPU 时间不足以使其保持在(自行施加的)紧迫的时间限制内。

  • uIP 任务

    此任务执行 TCP/IP 协议栈。 所有网络处理都在此任务中执行,因此 TCP/IP 与其他嵌入式 TCP/IP 协议栈相比,闪存占用空间极小。

  • Reg 测试任务

    在检查每个寄存器仍包含预期值之前, 这两个 reg 测试任务在微控制器的寄存器中填入已知值。 两个任务 使用不同的已知值。 这些任务的优先级很低,因此 会经常被其他任务抢占。 如果一个寄存器包含一个意外值,则说明出现了一个错误, 错误可能存在于上下文切换或中断机制中。 reg 测试任务直接写入特定的寄存器中, 因此必须以汇编代码编写。

  • 高频定时器测试

    此测试配置一个定时器,生成一个频率为 20 KHz 的中断。 中断优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,因此 不会被 RTOS 内核正在执行的任何操作影响。 中断定时中的抖动被测量, 并显示在内建的 web 服务器提供的 "Run Time Stats" 页面的底部。


Web 服务器配置

RX62N 使用的 IP 地址由常量 configIP_ADDR0 至 configIP_ADDR3 设置。 它们位于 所选项目目录中 FreeRTOSConfig.h 头文件的底部。 定义 MAC 地址和子网掩码的常量也位于上述文件中。

浏览器和 RX62N 开发板使用的 IP 地址必须兼容。 要保证这一点,可以使二者使用的 IP 地址的前三个八进制数相同。 例如,如果运行浏览器的电脑使用的 IP 地址 是 192.168.0.1,那么 RX62N 开发板 的 IP 地址可以位于 192.168.0.2 至 192.168.0.254 之间, 同一网络上已存在的地址除外。

为 RX62N 分配的 MAC 地址 必须是其所连接的网络上唯一的。


构建和执行演示应用程序

  1. 直接使用点对点(交叉)电缆,或使用标准以太网电缆通过集线器或交换机,将所选开发板连接到运行 浏览器的电脑上(仅测试了使用点对点电缆的方式,但两种方式应该都可行)。

  2. 打开项目之前——如果使用的是 RSK 开发板,用一个 E1 JTAG 接口(包含在 RSK 套件中)将 RSK 连接到主机, 然后再接通电源。 如果使用的是 RDK 开发板,只需将 RDK 上标有 J-Link 的 Micro USB 插槽 与主机相连,无需单独电源。 打开项目时,HEW 会尝试连接到所选的开发板。

  3. 从 HEW IDE 中打开所选的 RTOSDemo.hws 工作区——打开项目时,按照以下说明 连接到目标接口。

  4. 从 HEW 的 "Build" 菜单中选择 "Build"。演示应用程序应当正常构建而不会报错,尽管会产生一些 [看似莫名的]依赖错误和[错误的]警告,但不会影响构建。

  5. 构建完成后会出现一个对话框,询问是否要将创建的二进制下载到 微控制器的闪存中。选择 "yes" 以对闪存进行编程并启动一个调试会话。


执行中的演示应用程序应表现如下(LED 编号针对 RSK, 括号内编号针对 RDK):

  • LED LED0、LED1 和 LED2( RDK 上的 4、5 和 6)由标准 "flash" 任务控制。 每个 LED 将以不同的固定频率切换。

  • LED5(RDK 上的 9)由 "check" 任务控制。如果没有检测到错误,将每 5 秒切换一次。

  • LED3 和 LED4 (RDK 上的 11、12、13 和 14)可以使用内建的 web 服务器提供的 IO 页面以交互方式打开、关闭。

  • 内建的 web 服务器将向一个标准浏览器提供下文所述的网页。 要连接到目标,请执行下列操作:

    1. 在连接的计算机上打开浏览器。
    2. 先在浏览器地址栏中输入 "HTTP://",再输入目标 IP 地址。


      在浏览器中输入 IP 地址
      (当然,根据您的系统,使用正确的 IP 地址)
该演示未使用 LCD。


提供的网页

提供的每个页面顶部都有一个菜单,内含指向其他各页面的链接。

RX62N Web 服务器提供的 RTOS 统计信息页面
可显示系统中各任务的状态信息。


RX62N Web 服务器提供的运行时间统计页面
可显示各任务的处理器利用率。


提供的 IO 页面

可利用 IO 页面提供的简单界面,通过浏览器打开和关闭各种 LED。 LED 编号仅在 RSK 中正确。 单击 "Update IO" 按钮时,将变更发送到目标板。

其他提供的页面包括 TCP/IP 统计数据和大型 JPG 图像。 所有网页都包含在下载的 二进制图像中,这会使得二进制图像看起来相当大(jpg 文件本身超过 36K)。



RTOS 配置和使用详情


RX62N RTOS 移植特定配置

此演示的特定配置项目位于 FreeRTOS/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h(使用 RSK), 或 FreeRTOS/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo/FreeRTOSConfig.h(使用 RDK)。 可以编辑这些文件中 确保适合您的应用程序。 尤其是以下常量:
  • configTICK_RATE_HZ

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

  • configKERNEL_INTERRUPT_PRIORITY

    定义了 RTOS 内核用于定时器和软件中断的中断优先级。 应始终将其设置为 最低中断优先级,RX62N 中,最低优先级为 1。 请参阅 配置页面,了解详细信息。

  • configMAX_SYSCALL_INTERRUPT_PRIORITY

    定义了可以调用 FreeRTOS API 函数的最高中断优先级。 等于或低于该优先级的中断可以调用 FreeRTOS API 函数 ,前提是该 API 函数以 "FromISR" 结尾。 高于该优先级的中断 无法调用任何 FreeRTOS API 函数,但不会受到 RTOS 内核正在执行的任何操作的影响。 因此, 它们适用于对时间精度要求极高的功能。 此演示应用程序中的高频定时器测试 的优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY。 请参阅 配置页面,了解详细信息。

RX62N 移植层使用 #define 将 "BaseType_t" 定义长整型。


编写中断服务程序 (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 导致某个任务解除阻塞, 并且被解除阻塞的任务与已处于运行状态的任务相比具有更高的优先级, 就属于这种情况。 这 可以通过调用 portYIELD_FROM_ISR() 来实现,该函数采用单个参数。 如果不需要上下文切换,则参数应当为 0 ; 如果需要上下文切换,则参数不得为 0 。 下列代码演示了上述内容: 级联 8 位定时器 0 和定时器 1 后,二者比较匹配中断的处理程序。

/* 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 ( vT0_1InterruptHandler( vect = VECT_TMR0_CMIA0, enable ) )
void vT0_1InterruptHandler( void )
{
long lHigherPriorityTaskWoken;

    /* xFirstTimerHandler() 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. */
    lHigherPriorityTaskWoken = xFirstTimerHandler();
    portYIELD_FROM_ISR( lHigherPriorityTaskWoken );
}


FreeRTOS 使用的资源

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

应用程序必须定义一个名为 vApplicationSetupTimerInterrupt() 的函数 来配置滴答中断,然后定义 configTICK_VECTOR 来向 RTOS 内核通知 选择的计时器的中断向量号。

建议使用比较匹配定时器来生成滴答中断, 例如,vApplicationSetupTimerInterrupt() 的实现使用了比较匹配定时器 0, 包含在此演示应用程序的 main-full.cmain-blinky.c 中。 演示应用程序将 FreeRTOSConfig.h 中的 configTICK_VECTOR 定义为 _CMT0_CMI0(比较 匹配 0 中断向量号)。 在大多数情况下, 建议使用所提供的示例实现。


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

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


编译器选项

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


内存分配

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


其他事项

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




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