下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

使用 GNURX (GCC) 和 HEW IDE 的 Renesas RX62N 演示
包括嵌入式 Web 服务器示例
[嵌入式以太网示例]



Renesas RX62N 入门套件 (RSK)



Renesas RX62N 演示套件 (RDK)

此文档页面记录了 Renesas RX62N FreeRTOS 移植,该移植使用 GNURX GCC 工具 和 Renesas HEW IDE。 FreeRTOS 下载内容中包含的演示应用程序 对应两种标准开发板: Renesas RX62N 入门套件 (RSK) Renesas RX62N 演示套件 (RDK)。

请注意,需要使用 10.03 及以上版本的 GNURX。

演示应用程序也可用于 IARRenesas 编译器

演示应用程序中包括一个示例 Web 服务器,该服务器使用修改过的 Adam Dunkels 开源 微型 uIP TCP/IP 堆栈。 修改后的版本名为 FreeTCP,与原本的代码相比, 吞吐量高于原始代码可实现的吞吐量。 CGI 脚本用于加载包含 RTOS 和 TCP/IP 运行时间信息的页面。 uIP 与 FreeRTOS 分开授权。 用户必须熟悉 uIP 许可,详见每一个 uIP 源文件的顶部。


重要!使用 GCC RX62N 移植和 Web 服务器演示的注意事项

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

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

源代码组织

RDK 和 RSK 开发板的 HEW 工作区称为 RX600_RX62N_RDK_GNURX.hwsRX600_RX62N_RSK_GNURX.hws,分别位于 FreeRTOS/Demo/RX600_RX62N-RDK_GNURXFreeRTOS/Demo/RX600_RX62N-RSK_GNURX 目录中 (位于 FreeRTOS 主下载页面)。

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


RX62N 演示应用程序

功能

HEW 工作区包含三个构建配置:

构建配置 描述
Blinky 该配置是一个非常简单的示例 ,只创建了两个任务。 任务 通过队列进行通信,每当从队列接收预期值, 就会切换 LED 。 Blinky 构建配置包括 main-blinky.c,其他两个构建配置 main-full.c
Debug 该配置是一个全面得多的演示,会创建近50个任务。 应用程序运行时, 会额外重复创建并删除两个任务。任务主要包括 标准演示任务。这类任务不执行任何 除了测试移植(包括中断嵌套)和演示如何使用 FreeRTOS API 之外的特定功能。 额外创建的任务信息已直接附于此表下方。
Debug_with_optimisation 这与 “Debug” 配置相似,但添加了一个高频定时器测试, 并测试打开优化器时任务和测试能否正确执行。

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

  • 检查任务

    此任务每五秒执行一次,但优先级最高,保证能够获得 CPU 时间。 其主要函数是检查所有标准演示任务是否仍在运行。检查任务 负责维护状态字符串。该字符串可以在内置 Web 服务器提供的“任务统计”页面底端查看。 如果使用 RSK ,会切换到 LED5 ;如果使用 RDK ,则切换到 LED9。 如果由该检查任务控制的 LED 每五秒钟切换一次,则所有 演示任务正在执行,而没有报告任何错误。 如果切换频率增加到每 每 200 毫秒切换一次,则说明在至少一个任务中检测到一个错误。

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

  • uIP 任务

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

  • Reg 测试任务

    这两个任务均用已知值填充微控制器寄存器, 接着检查每个寄存器是否仍包含写入的预期值。 两项任务分别 使用不同的已知值。 这些任务的优先级很低,因此 会经常被其他任务抢占。 如果一个寄存器包含一个意外值,则说明出现了一个错误, 上下文切换或中断机制中。 寄存器测试任务应直接写入寄存器,因此以汇编代码写入。

  • 高频定时器测试

    此测试配置一个定时器,生成一个频率为 20 KHz 的中断。 中断优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,因此 不会受到 RTOS 内核正在执行的任何操作的影响。 中断定时中的抖动可以测量, 并且显示在内置 Web 服务器提供的“运行时间统计”页面底端。


Web 服务器配置

RX62N 开发板使用的 IP 地址由常量 configIP_ADDR0 设置为 configIP_ADDR3。 这些常量 由所选项目目录中的 FreeRTOSConfig.h 头文件指定。 定义 MAC 地址和网络掩码的常量位于同一文件的相同位置。

Web 浏览器和 RX62N 开发板使用的 IP 地址必须兼容。 要保证这一点,可以使二者使用的 IP 地址的前三个八进制数相同。 例如,如果运行浏览器的电脑使用的 IP 地址 192.168.0.1 ,则可以为 RX62N 开发板指定 192.168.0.2 至 192.168.0.254 范围内的任意地址 (同一网络上已经存在的地址除外)。

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


构建和执行演示应用程序

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

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

  3. 在 HEW IDE 中打开工作区,按照说明 在项目打开时连接到目标接口。

  4. 从 HEW "Build" 菜单中选择 "Build" ,演示应用程序即可无错构建。

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


演示应用程序应表现如下(若 RSK 的 LED 编号正确, RDK 的括号内编号正确):

  • LEDs LED0、LED1 和 LED2 ( RDK 上的LED4、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_GNURX/RTOSDemo/FreeRTOSConfig.hFreeRTOS/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/FreeRTOSConfig.h,分别适用于 RSK 和 RDK 硬件。 可对 确保适合您的应用程序。 尤其是以下常量:
  • configTICK_RATE_HZ

    可通过该常量设置 RTOS tick 的频率。 提供的数值 1 KHz 可用于 测试 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)

可以使用标准 GNURX GCC 编译器语法编写中断。 例如,演示应用程序定义 高频定时器的使用:
/* Function prototype. */
static void prvTimer2IntHandler( void ) __attribute__((interrupt));

/* Function definition. */
static void prvTimer2IntHandler( void )
{
    /* ISR implementation goes here.  This is the highest priority interrupt in
    the demo, so interrupts are just left disabled. */
}

通常, ISR 希望触发上下文切换,这样, ISR 完成时返回的任务就与 ISR 最初中断的任务不同。 如果 ISR 导致某个任务解除阻塞, 并且被解除阻塞的任务与已处于运行状态的任务相比具有更高的优先级, 就属于这种情况。 这 可以通过调用 portYIELD_FROM_ISR() 来实现,该函数采用单个参数。 如果不需要上下文切换,则参数必须为 0 ; 如果需要上下文切换,则参数不得为 0 。 下列代码演示了上述内容: 级联 8 位定时器 0 和定时器 1 后,二者比较匹配中断的处理程序。

/* Function prototype. */
static void vT0_1_InterruptHandler( void ) __attribute__((interrupt));

/* Function definition. */
void vT0_1_InterruptHandler( void )
{
long lHigherPriorityTaskWoken;

    /* Enable interrupts to allow interrupt nesting. */
    __asm volatile( "SETPSW	I" );

    /* 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() 的函数,该函数使用所选外围设备配置嘀嗒中断, 然后将 vTickISR() 安装 到中断向量表内的相应位置。

建议使用比较匹配定时器来生成嘀嗒中断。 例如,vApplicationSetupTimerInterrupt() 的实现使用了比较匹配定时器 0, 包含在此演示应用程序的 main-full.cmain-blinky.c 中。 然后,Vects.c(也包含在演示应用程序中)将在 CMTU0_CMT0 矢量中安装 vTickISR()(偏移量 0x70)。 建议在大多数情况下使用所提供的示例实现。


在抢占式和协同式 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.