下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

STM32 Connectivity Line ARM Cortex-M3 演示
包含 uIP 嵌入式 Web 服务器示例
[嵌入式以太网示例]



本页展示的演示使用:

uIP 与 FreeRTOS 分开授权。 用户必须熟悉 uIP 许可证

自此演示创建以来,FreeRTOS 已对 uIP 堆栈做了一些修改。 请参阅嵌入式以太网示例列表页面,获取更多详细信息。

FreeRTOS ARM Cortex-M3 移植包含完整的中断嵌套模型。必须按照 自定义页面上的说明设置中断优先级才能正确操作。


重要!关于使用 ST ARM Cortex-M3 Web 服务器演示的注意事项

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

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

源代码组织

STM32F107 演示的 CrossWorks 工作区位于 FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley 目录。

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


演示应用程序

Web 服务器配置

确保将跳线 JP4 设置为短接 JP4 的 1 号和 2 号引脚 - 这会将外部 25MHz 晶振的输出传送到 PHY。 跳线 JP3、JP11、JP12 和 JP13 需要短接 2 号和 3 号引脚,这应该作为默认设置。

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

演示使用的 IP 地址是由 FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/FreeRTOSConfig.h 文件中 configIP_ADDR0 到 configIP_ADDR3 等常量设置的。 MAC 地址和网络掩码 配置在同一头文件中。

运行 Web 浏览器的计算机使用的 IP 地址必须和 STM32 开发板使用的 IP 地址相兼容。 为此,可以将二者 IP 地址中的前三个八进制数设置成相同的值。 例如,如果运行 Web 浏览器的计算机的 IP 地址是 192.168.100.1,那么开发板的 IP 地址可以使用 192.168.100.2 到 192.168.100.254 范围内的任何地址 (网络中已存在的地址除外)。


构建和执行演示应用程序

  1. 在 CrossStudio IDE 中打开 FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/RTOSDemo.hzp 解决方案。
  2. 选择适当的构建配置——如果需要调试应用程序,请选择 "THUMB Flash Debug"; 如果要单独运行应用程序(不运行调试器),请选择 "THUMB Flash Release"。 请注意,"Thumb Flash Debug" 配置只能 与调试器组合使用——它不能通过简单地重置开发板来执行演示。



    选择构建配置


  3. 从 "Build" 菜单中选择 "Build RTOS Demo"——解决方案应当成功构建,没有错误或警告。
  4. 将您选择的 JTAG 接口连接到主机与目标硬件之间(项目是使用 J-Link 开发的), 给目标硬件通电,然后使用 IDE "Target" 菜单中的相应项目连接到目标硬件。
  5. 从 "Debug" 菜单中选择 "Start Debugging"。 程序将写入微控制器闪存,并且调试器将在主函数中断。


ST 外设库

请注意,演示应用程序使用的外围设备库既不是可重入式的,也不是事件驱动的。

在初始化过程中,演示应用程序在多个任务中访问 IO 端口配置。 这增加了 重入问题(或缺少重入)的可能性。 目前没有防范这种问题。 如果事实证明这存在问题,那么 将初始化库调用放在临界区。

LCD 驱动程序使用轮询的 SPI 接口。 目前, LCD 守卫任务被配置为以中等优先级执行——导致 在 SPI 接口轮询时,低优先级任务无法获得任何处理时间。 该任务可以被配置为 以最低优先级执行,但这会导致 LCD 更新速度明显变慢。 更有效的解决办法是重新实现 驱动程序以利用 DMA,并采用事件驱动。


功能性

演示应用程序在启动 RTOS 调度器之前会创建 30 个任务。这些任务主要包括 标准演示应用程序任务(请参阅演示应用程序 部分,了解各个任务的详细信息)。这些任务的唯一目的是测试 RTOS 内核移植并 演示如何使用各种 API 函数。

除了标准演示任务外,应用程序还创建了以下任务和测试:

  • 高优先级中断测试

    使用定时器生成 20KHz 的周期性中断,以演示 配置常量 'configKERNEL_INTERRUPT_PRIORITY' 和 'configMAX_SYSCALL_INTERRUPT_PRIORITY' 的使用方式。中断 服务程序测量每个中断之间的处理器时钟的数量—— 从而测量中断计时中的抖动。测得的最大抖动时间 锁存在 ulMaxJitter 变量中,并通过下文说明的 'Check' 任务显示在 LCD 显示屏上 。timertest.c 源文件中配置并处理快速中断。 这演示了如何配置 RTOS 内核, 才能不对优先级更高的中断处理造成影响。

    当在处理较低优先级中断过程中出现较高优先级中断时, ARM Cortex-M3 核心可以加快进入中断服务程序的速度(从而减少延迟), 最多 8 个周期。因此,测得的抖动时间应 不超过约 8 个时钟周期。

  • LCD 任务

    LCD 任务是一项“守卫”任务。它是唯一允许 直接访问 LCD 的任务。其他任务或中断要向 LCD 写入消息, 需要通过队列将消息发送给 LCD 任务,而不是直接访问 LCD。 LCD 任务只是阻塞等待队列上的消息——当消息到达时唤醒 并展示消息。

  • 检查函数——从滴答钩子调用

    它每 5 秒钟执行一次。其主要功能是检查所有 标准演示任务是否仍在运行。如果在标准演示任务中发现任何意外行为, "check" 函数将向 LCD 写入错误(通过 LCD 任务)。如果所有的演示任务都以预期行为执行, 那么检查任务将 PASS 和测得的最大抖动纳秒数写入 LCD(再次通过 LCD 任务)。 抖动时间是在上述高优先级中断测试中测量的 。

    检查函数在中断服务程序的上下文中执行,因此 能够很好地说明使用守卫任务控制 LCD 是如何允许 中断向 LCD 输出消息。

  • uIP 任务

    它是处理 uIP 堆栈的任务。 所有的 TCP/IP 处理都是在该任务中进行。

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

  • "check" 函数每 5 秒钟向 LCD 写入 "PASS" 和测得的最大抖动时间 。

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

  • 目标硬件将向标准 Web 浏览器提供下述网页。 要连接到目标,请执行下列操作:

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


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


提供的网页

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


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



提供的运行时统计信息页面显示了每个任务的处理器利用率。



提供的 IO 页面

IO 页面提供了一个简单的接口,可以将数据发送到开发板上的 4 号 LED 和 LCD。

复选框可以设置和查询 4 号 LED 的状态。 文本框可用于向 LCD 写入消息, 但不会查询当前显示的文本。 点击 "Update IO" 按钮可将变更发送到目标硬件。

TCP 统计信息和连接页面显示运行时网络信息。



RTOS 配置和使用详情


RTOS 移植的特定配置

这些演示的特定配置项目包含在 FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/FreeRTOSConfig.h 中。 编辑本文件中定义的常量, 在本文件中定义的常量,以适配您的应用程序。 特别是-
  • configTICK_RATE_HZ

    可通过该常量设置 RTOS tick 的频率。 提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但这超过了大部分应用程序的频率要求。 降低此值可提高效率。

  • configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

    请 参阅 RTOS 内核配置文档,获取这些配置常量的完整信息。

注意:请记住 ARM Cortex-M3 核心使用低数值数字表示高 优先级中断,这似乎有悖直觉,而且很容易忘记! 如果您希望将中断分配为低优先级,请不要将中断的 优先级指定为 0(或其他较小数值),因为这可能会导致中断实际上在系统中具有最高优先级 - 因此,如果该优先级 高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,则可能会导致系统崩溃。

ARM Cortex-M3 核心的最低优先级实际上是 255,然而,不同的 ARM Cortex-M3 供应商采用了不同数量的优先位, 并提供了优先级指定方式不同的库函数。 请使用提供的示例作为参考。

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

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


中断服务程序

在演示应用程序中,向量表保存在闪存。

与大多数移植不同,导致上下文切换的中断服务程序没有特殊要求,可以根据编译器文档编写。 portEND_SWITCHING_ISR() 宏可用于从 ISR 内请求上下文切换。 中断服务例程示例 vMAC_ISR() 提供在 FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/webserver/emac.c 中。 示例仅供参考。

请注意,portEND_SWITCHING_ISR() 会使中断保持启用。


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

FreeRTOS/Demo/CORTEX_STM32F107_GCC_Rowley/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1 以使用抢占或 0 以使用协同式调度。


编译器选项

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


内存分配

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




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