下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

ColdFire V2 RTOS 和 TCP/IP 演示
使用 uIP、Eclipse 和 GCC
[RTOS 移植]


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

移植亮点包括完全中断嵌套支持,并且在编写中断服务程序时无特殊编码要求。


重要提示!使用 MCF52233 V2 ColdFire RTOS 移植的注意事项

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

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

源代码组织

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

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

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


演示应用程序


演示应用程序设置

演示应用程序使用内置在评估板上的 LED,因此不需要特定的硬件设置。

将 M52233DEMO 评估板直接使用点对点(交叉)电缆或通过 使用标准以太网电缆的集线器/路由器与运行网络浏览器的电脑相连。采用点对点连接时,原型板还可以允许使用标准以太网电缆, 但我还没有尝试过此配置。

演示使用的 IP 地址由 FreeRTOS/Demo/ColdFire_MCF52233_Eclipse/FreeRTOSConfig.h 文件中的 configIP_ADDR0 至 configIP_ADDR3 常量设置。 网络浏览器计算机和评估板使用的 IP 地址必须兼容。可以将二者 IP 地址中的前三个八位字节 设置为相同来保证这一点。例如,如果网络浏览器计算机使用 IP 地址 192.168.100.1,则可以为原型板给定 192.168.100.2 至 192.168.100.254 范围内的任何地址(不包括网络上已存在的任何地址)。


功能

演示应用程序在启动 RTOS 调度器之前创建 33 个任务(包括空闲任务)。 除了作为每个 FreeRTOS API 函数的使用示例之外,标准演示任务不执行任何特定功能。

正确执行时,演示设置如下:

  • 标记为 LED1、LED2 和 LED3 的 LED 处于非常简单的“闪光灯”任务的控制之下。 每盏灯将以恒定频率闪烁,LED1 速度最快, LED 3 速度最慢。 LED4 通过网络服务器接口进行控制。

  • MCF52233 将提供以下网页-以连接到服务器:

    1. 在连接的计算机上打开网络浏览器。
    2. 先在浏览器地址栏中输入 "HTTP://",再输入目标 IP 地址。


    在网络浏览器中输入 IP 地址
    (当然,需根据您的系统,使用正确的 IP 地址)

  • 大多数任务不会更新 LED ,因此没有明确迹象表明它们运行正常。 因此,创建了一个“检查”任务,用于确保其他任务中没有检测到任何错误 。 检查任务仅每隔几秒钟执行一次,但具有高优先级,因此保证在需要时获得处理时间。 在任何任务中发现的错误将 锁定在 ulErrorCode 变量中,以便通过网络服务器显示( 错误代码显示在包含每个任务状态 的表格底部)。 错误代码为 0 表示未检测到错误。

RTOS 内核配置为使用中断优先级 1。 以太网外围设备 (FEC) 使用中断优先级 4。 有关执行中断及其各自的优先级的更完整说明,请参阅 RTOS 配置和使用章节 。

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


网络服务器

FEC 驱动程序使用高效的“无复制”机制实现,这意味着数据在 TCP/IP 堆栈中一直保持在一个缓冲区中,然后再返回。

每个服务网页的顶部包含指向其他每个网页的链接的菜单。

  • RTOS 统计信息页面提供了有关系统内每个任务状态的运行时间信息-包括堆栈高水位线 (自任务开始执行以来,任何时候都可用的最小堆栈量)。 在表格底部 为刷新次数,以及由“检查”任务维护的错误代码(如上所述)。 页面将重新加载 大约每两秒钟一次-取决于网络负载。

    此页面分三个部分传输:HTML 标头和菜单、动态生成的内容以及 HTML 页脚。这使得页面加载相对较快。可以通过一次性传输整个页面来进一步优化加载速度。

    有时,连续重新加载 RTOS 统计页面会导致无法从该页面离开。

  • IO 页面提供了一个简单的界面,允许将数据发送到开发板上的 LED,并从 LED 读取。该复选框允许 对用户 LED 的状态进行设置和查询。点击 "Update IO" 按钮可将变更发送到目标硬件。 注意这是一个 为使用 Microsoft Internet Explorer 而设置的相当粗糙的演示。

  • TCP 统计信息和连接页面显示运行时网络信息。请注意,这些页面会单独传输每行,因此不会 快速加载。这演示了如何通过牺牲已实现的数据吞吐量来利用小型传输缓冲区优化内存使用。

  • 最后一页提供了一份 30 KB 字节的 JPG 文件,应该会很快加载。 通常需要 uIP “拆分”功能来获得此高吞吐量, 但是在这种情况下,有关双 FEC 传输的勘误表是实现类似效果的一种方便方法,同时也降低了处理器的负载 (拆分机制要求计算两次 TCP 校验和)。 因此,没有试图围绕双重传输勘误表开展工作。


IO 页面


任务统计页面


构建和执行演示应用程序

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

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

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

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

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

      ColdFire MCF52233 Eclipse 演示的 Eclipse 工作区包含在 FreeRTOS/Demo/ColdFire_MCF52233_Eclipse 目录中。 因此,当 Eclipse 询问您工作区的位置时,应该选择这个目录,如下图所示。


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

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

    5. 从 Eclipse “项目”菜单项中选择“构建全部”。 演示应该成功构建,没有错误,尽管在 httpd-fsdata.c 中定义网页内容的常量结构体将生成 4 或 5 个相同的警告-很遗憾,这是不可避免的。

  • 要对 Coldfire 闪存进行编程:

    1. 确保 M52233DEMO 硬件上的 P&E Micro USB 连接器已正确连接到主机计算机。

    2. 启动 CF Flasher 实用程序。

    3. 单击 "Target Configuration" (目标配置)按钮,然后确保按照下图设置配置。


      所需的 CF Flasher 目标配置设置

    4. 然后,单击 CF Flasher 实用程序中的 "Program" (编程)按钮,以显示“编程”窗口。 选择文件 FreeRTOS/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/bin/RTOSDemo.s19,然后单击“编程”窗口中的 "Program" (编程)按钮。

    5. 等待闪存编程完成,然后关闭 CF Flasher 实用程序。 必须关闭该实用程序才能使调试器 正确工作。

  • 要运行演示应用程序( M52233DEMO 硬件仍连接到主机,且闪存已编程) :

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


      启动 RTOS 演示调试会话

      如果您还没有到达 Eclipse Debug 视角,则应将您带到该视角。

      加载后,程序应在进入 main () 时中断。 然后可以用 Eclipse IDE 来浏览代码、查看变量、查看内存等, 就像其他调试 IDE 一样。

      手动删除 main () 处的断点,因为每次启动调试会话时都会添加一个新的断点。



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


使用FreeRTOS Eclipse 插件查看器


配置和使用详情


RTOS 移植特定配置

此演示的特定配置项目包含在 FreeRTOS/Demo/ColdFire_MCF52233_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 时的最高优先级就绪/正在运行的任务。

可以使用 MCF52233 演示中的 FEC 中断作为示例。 下面的列表 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 内核还需要一个额外的中断向量。 在 MCF52233 中,中断控制器 0 的向量 16 没有被任何外设使用, 因此是备用的。 RTOS 内核结合中断强制寄存器 0 (INTFRCL0) 使用此向量。 出于效率原因, 假设 RTOS 内核具有此寄存器的独占访问权限,因此不会尝试保持其状态-尽管此操作可 通过使用寄存器上的位集和清除,而非写入整个寄存器,来轻松改变。

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


临界区

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


执行上下文

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


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

FreeRTOS/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREMPTION 设置为 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.