下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

SmartFusion2 RTOS、CLI 和 FAT 演示
使用免费的 SoftConsole(基于 Eclipse)IDE 和 GCC
[RTOS 移植]


SmartFusion2 入门套件
SmartFusion2 入门套件
SmartFusion2 开发套件
SmartFusion2 开发套件

简介

此页面记录了一个 FreeRTOS 演示应用程序, 面向 Microsemi SmartFusion2 System-on-Chip, 将 ARM Cortex-M3 微控制器集成到低功耗非易失性 FPGA 中。 低成本 SmartFusion2 入门套件 和功能齐全的 SmartFusion2 开发套件 均受支持。

此演示使用:


重要提示!使用 FreeRTOS SmartFusion2 演示项目的注意事项

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

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

源代码组织

FreeRTOS zip 文件包含所有 FreeRTOS 移植和演示 项目。 构建此演示只需要源文件的 一小部分。 请参阅本网站源代码组织部分, 了解关于已下载文件的说明 以及创建新项目的信息。

SoftConsole Eclipse 项目文件位于 FreeRTOS/Demo/CORTEX_SmartFusion2_M2S050_SoftConsole" 目录中。 请参阅本页的构建说明, 获取有关准备项目目录的详情。



Microsemi ARM Cortex-M3 演示应用程序


硬件和软件设置

本页演示可在 SmartFusion2 入门套件 或 SmartFusion2 开发套件上执行。

设置使用 SmartFusion2 入门套件所需的设置:

  • 必须对 FPGA 本身(与 FPGA 微控制器子系统或 MSS 中的 Cortex-M3 相反) 进行编程,以将 GPIO 0 和 GPIO 1 连接到 入门套件 LED,并将 RS232 连接到 USB 转换器的 UART 0。 提供了一个 预构建的硬件映像, 可使用 Microsemi FlashPro 软件将其编程到 FPGA 中 (点此 链接下载文件)。 请注意,在 撰写本文时,所提供的硬件映像 仅在 SmartFusion2 ES 部件和入门套件修订版 Rev2A 上进行了测试。 ES 部件在编程后 必须重启。

  • 在 FreeRTOSConfig.h 中将 configBUILD_FOR_DEVELOPMENT_KIT 设置为 0。

  • 确保 sys_config_mss_clocks.h 中的设置 匹配 sys_config_mss_clocks_starter_kit.h 中的内容。 两个标头 文件位于 Demo_Hardware_Platform/drivers_config/sys_configRTOS 子目录中。

设置使用 SmartFusion2 开发套件所需的设置:

  • 必须对 FPGA 本身(与 FPGA 微控制器子系统或 MSS 中的 Cortex-M3 相反) 进行编程,以将 GPIO 14 和 GPIO 15 连接到 开发套件 LED,并将 RS232 连接到 USB 转换器的 UART 1。 预构建的硬件映像, 可使用 MicroSemi FlashPro 软件将其编程到 FPGA 中 (点此 链接下载文件)。 请注意,在 撰写本文时,所提供的硬件映像 仅在 SmartFusion2 ES 部件和开发套件修订版 B 上进行了测试。 ES 部件在编程后 必须重启。

  • 在 FreeRTOSConfig.h 中将 configBUILD_FOR_DEVELOPMENT_KIT 设置为 1。

  • 确保 sys_config_mss_clocks.h 中的设置 匹配 sys_config_mss_clocks_development_kit.h 中的内容。 两个标头 文件位于 Demo_Hardware_Platform/drivers_config/sys_configRTOS 子目录中。


功能

通过在 FreeRTOSConfig.h 中设置 configCREATE_SIMPLE_BLINKY_DEMO_ONLY,可以将演示 配置为运行一个简单的 blinky 示例,或一个全面的演示 应用程序。


configCREATE_SIMPLE_BLINKY_DEMO_ONLY 置为 1 时的功能

如果 configCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1,则 main() 将 调用 main_blinky()。 main_blinky() 函数创建一个简单的演示,其中包括两个 任务和一个队列。 一个任务重复地将队列中的消息发送给另一个任务, 该任务在每次收到消息时都会切换 LED。 该消息 每 200 毫秒发送一次,因此如果正确执行, 单个 LED 将每 200 毫秒切换一次。


configCREATE_SIMPLE_BLINKY_DEMO_ONLY 置为 0 时的功能

如果 configCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0,则 main() 将 调用 main_full()。 main_full() 会创建一个全面测试和演示应用程序 以展示: 使用 RTOS CLI 访问 FAT FS 除其他事项外,FreeRTOS-Plus-CLI 用于访问 RAM 磁盘上 由 FreeRTOS-Plus-FAT SL 创建的一组示例文件。 与往常一样,在 CLI 中键入"help" 将生成可用命令列表 (已由演示应用程序向 FreeRTOS-Plus-CLI 注册的命令) 。 创建的文件和与文件系统相关的 CLI 命令 (撰写时)与 FreeRTOS-Plus-FAT SL Win32 模拟器 演示所使用的命令相同。 请参阅 Win32 模拟器演示文档 页面,获取详情。

FreeRTOS-Plus-CLI 可通过虚拟 COM 端口访问,该端口 将枚举 SmartFusion2 入门套件或 SmartFusion2 开发套件 通过标记 P1 (入门套件)或 J24 (开发套件)的 USB 端口连接到主机计算机的情况。 枚举后, 虚拟 COM 将显示为标准 COM 端口,可使用 通过标准哑端程序(如HyperTerminal 或 TeraTerm)访问 CLI 。 右图显示了使用 TeraTerm 的 CLI 会话示例。 硬件使用 115200 波特率。 请注意,开发套件枚举了 4 个 单独的虚拟 COM 端口,首先尝试通过 4 个端口中 编号最高的端口进行连接。

其他创建的任务大多数来自标准演示任务集, 所有 FreeRTOS 移植演示应用程序都使用这些任务。 标准演示任务 除了演示正在使用的 FreeRTOS API 并测试了的 RTOS 内核移植。

创建一个“检查”软件定时器,用于定期检查标准 演示任务,以确保所有任务都能 正常运行。 检查软件定时器的 回调函数切换会 LED ,以提供演示状态的视觉反馈。 如果 LED 每 3 秒切换一次,则 检查软件定时器未发现任何问题。 如果 LED 每 200 毫秒切换一次,则表明检查软件定时器 指示至少一个标准演示任务已报告问题。 另一个 LED 也将以固定的 333 毫秒周期切换。 第二个 LED 由标准演示 "flash" 软件定时器控制。


构建和执行演示应用程序

  1. 确保硬件和软件已设置为 面向上述 入门套件或 SmartFusion2 开发套件

  2. 注意:将项目导入到 SoftConsole Eclipse 工作区前,必须执行 CreateProjectDirectoryStructure.bat 批处理 文件 。 批处理文件与 项目文件位于同一目录中。 FreeRTOSConfig.h 包含一个 #error 指令, 可在执行批处理文件后 注释掉该指令。

  3. 打开 SoftConsole,并在出现提示时创建新工作区或 选择现有工作区。

  4. 在 IDE 的 "File" 菜单中选择 "Import", 打开导入对话框。

  5. 在 "Import" 对话框中,选择 "General->Existing Projects Into Workspace", 然后浏览并选择 FreeRTOS/Demo/CORTEX_SmartFusion2_M2S050_SoftConsole 目录。 将显示两个项目。 "RTOSDemo" 是演示应用程序。 "RTOSDemo_Hardware_Platform" 是一个板级支持软件包库。 选中 (选择)两个项目,然后单击 "Finish"。

    将 RTOS 项目导入 SoftConsole Eclipse 工作区
    将两个项目导入 Eclipse 工作区

  6. 打开 FreeRTOSConfig.h 并设置 configCREATE_SIMPLE_BLINKY_DEMO_ONLY,生成 简单的 blinky 演示,或完整的测试和演示应用程序, 根据需求操作。

  7. 确保使用入门套件和 开发套件随附的 FlashPro4 接口 将目标硬件连接到主计算机。

  8. 在 IDE 的 "Project" 菜单中选择 "Build All"。 两个项目应能成功构建,没有任何错误或警告。

  9. 构建完成后, 从 IDE 的 "Debug" 菜单中选择 "Debug Configurations...", 如下图所示配置调试配置,然后单击 "Debug" (调试配置字段可能会自动填写)。

    软件控制台 RTOS 调试配置
    Eclipse 调试配置



RTOS 配置和使用详情


ARM Cortex-M3 FreeRTOS 移植特定配置

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

    此常量设置了 RTOS tick 中断的频率。 提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但此频率比大多数应用程序所需的频率都要高。 降低频率会提高效率。

  • configKERNEL_INTERRUPT_PRIORITY and configMAX_SYSCALL_INTERRUPT_PRIORITY

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

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

    尽管 configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY 是完整的八位移位值,根据定义可作为原始数字直接用于 ARM CORTEX-M3 NVIC 寄存器中,但 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 与其等效,仅通过 SmartFusion2 NVIC 中实现的 4 个优先级位 进行定义。 提供这些值是因为 CMSIS 库函数 NVIC_SetPriority() 需要未偏移的 4 位格式。

请注意!: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), 因为这会导致该中断在系统中具有 最高优先级,并且如果这个优先级 高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。

ARM Cortex-M 核心上的最低优先级实际上是 255,但不同 ARM Cortex-M 微控制器制造商会实现不同数量的优先级位, 并提供优先级指定方式不同的库函数。 例如, 在Microsemi SmartFusion2 SoC Cortex-M3 内核上,您可以指定的最低优先级实际上为15,这是由 FreeRTOSConfig.h 中的常量 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 定义。 可指定的最高优先级 始终为零。

我们还建议确保将所有优先级位分配为 抢占式优先级位,并且不设置子优先级位,就和演示 中的一样。

每个移植 #defines 'BaseType_t' 为对该处理器而言最有效的 数据类型。 此移植将 BaseType_t 定义为长类型。


中断服务例程

与许多 FreeRTOS 移植不同的是,引发上下文切换的中断服务例程 无特殊要求,可根据编译器文档编写。 宏 portEND_SWITCHING_ISR() (or portYIELD_FROM_ISR()) 可用于在 中断服务程序内请求上下文切换。

请注意,portEND_SWITCHING_ISR() 将启用中断。

下列源代码片段仅作为示例提供。 中断 使用信号量与任务(未显示)同步,并调用 portEND_SWITCHING_ISR 以确保中断直接返回任务。 另一示例请参阅 此演示项目中包含的文件 UARTCommandConsole.c 中的函数 prvUARTRxNotificationHandler() 。

void Dummy_IRQHandler(void)
{
long lHigherPriorityTaskWoken = pdFALSE;

    /* Clear the interrupt if necessary. */
    Dummy_ClearITPendingBit();

    /* This interrupt does nothing more than demonstrate how to synchronise a
    task with an interrupt.  A semaphore is used for this purpose.  Note
    lHigherPriorityTaskWoken is initialised to zero. */
    xSemaphoreGiveFromISR( xTestSemaphore, &lHigherPriorityTaskWoken );

    /* If there was a task that was blocked on the semaphore, and giving the
    semaphore caused the task to unblock, and the unblocked task has a priority
    higher than the current Running state task (the task that this interrupt
    interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE
    internally within xSemaphoreGiveFromISR().  Passing pdTRUE into the
    portEND_SWITCHING_ISR() macro will result in a context switch being pended to
    ensure this interrupt returns directly to the unblocked, higher priority,
    task.  Passing pdFALSE into portEND_SWITCHING_ISR() has no effect. */
    portEND_SWITCHING_ISR( lHigherPriorityTaskWoken );
}

只有以 “FromISR” 结尾的 FreeRTOS API 函数可以从 中断服务例程中调用 - 而且中断的优先级须 小于或等于 configMAX_SYSCALL_interrupt_PRIORITY 配置常量(或 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)设置的优先级。


FreeRTOS 使用的资源

FreeRTOS 需要独占 SysTick 和 PendSV 中断。 其也使用 SVC 编号 #0。


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

FreeRTOSConfig.h 中的定义 configUSE_PREEMPTION 设置为 1 即可使用抢占式内核, 可使用协作式内核。 选择协作式 RTOS 调度器时,完整的演示应用程序可能 无法正确执行。


内存分配

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


其他事项

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




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