下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

SH7216 SuperH 演示
含一个嵌入式 Web 服务器示例
[嵌入式以太网示例]

 


本页面介绍了 SuperH SH2A-FPU FreeRTOS 移植和演示应用程序。演示应用程序配置为在 Renesas 的 RSK+SH7216 评估板上运行,并使用 Renesas 编译器和 HEW IDE

演示中包含一个 Web 服务器示例,它是使用修改版本的 Adam Dunkels 开源 uIP 嵌入式 TCP/IP 堆栈实现的。Web 服务器提供了一个基本的 CGI 脚本工具,用来显示 RTOS 和 TCP/IP 的运行时间信息。uIP 与 FreeRTOS 分开授权。用户必须熟悉 uIP 许可证,详见每一个 uIP 源文件的顶部。


重要!Renesas SH7216 移植和 Web 服务器演示的使用说明

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

  1. 源代码组织
  2. 演示应用程序
  3. RTOS 配置和使用详情

另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?


源代码组织

SH7216 演示的 HEW 工作区称为 RTOSDemo.hws,位于主 FreeRTOS 下载内容的 FreeRTOS/Demo/SuperH_SH7216_Renesas 目录下。

 

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


SH7216 演示应用程序

 

web 服务器配置

直接使用点对点(交叉)电缆,或使用标准以太网电缆通过集线器或交换机,将 RSK+SH7216 评估板连接到运行 web 浏览器的计算机。

SH7216 使用的 IP 地址通过 configIP_ADDR0 至 configIP_ADDR3 的常量设置,这些常量定义在 FreeRTOS/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h 头文件的底部。定义 MAC 地址和网络掩码的常量可以在同一文件中找到。

Web 浏览器和 RSK+SH7216 使用的 IP 地址必须兼容。为此,可以将二者 IP 地址中的前三个八位字节设置成相同的值。例如,如果运行 web 浏览器的计算机使用的 IP 地址为 10.10.10.1,则可以为 RSK+SH7216 评估板指定 10.10.10.2 至 10.10.10.254 范围内的任何地址,但同一网络中已存在的任何地址除外。

分配给 RSK+SH7216 的 MAC 地址在它所连接的网络中必须是唯一的。

 

构建和执行演示应用程序

  1. 打开项目之前,使用 E10A JTAG 接口将 RSK+SH7216 连接到主机。项目打开时, HEW 将尝试连接到 E10A。

     

  2. 在 HEW IDE 中打开 FreeRTOS/Demo/SuperH_SH7216_Renesas/RTOSDemo.hws 工作区,项目打开时按照说明连接到 E10A 接口。

     

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

     

  4. 从调试菜单中选择 "Reset go",将二进制文件下载到 SH7216 并开始执行应用程序。

     

 

功能

在启动 RTOS 调度器之前,应用程序创建了 40 多个演示任务,并在执行过程中不断动态地创建和删除另外两个任务。任务主要包括标准演示任务,这些任务除了测试移植和演示如何使用 FreeRTOS API 之外,不执行任何特定功能。

以下任务和测试也会在 main() 中创建:

  • Check 任务

    此任务每 5 秒钟执行一次,但拥有最高的优先级以确保其拥有处理时间。其主要功能是检查所有标准演示任务是否仍在运行。检查函数保持一个状态字符串,可以在 uIP TCP/IP web 服务器提供的 "Task Stats" 页面的最底部查看。它还切换 LED 5,切换频率用于指示系统状态。每 5 秒一次切换的频率意味着所有标准演示任务都在没有错误的情况下执行,如果切换速率增加到 200 毫秒,则至少一个任务检测到了错误。

     

  • uIP 任务

    这是执行 TCP/IP 堆栈的任务。所有的网络处理都在此任务中进行。

     

  • 寄存器测试任务

    这些任务用已知值填充所有寄存器,然后检查每个寄存器是否仍包含预期值。创建了两个寄存器测试任务,每个任务使用不同的已知值。这些任务以非常低的优先级运行,因此经常被抢占。包含意外值的寄存器表明上下文切换机制存在错误。标准寄存器和浮点寄存器均检查。寄存器测试任务的性质要求它们使用汇编语言编写。它们在 regtest.src 中实现。

     


如果演示应用程序正确执行,其表现如下:

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

     

  • LED 5 由 “check” 任务控制,如果没有错误,将每 5 秒切换一次。

     

  • LED 4 可以通过 web 服务器进行控制(打开和关闭)。

     

  • 目标硬件将向标准 web 浏览器提供下述网页。要连接到目标,请执行下列操作:
    1. 在连接的计算机上打开浏览器。
    2. 先在浏览器地址栏中输入 "HTTP://",再输入目标 IP 地址。

      在 web 浏览器中输入 IP 地址
      (很显然,请为您的系统使用正确的IP地址)

请注意,有些 RSK + SH7216 评估板配有 LCD,有些不配备。因此,演示不使用 LCD。

 

提供的网页

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

由 SuperH web 服务器提供的 RTOS 统计页面
显示了系统中每个任务的状态信息。

 

由 SuperH web 服务器提供的运行时间统计页面
显示了每个任务的处理器利用率。

 


提供的 IO 页面

可利用 IO 页面提供的简单界面,通过 web 浏览器打开和关闭 LED 4 。单击 "Update IO" 按钮可将变更发送到评估板。

提供的其他页面包括 TCP/IP 统计数据和大型 JPG 图像。

 


RTOS 配置和用法详情

 

SH7216 RTOS 移植特定配置

此演示的特定配置项目位于 FreeRTOS/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h。可以编辑此文件中定义的常量,以适应您的应用程序。特别是:

  • configTICK_RATE_HZ

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

     

  • BaseType_t

    每个移植 #defines 'BaseType_t' 等于该处理器的最有效数据类型。SuperH 移植将 BaseType_t 定义为 long 类型。

 

中断优先级、寄存器和堆栈

当前版本的 FreeRTOS SuperH 移植要求任何使用 FreeRTOS API 的中断都使用中断优先级 1。未使用 FreeRTOS API 的中断可以以任何优先级执行。只有以 "FromISR" 或 "FROM_ISR" 结尾的 API 函数可以从中断服务程序中调用。

优先级为 1 的中断必须将其上下文保存在堆栈中,而不是保存在寄存器库中。

 

编写中断服务程序 (ISR)

通常情况下,ISR 最好执行上下文切换,这样 ISR 就会返回到与最初中断的任务不同的任务例如,如果执行中断导致任务解除阻塞,并且被解除阻塞的任务的优先级高于最初被中断的任务,那么中断处理程序应直接返回到(具有更高优先级的)被解除阻塞的任务。

不使用 FreeRTOS API 且无法引起上下文切换的 ISR 没有特殊要求,可以按照编译器文档编写。请参阅在 main.c 中定义的 MTU 中断处理程序 MTU_Match() 的示例。

执行上下文切换的中断需要汇编包装器。尽管整个中断处理程序可以用汇编程序编写,但如果更合适的话,汇编包装器通常会调用标准 C 函数处理程序。下方提供了中断处理程序实现的示例。

要编写可以引起上下文切换的中断,请执行以下操作:

  1. 首先在汇编文件中创建一个包装器,具体方法如下所示。此代码示例中唯一需要更改的是包装器调用的处理程序函数的名称,此示例中的名称是 _ISRHandler ,但在您的代码中应为中断处理程序 C 函数的真实名称。用于填充中断向量表的是汇编程序包装器,而不是它调用的 C 函数。


    ; Import the C handler so it can be called from this file.  _pxCurrentTCB
    ; is also required.
    .import _ISRHandler
    .import _pxCurrentTCB
	
    ; Export the wrapper so it can be used to populate the vector table.
    .export _ISRWrapper

    ; This header file contains the portSAVE_CONTEXT and portRESTORE_CONTEXT
    ; macros.
    .INCLUDE "ISR_Support.inc"

    ; This wrapper goes into the program section.
    .section    P

;-----------------------------------------------------------
; The start of the assembly wrapper function.  This is what is used to 
; populate the vector table.
_ISRWrapper:

    ; portSAVE_CONTEXT must be called first!
    portSAVE_CONTEXT

    ; Next call the C handler function, although the whole interrupt handler
    ; could be written in assembly if that is preferred.
    mov.l    #_ISRHandler, r0
    jsr      @r0
    nop

    ; portRESTORE_CONTEXT must be called last!  This handles the exit from the
    ; interrupt.
    portRESTORE_CONTEXT

 


汇编文件包装器

 

  1. 接下来编写 ISR 的 C 部分。这只是从汇编文件包装器调用的标准 C 函数。


void ISRHandler( void )
{
long lHigherPriorityTaskWoken = pdFALSE;

    /* Perform the actual interrupt processing here - not forgetting to clear
    the interrupt source. */
	
    /* In this example, a semaphore is given from the ISR, and it is possible
    that giving the semaphore unblocks a task.  The semaphore has already
    been declared and created. */
    xSemaphoreGiveFromISR( xSem, &lHigherPriorityTaskWoken );
	
    /* If giving the semaphore did cause a task to unblock, and the unblocked
    task has a priority equal to or higher than the currently executing task
    (the interrupted task), then lHigherPriorityTaskWoken will have been set to
    pdTRUE.  Passing pdTRUE to portYIELD_FROM_ISR() will cause the required
    context switch. */
    portYIELD_FROM_ISR( lHigherPriorityTaskWoken );
}

中断处理程序的 C 部分


演示项目中以太网控制器的实现可以用作完整示例。以太网驱动程序的包装器在 EMAC_ISR.src 中定义,处理程序的 C 部分在 EMAC.c 中定义。

 

FreeRTOS 使用的 TRAPA 向量

FreeRTOS 使用 TRAPA 32 和 TRAPA 33 指令,这意味着这两个向量不可由应用程序使用。

 

使用浮点寄存器

如果一个任务直接使用浮点变量或调用可能使用浮点寄存器的库函数,则必须将该任务配置为维护浮点上下文。

若要告知 RTOS 内核任务需要浮点上下文,请将任务句柄传递给 xPortUsesFloatingPoint(xHandle) API 函数。xPortUsesFloatingPoint() 必须在任务创建后首次执行前调用。

以下代码示例可以在 SuperH 演示应用程序的 main() 中找到:



void main(void)
{
/* Declare a variable of type TaskHandle_t to temporarily hold the handle of 
the task being created. */
TaskHandle_t xCreatedTask;

    /* Create the task, storing the handle of the task in xCreatedTask. */
    xTaskCreate( vRegTest1Task, "RegTst1", configMINIMAL_STACK_SIZE, NULL, 
                 tskIDLE_PRIORITY, &xCreatedTask );
	
    /* The task uses floating point registers, so tell the RTOS kernel that it
    requires a floating point context. */
    xPortUsesFloatingPoint( xCreatedTask );
	
    /* ... rest of main() goes here ... */

利用 xPortUsesFloatingPoint() 函数告知 RTOS 内核
哪些任务需要维持完整的浮点上下文

 

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

FreeRTOS/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1 可使用抢占式机制,设置为 0 可使用协同式机制。

 

编译器选项

与所有移植一样,使用正确的编译器选项至关重要。保证这一点的最佳方法是将应用程序建立在提供的演示应用程序文件上。

 

内存分配

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

 

其他事项

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




 

 

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