下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

FreeRTOS MPS2 QEMU 移植 (Arm Cortex-M3)
适用于 IAR 和 arm-none-eabi-gcc 编译器(makefile 和 Eclipse)
[RTOS 端口]

 
QEMU 上的 FreeRTOS

本页记录了 FreeRTOS 内核演示,面向 Arm Cortex-M3 mps2-an385 QEMU 模型。预配置 为 IAR Embedded Workbench arm-none-eabi-gcc (GNU GCC) 编译器提供了预配置的构建项目。该 GCC 项目使用了一个简单的 makefile, 此文件可从命令行或提供的 Eclipse CDT IDE 项目中构建。

 

重要提示!QEMU Cortex-M3 RTOS 演示使用说明

使用此 RTOS 移植之前,请阅读以下所有要点。
  1. 源代码组织
  2. 演示应用程序
  3. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序无法运行,问题可能出在哪里? 请特别注意,我们 建议使用 configASSERT() 进行开发 (在 FreeRTOSConfig.h 中定义),并将 configCHECK_FOR_STACK_OVERFLOW 设置为 2。  

源代码组织

本网站提供的 FreeRTOS 发行版包含所有 FreeRTOS 移植的源文件, 以及所有 FreeRTOS 演示应用程序的项目,因此,文件数量 比使用 Cortex-M3 mps2-an385 QEMU 演示所需的文件数量更多。 请参阅本网站源代码组织部分, 获取目录结构的描述以及创建 新 FreeRTOS 项目的信息。

STM32F7 演示应用程序的 ARM 工作区的 IAR 嵌入式工作台名为 名为 RTOSDemo.eww,位于 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/iar 目录中。

使用 ARM-none-eabi-gcc (GNU GCC) 编译器生成项目的 makefile 和 构建相同 makefile 的 Eclipse 项目 均位于 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc 目录中。

 

Mps2-an385 Arm Cortex-M 3 QEMU 演示应用程序

功能

此演示项目提供了 FreeRTOS 演示应用程序文档页面中描述的 blinky 和全面的测试/演示配置。具体到本页中记录的演示,“check”任务 会定期按以下格式打印信息:
StatusMessageString : aaaa (bb)
其中 StatusMessageString 是描述性文本字符串,aaaa 是 RTOS 滴答计数, bb 是应用程序检测到中断变为嵌套 的次数。  

构建和执行演示应用程序 - IAR

  1. 打开 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/iar/RTOSDemo.eww, 位于 IAR Embedded Workbench IDE。

  2. 打开 main.c,并设置 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY,可生成 简单的 blinky 演示,或完整的测试和演示应用程序, 根据需求操作。

  3. 从 IDE的 Project 菜单中选择 Rebuild All, RTOS Demo 项目应该在没有任何错误或警告的情况下构建。构建成功会 创建 elf 文件 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/iar/Debug/Exe/RTOSDemo.out
    注意:如果 QEMU 已在运行,则构建将失败,因为 QEMU 会阻止生成的 elf 文件被覆盖。

  4. 确保您的主计算机上已安装 QEMU。

  5. 使用以下命令行启动 QEMU,将 [path-to] 替换 为 IAR 构建生成的 RTOSDemo.out 文件的正确路径。


    qemu-system-arm -machine mps2-an385 -cpu cortex-m3 -kernel [path-to]/RTOSDemo.out -monitor none -nographic -serial stdio -s -S
    QEMU 命令行
    如果只是 希望在 QEMU 中运行 FreeRTOS 应用程序,而不附加 调试器,则省略“-s -S”。
  6. 构建完成后, 从 IDE的 Project 菜单中选择 Download and Debug 。IAR 调试器应会创建到 QEMU 的 GDB 连接, 启动调试会话,并在进入 main() 函数时中断。注意: 在调试会话结束时终止 QEMU 会话, 否则 QEMU 将阻止在下次构建 IAR 项目时覆盖可执行映像, 从而导致链接器错误。

 

构建和执行演示应用程序 - GCC Makefile

  1. 确保主机上同时安装了 arm-none-eabi-gcc 编译器和 GNU make 实用程序 。

  2. 打开 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/main.c,并设置 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY,可生成 简单的 blinky 演示,或完整的测试和演示应用程序, 根据需求操作。

  3. 打开命令提示符并导航到 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc 目录。

  4. 在命令提示符中键入“make”。构建项目时, 应该不会有任何编译器错误或警告。提示:使用"-j"参数 通过在主机上使用更多内核来加快编译速度。例如, 如果有四个内核可用, 输入“make -j4”可同时构建四个 C 文件。构建成功会 创建 elf 文件 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc/output/RTOSDemo.out

  5. 确保您的主计算机上已安装 QEMU。

  6. 使用以下命令行启动 QEMU,将 [path-to] 替换 为 GCC 构建生成的 Demo.elfRTOS 文件的正确路径。


    qemu-system-arm -machine mps2-an385 -cpu cortex-m3 -kernel [path-to]/RTOSDemo.out -monitor none -nographic -serial stdio -s -S
    QEMU 命令行
    如果只是 希望在 QEMU 中运行 FreeRTOS 应用程序,而不附加 配置。
  7. 现在,您可以按照以下步骤使用 arm-none-eabi-gdb 启动命令行调试会话, 不过我更倾向于启动图形调试会话, 正如接下来为使用 Eclipse IDE 的用户介绍的那样。

    1. 启动 GDB:导航至 RTOSDemo.out 的路径,并启动 "arm-none-eabi-gdb"。
      arm-none-eabi-gdb RTOSDemo.out
    2. 连接到 QEMU:QEMU 的默认端口为 1234。
      (gdb) target remote localhost:1234
    3. 设置断点。
      (gdb) break main
    4. 开始调试。
      (gdb) continue
    5. 退出 GDB。
      (gdb) quit
 

构建和执行演示应用程序 - Eclipse

  1. 确保主机上同时安装了 arm-none-eabi-gcc 编译器和 Eclipse CDT IDE 。如果 GNU make 实用程序未包含在 Eclipse 中,则可能需要单独安装。

  2. 在 Eclipse 的 File 菜单中选择 Import。 然后在结果窗口中单击 Existing Projects Into Workspace,然后单击 "Next" 按钮。

     
  3. 在下一个窗口中,选择 /FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc 作为根目录,勾选 FreeRTOS 演示项目, 关键是确保在点击 Finish (结束)按钮将项目引入 Eclipse 之前 ,不要勾选 "Copy projects into workspace"(将项目复制到工作区)复选框 。

     
  4. 打开 main.c,并设置 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY,可生成 简单的 blinky 演示,或完整的测试和演示应用程序, 根据需求操作。

  5. 在 Eclipse 的 Project 菜单中选择 Build All。构建成功会 创建 elf 文件 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/build/gcc/output/RTOSDemo.out

  6. 确保您的主计算机上已安装 QEMU。

  7. 打开命令提示符,然后使用以下命令行启动 QEMU, 将 [path-to] 替换为 为 GCC 构建生成的 Demo.elfRTOS 文件的正确路径。


    qemu-system-arm -machine mps2-an385 -cpu cortex-m3 -kernel [path-to]/RTOSDemo.out -monitor none -nographic -serial stdio -s -S
    QEMU 命令行
    如果只是 希望在 QEMU 中运行 FreeRTOS 应用程序,而不附加 调试器,请省略 "-s -S"。
  8. 单击绿色 "bug speed" 按钮旁边的小箭头,然后从结果菜单中选择 "Debug Configurations..."。

     
  9. 在调试配置窗口中,从 "GDB Hardware Debugging" 下选择 "FreeRTOSDemo Default",然后 单击 "Debug" 按钮。Eclipse 调试器应会创建到 QEMU 的 GDB 连接, 启动调试会话,并在进入 main() 函数时中断。

 

RTOS 配置和使用详情

ARM Cortex-M3 RTOS 移植特定配置

此演示的特定配置项目位于 FreeRTOS/Demo/CORTEX_MPS2_QEMU_IAR_GCC/FreeRTOSConfig.h 中。 您可以编辑此文件中定义的常量,使其适合您的应用程序。 特别是-
  • configTICK_RATE_HZ 此常量设置了 RTOS tick 中断的频率。提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但此频率高于大多数应用程序的需要。 降低频率将提高生产应用程序的效率, 但会使综合测试中的自检失败。

  • configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY 请参阅 RTOS内核配置文档,以获取有关这些配置常量的完整信息。 请注意, QEMU 模型有 8 个中断优先级位。

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

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

我们还建议确保将所有优先级位指定为 抢占式优先级位,不要将任何优先级位指定为子优先级位

每个移植都将 "BaseType_t" 定义为 数据类型。此移植将 BaseType_t 定义为长类型。

 

中断服务例程

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

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

提供以下源代码片段作为示例。中断 使用直达任务通知 与任务同步(未显示),并调用 portEND_SWITCHING_ISR 以确保中断直接返回任务。

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 task notification is used for this purpose.  Note
    lHigherPriorityTaskWoken is initialised to zero. */
    vTaskNotifyGiveFromISR()( xTaskToNotify, &lHigherPriorityTaskWoken );

    /* If the task with handle xTaskToNotify was blocked waiting for the notification
    then sending the notification will have removed the task from the Blocked
    state.  If the task left the Blocked state, and if the priority of the task
    is higher than the current Running state task (the task that this interrupt
    interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE
    internally within vTaskNotifyGiveFromISR().  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 以使用抢占式调度,或设置为 0 以使用协同式调度。选择协作式 RTOS 调度器时,完整的演示应用程序可能 无法正确执行。  

编译器选项

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

内存分配

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

其他事项

请注意, vPortEndScheduler() 尚未实现。  
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.