下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Infineon TriCore 演示
使用免费 TriCore 入门级工具链
[RTOS 移植]



Infineon TriBoard TC1782 入门套件

本页介绍了适用于 Infineon TriCore 处理器的 FreeRTOS 演示应用程序。 演示应用程序使用免费的 TriCore 入门级工具链, 该工具链由 HighTec GCC 构建工具和调试器组成,二者均已集成到基于 Eclipse 的环境中。

此演示项目预配置为在 Infineon TriBoard TC1782 入门套件, 配备 TC1782 处理器。

FreeRTOS TriCore 移植支持完整的中断嵌套模型, 不会彻底禁用中断,除非出于正确汇编指令排序的目的, 架构限制需要禁用中断。

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

感谢 William Davy 协助创建此移植。



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

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

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



源代码组织

FreeRTOS 下载包含所有 FreeRTOS 移植的源代码及 演示应用程序。 这意味着它包含的文件比使用 TriCore 移植或官方 TriCore 演示应用程序所需的文件多得多。 请参阅源代码组织部分, 获取关于已下载文件的说明 和新项目创建的信息。

TriCore 演示 Eclipse项目位于 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC 目录中,但该目录需要先执行准备步骤, 然后才能将此项目导入到 Eclipse 工作区中。


准备 Eclipse 项目目录

Eclipse 项目既可以是标准 makefile 项目,也可以是托管 make 项目。 官方的 FreeRTOS TriCore 演示项目是一个托管 make 项目。 这意味着 以下两种情况:
  1. 构建项目所需的所有源文件必须位于 包含项目文件本身的文件夹/目录,或

  2. 需要配置 Eclipse 工作区(注意是工作区,而非项目) 来定位硬盘上其他位置的文件。
本演示中采用第一种方案,因此我们必须将所需的所有源文件 从 FreeRTOS 目录结构体中的默认位置复制到 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC。 为此提供了 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC/RTOSDemo/
CreateProjectDirectoryStructure.bat
批处理文件。

必须先执行 CreateProjectDirectoryStructure.bat,才能将 FreeRTOS 演示 项目导入到 Eclipse 工作区

批处理文件复制的文件如下:

  1. 核心 FreeRTOS 内核源文件。

  2. 一组标准演示任务实现。



TriCore TC1782 演示应用程序

功能

演示应用程序可以配置为提供非常简单的 "blinky" 风格的功能, 或者提供 FreeRTOS 功能。 #define mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY 位于 main.c 中,用于在两者之间切换。

演示应用程序任务分为标准演示任务 和演示特定任务。 所有 FreeRTOS 移植和演示应用程序都使用标准演示任务。 这些任务仅用于演示 FreeRTOS API 和测试移植,不得用作其他用途。

mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY 设置
说明
设置为 1 创建一个非常简单的示例 , 该示例下创建了三个标准的演示“闪烁”任务。 这三个任务分别按固定的不同频率触发 LED 切换状态。 此处使用的 LED 分别为 P5.0、P5.1 和 P5.2。
设置为 0 此演示非常全面, 在启动 RTOS 调度器之前创建了 42 个任务, 然后在执行应用程序期间连续动态地创建和删除另外两个任务。

它创建了许多队列、软件定时器和不同类型的信号量。 这些任务主要由 标准演示任务组成。

该演示中还包括特定于应用的“寄存器测试”任务。 这些是空闲优先级任务, 它们首先为所有通用处理器寄存器填写已知值, 然后在任务的生命周期内, 反复检查每个寄存器在换入和换出时是否保持其期望值。 每个寄存器检查任务都使用一组不同的已知值, 使用的已知值不同,如果某个值突然改变, 说明上下文切换机制中 发生了错误。

最后, 该演示创建了一个特定于应用程序的任务来检查中断嵌套功能。 该任务使用高优先级、 高频率的中断, 与使用信号量的任务保持同步。 测试表明, 该测试生成的嵌套深度至少为三层, 因为它与 UART 中断嵌套, 而 UART 中断本身又与 RTOS tick 中断嵌套。 理论上,由于 UART 本身使用了两个中断,因此也可能出现额外的嵌套。

创建“检查”任务,用于定期检查标准演示任务、 寄存器测试任务和中断嵌套测试任务, 以确保它们都按预期运行。 检查任务 切换 LED P5.7 ,提供系统状态的视觉反馈。 如果 LED P5.7 每 5 秒切换一次,则检查任务 在测试/演示应用程序执行过程中发行任何潜在问题 。 如果 LED P5.7 切换的频率拉长到每 500 毫秒一次,则说明检查任务发现 至少有一个任务的行为存在潜在问题。

就像简单的闪光灯演示一样, 综合演示创建了标准演示闪烁任务, 它会按固定的不同频率切换 LED P5.0、P5.1 和 P5.2。


硬件设置

演示应用程序包含通 UART 发送和接收字符的任务。 一个任务发送的字符必须由另一个任务接收。 如果任何字符丢失或接收顺序错误, 则会标记错误情况。 因此,UART 已配置为使用其内部环回模式, 以确保所发送的每个字符均能被收到。 UART 配置需要注意两点:
  1. UART 仅在环回模式下使用。 从未通过将 UART 连接到外部设备来验证波特率计算。

  2. FreeRTOS 队列用于将字符传入和传出 UART 中断处理程序。 如果 UART 用于处理流数据, 这会是一种非常低效的实现方式。 在这种情况下,它专门用于加载系统, 并在支持中断嵌套的环境中测试 FreeRTOS 安全 API 队列函数的操作。

演示应用程序使用的 LED 均硬连线到 TriBoard 主板上的,因此不需要明确的硬件设置。


导入、构建和调试 FreeRTOS 演示应用程序

  1. 确保所需的工具已下载 并安装。

  2. 确保 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC/RTOSDemo/
    CreateProjectDirectoryStructure.bat
    批处理文件已执行。

  3. 启动已安装的 Eclipse for TriCore 工具, 并根据需要创建新工作区或选择现有工作区。如有必要,请转到 Eclipse 工作台。

  4. 从 "File" 菜单中选择 "Import..."。

  5. 从 "General" 类别中选择 "Existing projects into Workspace", 然后单击 "Next"。


    选择 "Existing projects into Workspace"

  6. 在下一个对话框中,选择 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC 作为根目录,然后选择 "FreeRTOS_Demo" 作为项目。


    选择根目录和项目

  7. 单击 "Finish" 以完成导入过程。

  8. 右键单击 Eclipse Project Explorer 窗口中的项目名称, 然后使用弹出菜单中的 "Build Configurations->Set Active" 选项 在完全从 RAM 执行的构建配置和从 TriCore 闪存执行的构建配置之间进行选择。 注意: RAM 构建配置 被配置为使用大小优化。

  9. 若要实际构建项目,只需从 Eclipse 工作台的 "Project" 菜单中选择 "Build Project"。

  10. 最后,要启动调试会话,请确保 TriBoard 通电并通过 USB 数据线正确连接到主机,然后单击 Eclipse IDE 中的 "Debug" 速度按钮。


    TriCore Eclipse IDE 中的 "Debug" 速度按钮



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

  • LED P5.0、P5.1 和 P5.2 由标准“闪烁”任务的控制。 各个 LED 按固定的不同频率切换,P5.0 的频率最高,P5.2 的频率最低。

  • LED P5.7 由“检查”任务控制。 如果所有其他任务均报告应用程序处于“健康”状态, 则 LED 每五秒切换一次。 如有任何任务报告了错误,LED 每 500 毫秒切换一次。

  • 标准演示 ComTest 任务发送和接收字符时,LED P5.5 和 P5.6 会相应切换。 切换速率会变得太快而无法察觉, 而且 LED 看起来像是亮起的。



RTOS 配置和使用详情

FreeRTOS TriCore RTOS 移植特定配置

此演示的特定配置项目在 FreeRTOS/Demo/TriCore_TC1782_TriBoard_GCC/RTOSDemo/FreeRTOSConfig.h 中定义。 这些 根据您的应用需求来编辑常量。 特别是:
  • configTICK_RATE_HZ

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

  • configMAX_SYSCALL_INTERRUPT_PRIORITY

    定义可以据其调用 FreeRTOS API 函数的最大中断优先级。 等于或低于该优先级的中断 可以调用 FreeRTOS API 函数,前提是该 API 函数以 "FromISR" 结尾。 高于此优先级的中断不能调用任何 FreeRTOS API 函数, 但不会被 RTOS 内核禁用 (这超出了本文件开头提到的架构所施加的限制)。 因此,优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断适用于要求极高定时精度的功能。

TriCore 移植层将 "BaseType_t" 定义为 "long"。


FreeRTOS 使用的 TriCore 资源

FreeRTOS 要求独家使用:
  • 中断优先级 1。
  • 中断优先级 2。
  • 0 号 Syscall 陷阱。
  • 系统定时器 (STM) 执行的频率。
  • 系统定时器 (STM) 比较匹配 0 配置和中断。


陷阱处理程序

Demo/TriCore_TC1782_TriBoard_GCC/RTOSDemo/FreeRTOS_Source/portable/GCC/
TriCore_1782/portrap.c
。 陷阱处理程序被声明为弱函数。 这允许应用程序编写者 根据需要在应用程序代码中重新定义它们。

SysCall 陷阱由 RTOS 内核使用,并在 port.c 中定义。


编写中断服务程序 (ISR)

中断服务程序 (ISR) 使用编译器库提供的标准工具编写和安装。 示例请参见 serial.cInterruptNestTest.c

演示使用的中断优先级在 FreeRTOSConfig.h 中定义。 请注意,中断优先级 1 和 2 仅供 RTOS 内核使用, 不得另行使用或修改。

通常,ISR 想要触发上下文切换,因此当 ISR 处理完成时,ISR 返回的任务不同于 ISR 最初中断的任务。 如果 ISR 导致某个任务被解除阻止, 且该任务的优先级高于处于“运行”状态的任务(被中断的任务), 就会出现这种情况。 为此,我们提供了 portYIELD_FROM_ISR() 宏。 portYIELD_FROM_ISR() 采用单个参数: 如果参数为 零,则不切换上下文;如果参数不为零, 则执行上下文切换。 InterruptNestTest.c 中就有一个非常简单的示例, 我们已复制到下方:

static void prvPortHighFrequencyTimerHandler( int iArg )
{
static volatile unsigned long ulExecutionCounter = 0UL;

/* Variable used to determine if a context switch is required.  This must be
initialised to pdFALSE (0). */
unsigned long ulHigherPriorityTaskWoken = pdFALSE;

    /* Clear the interrupt source. */
    STM_ISRR.reg = 1UL << 2UL;

    /* Reload the Compare Match register for X ticks into the future.*/
    STM_CMP1.reg += ulCompareMatchValue;

    /* Note how many times this ISR has executed. */
    ulExecutionCounter++;

    /* Do the number of executions equal the number expected in a 10ms period? */
    if( ulExecutionCounter >= ulInterruptsPer10ms )
    {
        /* Give the semaphore to unblock the task that is synchronising with
        this interrupt.  Giving this semaphore will unblock the task, and if the
        priority of the unblocked task is above that of the task that is currently
        in the Running state (the task that this interrupt interrupted), then
        ulHigherPriorityTaskWoken will be set to true within this function call
        to indicate that a context switch is required. */
        xSemaphoreGiveFromISR( xHighFrequencyTimerSemaphore, 
                               &ulHigherPriorityTaskWoken );

        /* Start counting again. */
        ulExecutionCounter = 0UL;
    }

    /* Context switch on exit if necessary.  See the comment above the call to
    xSemaphoreGiveFromISR() just above. */
    portYIELD_FROM_ISR( ulHigherPriorityTaskWoken );
}


内存分配

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


其他事项

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




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