下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

ColdFire V2 RTOS 演示
使用 Eclipse 和 GCC
[RTOS 端口]


此页面介绍了适用于来自飞思卡尔V2 ColdFire 核心的新的 FreeRTOS 端口和演示应用程序。 V2 ColdFire 核心 Freescale。 最初由 FreeRTOS V5.0.4 提供的此新端口 ,具有扩展功能,因此取代了之前版本中提供的端口 。

之前的 V2 端口已在 FreeRTOS 下载中保留,但不推荐用于新设计。 新端口几乎 为“下降”替换,因此升级旧设计应该很简单,只有中断服务例程语义(详见 此页)需要一些考虑(写入中断现已更简单)。

端口亮点包括完全中断嵌套支持和写入中断服务例程时无特殊编码要求。

移植和演示已预配置以使用:


重要!关于使用 RTOS V2 ColdFire 移植的说明

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

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

源代码组织

FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码,因此包含的文件比此演示使用的文件更多。 请参阅源代码组织部分,查看 下载的文件和关于创建新项目的信息。

ColdFire MCF5282 Eclipse 演示的 Eclipse 工作区包含在 FreeRTOS/Demo/ColdFire_MCF5282_Eclipse 目录中。

注意:请仔细遵循这些说明 ,正确安装和配置 Eclipse 以与此演示应用程序一同使用。 此页面的“演示应用程序”部分提供了打开 Eclipse 工作区的说明。


演示应用程序


演示应用程序硬件设置

链接器脚本配置为将可执行代码放置在 M5282EVB SDRAM 中(不是运行代码的最快位置!)并将数据放置在 MCF8252 本身的 SRAM 内部。 因此,SW1 库中的所有开关都可以设置为“开”。

演示应用程序使用内置在评估板上的 LED ,因此跳线 JP12 到 JP15 应到位。

演示应用程序包括中断驱动的 UART 测试,其中一个任务传输随后由另一个任务接收的字符。 为了正确操作此功能,必须将环回连接器安装到 M5282EVB 硬件的 AUXIL IAR Y 连接器(引脚 2 和 3 必须在 9 路连接器上连接在一起-纸夹通常足以满足这一目的)。


功能性

演示应用程序在启动RTOS调度器(包括空闲任务)之前创建 42 个任务,然后当内核正在运行时,重复动态创建和删除另外两个任务 RTOS。

除了作为每个FreeRTOS API 函数的使用示例之外,标准演示任务不执行任何特定功能。

正确执行时,演示表现如下:

  • 标有 D6、D7 和 D8 的 LED 灯由非常简单的“闪光灯”任务控制。 每盏 LED 灯都将以恒定的频率闪烁,其中 LED D6 最快,D8 最慢。

  • 大多数任务不会更新 LED ,因此没有明确迹象表明它们运行正常。 因此,创建了一个“检查”任务,用于确保其他任务中没有检测到任何错误 。 检查任务仅每隔几秒钟执行一次,但具有高优先级,因此保证在需要时获得处理时间。 如果所有演示任务都按预期执行,检查任务将每 5 秒切换一次 LED D9。 在任何任务中检测到错误时,切换速率将增加到 500 毫秒。 可以通过从 AUXIL IAR Y 端口中移除环回连接器来故意生成错误以测试该机制 。

有关更多信息,请参阅代码本身的评论。

RTOS内核配置为使用中断优先级 1。 UART 使用中断优先级 2。 中断嵌套进一步由 “IntQueue”测试执行,其中一个任务和两个中断均访问相同的两个队列。 两个中断分别以优先级 4 和 3 运行, 因此可能的最大中断嵌套深度为 4。 有关执行中断及其各自的优先级的更完整说明,请参阅 RTOS配置和使用章节 。

请记住,您允许的嵌套深度越深,消耗的堆栈大小就越大- 需将 configCHECK_FOR_STACK_OVERFLE 设置为 2(而非此演示的默认值 1 )以捕获由深嵌套引起的溢出,但这仅用于调试目的,因为它会 减慢上下文切换操作。 演示应用程序默认地为每个任务分配相同的堆栈大小,而不是调整每个堆栈以确保不会浪费RAM。


构建和执行演示应用程序

使用“标准生成” Eclipse 项目。 这意味着要构建的文件和构建选项在标准生成文件中进行了详细介绍,该生成文件可以使用 Eclipse IDE 进行编辑和查看 。 优化级别由生成文件顶部的 Optim 定义进行设置。

  • 如需构建演示应用程序:

    1. 确保您正确安装了 CodeSourcery 编译器 ,且编译器 bin 目录包含在主机系统 PATH 环境变量中。

    2. 确保您已按照这些说明中的描述安装和配置了 Eclipse。

    3. 启动 Eclipse 工作台 IDE -此时将提示您确定工作区位置。

      ColdFire MCF5282 Eclipse 演示的 Eclipse 工作区包含在 FreeRTOS/Demo/ColdFire_MCF5282_Eclipse 目录中。 因此,这是 Eclipse 向您询问工作区位置时,应选择的目录, 具体如下所示。


      打开 Eclipse 工作区-显然要使用正确的安装路径 ,这可能不同于此处所示的

    4. 确保您将“FreeRTOS_ROOT”变量设置为指向您的FreeRTOS安装(此处再次描述 )。

    5. 从 Eclipse “项目”菜单项中选择“构建全部”。 演示构建时不应发生错误或警告。

  • 如需运行演示应用程序:

    1. 确保使用 CodeSourcery 调试精灵支持的 BDM 接口将 M5282EVB 正确连接到主机。

    2. 按下显示小错误的速度按钮旁边的向下箭头,然后从菜单中选择RTOS演示。


      启动RTOS演示调试会话

      如果您尚未进入 Eclipse Debug 透视图,则应将您带到该透视图。

      等待程序加载到 评估板RAM -完成此操作后,IDE 右下角的进度条将显示结果。


      正在等待程序加载

      加载后,程序应在进入 main () 时中断。 然后,如任何其他调试 IDE 一样,Eclipse IDE 可用于执行代码、查看变量、查看内存等操作。 手动删除 main () 处的断点,因为每次启动调试会话时都会添加一个新的断点。

WITTENSTEIN 提供的 FreeRTOS Eclipse 插件可用于查看任务和队列状态信息:


使用FreeRTOS Eclipse 插件查看器


配置和使用详情


RTOS 端口特定配置

此演示的特定配置项目包含在 FreeRTOS/Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/FreeRTOSConfig.h 中。 开发人员 在本文件中定义的常量,以适配您的应用程序。 特别是:
  • configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY

    请参阅 RTOS 内核配置文档的中断配置章节以了解 这些选项的完整信息。

    configKERNEL_INTERRUPT_PRIORITY 设置 RTOS 内核本身使用的中断优先级。 configMAX_SYSCALL_INTERRUPT_PRIORITY 设置最高中断优先级, 从中可以调用队列和信号量 API 函数(请注意,只有以 FromISR () 结尾的 API 函数才能从 ISR 调用)。

    configKERNEL_interrupt_PRIORITY 应设置为最低优先级。

    在硬件本身施加的限制范围内,configMAX_SYSCALL_INTRUPT_PRIORITY 以上级别的中断不会被 RTOS 内核关键部分掩盖,因此不受 RTOS内核活动的影响。

    通过演示,演示应用程序将 configMAX_SYSCALL_INTRUPT_PRIORITY 定义为 4 ,并将configKERNEL_INTRUPT_PRIORITY 定义为 1。

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

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


写入中断服务例程

CodeSourcery 库使用默认处理程序填充中断矢量表-每个处理程序都称为 __ cs3_isr_interrupt_xx () ,其中“xx”是矢量数。 只需提供您自己对处理程序函数的定义,即可覆盖默认处理程序 。 例如,UART1 外围设备使用向量 数字 78 -提供您自己的 UART1 处理程序,表示只需提供您自己对 __ cs3_isr_interrupt_78 () 函数的定义即可。

中断服务例程没有特殊要求,可以按照编译器文档进行编写。 宏端口 END_SWITCHING_ISR () 可用于确保中断始终返回到最高优先级 就绪状态任务-可以由 ISR 解除阻塞的任务,因此 ISR 结束时的最高优先级就绪任务 可能不同于输入 ISR 时的最高优先级就绪/正在运行的任务。

MCF5282 演示中的 UART1 中断(下方列表 1 )可以用作示例:



/* The function prototype must use the 'interrupt' attribute.*/
void __attribute__( ( interrupt ) ) __cs3_isr_interrupt_78( void );

Next provide the ISR function, with the correct vector number in the name.

NOTE: This is NOT intended to be an example of an efficient ISR. It is provided
only to demonstrate using queues from within interrupts.  Great efficiency 
improvements would be gained by simply placing received characters in a RAM 
buffer, then using a single write to a semaphore to unblock a task if required.
void __cs3_isr_interrupt_78( void )
{
unsigned char ucChar;
BaseType_t xHigherPriorityTaskWoken = pdFALSE, xDoneSomething = pdTRUE;

    while( xDoneSomething != pdFALSE )
    {
        xDoneSomething = pdFALSE;

        /* Does the tx buffer contain space? */
        if( ( MCF_UART1_USR & MCF_UART_USR_TXRDY ) != 0x00 )
        {
            /* Are there any characters queued to be sent? */
            if( xQueueReceiveFromISR( xCharsForTx, &ucChar, &xHigherPriorityTaskWoken ) 
                                                                            == pdTRUE )
            {
                /* Send the next char. */
                MCF_UART1_UTB = ucChar;
                xDoneSomething = pdTRUE;
            }
            else
            {
                /* Turn off the Tx interrupt until such time as another character
                is being transmitted. */
                MCF_UART1_UIMR = serRX_INT;
                xTxHasEnded = pdTRUE;
            }
        }

        /* Any characters in the receive buffer? */
        if( MCF_UART1_USR & MCF_UART_USR_RXRDY )
        {
            /* Queue the character for processing by a task? */
            ucChar = MCF_UART1_URB;
            xQueueSendFromISR( xRxedChars, &ucChar, &xHigherPriorityTaskWoken );
            xDoneSomething = pdTRUE;
        }
    }

    /* Finally we call portEND_SWITCHING_ISR().  This ensures that the interrupt 
    returns to the highest priority ready task - which may not be the currently running 
    task if reading from or writing to a queue causes a task of higher priority to 
    unblock. */
    portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}

列表 1 : ISR 示例


RTOS内核使用的资源

RTOS 内核使用 PIT0 定时器生成 RTOS 滴答 (tick)。 可以更改函数 vApplicationSetupInterrupts() 以使用任何适宜的定时器源。

此外, RTOS RTOS内核需要一个额外的中断向量。 因为使用了中断控制器 0 上的递送矢量 16,而 MCF5282 上的矢量 16 未由任何外围设备使用,因此作为备用。 RTOS 内核结合中断强制寄存器 0 (INTFRCL0) 使用此向量。 出于效率原因, 假设 RTOS 内核具有此寄存器的独占访问权限,因此不会尝试保持其状态-尽管此操作可 通过使用寄存器上的位集和清除,而非写入整个寄存器,来轻松改变。

为了使用户灵活更改矢量分配,PIT0 和矢量 16 配置都在名为 FreeRTOS _tick_setup.c 的文件中执行, 这是用户应用程序的一部分,而非固定 RTOS 内核代码的一部分。


临界区

退出临界区将始终设置中断优先级,以便启用所有中断,无论输入临界区时的级别如何 。 FreeRTOS API 函数本身将使用临界区。


执行上下文

出于效率原因,任务以主管权限运行。


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

FreeRTOS/Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_preemption 设置为 1 来使用抢占式,或设置为 0 来使用协作式。 如果 configIDLE_SHOULD_YIELD 设置为 1,则仅当 configUSE_PREEMPTION 设置为 0 时,演示应用程序才会正确执行 。


编译器选项

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


内存分配

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



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