下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

使用 IAR Embedded Workbench 的 Renesas RX62N 演示,
包括带有 CGI 脚本的嵌入式 Web 服务器
[嵌入式以太网示例]



Renesas RX62N 入门套件 (RSK)



Renesas RX62N 演示套件 (RDK)

此页面记录了 FreeRTOS/ IAR 移植和演示应用程序,用于 Renesas RX62N 。 FreeRTOS 下载内容中包含的演示应用程序 对应两种标准开发板: Renesas RX62N 入门套件 (RSK) 和 Renesas RX62N 演示套件 (RDK)。

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

演示应用程序中包括一个示例 Web 服务器,该服务器使用修正过的 微型 uIP TCP/IP 堆栈。 该修正的名称为 FreeTCPIP ,修正后的 吞吐量高于原始代码可实现的吞吐量。 CGI 脚本用于加载包含 RTOS 和 TCP/IP 运行时间信息的页面。

uIP 最初由 Adam Dunkels 编写,为开源代码,但与 FreeRTOS 分开授权。 用户必须熟悉 uIP 许可证,详见各 uIP 源文件的顶部。

注意:如果项目构建失败,可能是使用的 IAR 嵌入式工作台版本过低。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 将其恢复至初始状态,然后才能使用新版本的 IAR 构建项目。


重要!FreeRTOS/IAR/RX62N 移植和 Web 服务器演示使用说明

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

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

源代码组织

RDK 和 RSK 开发板的 Embedded Workbench 工作区均命名为 RTOS Demo.eww ,分别位于 FreeRTOS/Demo/RX600_RX62N-RDK_IAR FreeRTOS/Demo/RX600_RX62N-RSK_IAR 目录下 (在 FreeRTOS 主下载页面中)。

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


RX62N 演示应用程序

功能

"Embedded Workbench" 工作区包含三个构建配置:

构建配置 描述
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 任务

    此任务可运行 uIP TCP/IP 堆栈。 所有与网络相关的处理均在此任务中执行,因此 TCP/IP Flash 和 RAM 占用与其他嵌入式 TCP/IP 实现相比极小。

  • 寄存器测试任务

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

  • 高频定时器测试

    此测试配置一个定时器,生成一个频率为 20 KHz 的中断。 中断优先级高于 configMAX_SYSCALL_INTRUPT_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 开发板,将 RSK 连接到主机时,应使用 E1 JTAG 接口 (已包含在 RSK 里一并提供)连接后接通电源。 如果使用 RDK 开发板,只需将 RDK 上标有 J-Link 的微型 USB 插口连接到主机, 不需要单独的电源。

  3. 在 Embedded Workbench IDE 中打开 RTOS Demo.eww 工作区

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

  5. 构建完成后,单击 Embedded Workbench 的 "Project" 菜单中的 "Download and Debug"(或按 CTRL + D )对微控制器闪存进行编程, 然后启动调试会话。


演示应用程序应表现如下(若 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_IAR/FreeRTOSConfig.hFreeRTOS/Demo/RX600_RX62N-RDK_IAR/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)

可以使用标准 IAR 编译器语法编写中断。 例如,演示应用程序定义 高频定时器的使用:
#pragma vector = VECT_CMT2_CMI2
__interrupt void vTimer2IntHandler( void )
{
    /* ISR implementation goes here.  This is the highest priority interrupt in
    the demo so interrupts are just left disabled while the function executes. */
}

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

#pragma vector = VECT_TMR0_CMIA0
__interrupt void vT0_1_InterruptHandler( void )
{
long lHigherPriorityTaskWoken;

    /* Enable interrupts to allow interrupt nesting. */
    __enable_interrupt();

    /* 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.c main-blinky.c 中。 演示应用程序将 FreeRTOSConfig.h 内的 configTICK_VECTOR 定义为28 (VECT_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.