下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

ST ARM Cortex-M7 STM32 F7 RTOS 演示
IAR 和 ARM Keil 嵌入式编译器项目
[ RTOS 移植 ]


简介

本页面记录了针对 STM32756G-EVAL 评估套件的 FreeRTOS 演示, 该套件包含 STM32F7 ARM Cortex-M7 微控制器 (由 STMicroelectronics 开发), 还提供了适用于 IAR 和 ARM Keil 工具的预配置构建项目。


重要!使用 STM32F7 Cortex-M7 RTOS 演示 的注意事项

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

  1. 源代码组织
  2. 演示应用程序
  3. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序无法运行,问题可能出在哪里? 请特别注意,我们 使用 configASSERT() (在 FreeRTOSConfig.h 中定义)。



源代码组织

本网站提供的 FreeRTOS 发行版包含所有 FreeRTOS 移植的源文件, 以及所有 FreeRTOS 演示应用程序的项目, 因此,它的文件数量 比使用 STM32 F7 微控制器所需的要多得多。 请参阅本网站源代码组织部分, 获取目录结构的描述以及创建 新 FreeRTOS 项目的信息。

STM32F7 演示应用程序的 ARM 工作区的 IAR 嵌入式工作台名为 RTOSDemo.eww,位于FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL 目录下。

STM32F7 演示应用程序的 ARM Keil 项目名为 RTOSDemo.uvprojx,位于 FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL 目录下。



ST ARM Cortex-M7 演示应用程序

硬件设置

演示使用 LED ,该 LED 通过定位跳线 JP24 连接到端口 F 的引脚 10, 因此跳线连接了引脚 2 和引脚 3。
将 LED 连接到 Cortex-M7 设备的跳线设置
JP24 用于连接引脚 F10 和 LED


功能

可以构建 STM32 F7 演示应用程序来创建简单的 blinky 演示, 或综合测试和演示应用程序。 常量 mainCREATE_SIMPLE_Blinky_DEMO_ONLY 定义于 main.c 顶部, 用于在二者之间进行切换。


mainCREATE_SIMPLE_Blinky_DEMO_ONLY设置为 1 时的功能

要构建简单的 blinky 演示,将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1, 这样 main() 就会调用 main_blinky()main_blinky() 会创建一个简单的演示,如下所示:
  • main_blinky() 函数:

    main_blinky() 会在启动 RTOS 调度器之前创建两个任务和一个队列 。

  • 队列发送任务:

    队列发送任务由 prvQueueSendTask()main_blinky.c 实现。 每 200 毫秒向队列写入一次。

  • 队列接收任务:

    队列接收任务由 prvQueueReceiveTask()main_blinky.c 实现。 它阻止队列读取以等待来自 队列发送任务的消息,每次收到消息时会切换一次 LED。 由于队列发送任务每 200 毫秒向队列写入一次, 队列接收任务每 200 毫秒接收一条消息,并切换 LED 。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能

要构建综合测试和演示,将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0, 这样 main() 就会调用 main_full()。 综合测试和 演示应用程序演示了: 大多数创建的任务来自标准演示任务集, 除了演示如何使用 FreeRTOS API 和测试 RTOS 移植外,没有其他特定目的。

还创建了一个“检查”任务, 定期检查标准演示任务,以确保它们按预期执行。 检查任务也会切换 LED 。 如果检查任务已确定演示任务按预期执行, LED 将每 3 秒钟切换一次, 如果检查任务检测到任何标准演示任务中存在潜在错误, LED 将每 200 毫秒切换一次


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

  1. 打开 FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL/RTOSDemo.eww (从 IAR 嵌入式工作台 IDE 中打开)。

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

  3. 确保目标硬件使用 合适的调试器接口连接至主机——演示是使用 J-Link 进行开发和调试的。

  4. 从 IDE的 “项目”菜单中选择“重建所有”, RTOS 演示项目的构建应该不会报错或出现警告。

  5. 生成完成后,从 IDE 的“项目”菜单中选择“下载和调试”, 对 Cortex-M7 微控制器进行编程,启动调试 会话,并命令调试程序中断向 main() 函数输入。


构建和执行演示应用程序 — Keil

  1. 打开 FreeRTOS/Demo/CORTEX_M7_STM32F7_STM32756G-EVAL/RTOSDemo.uvprojx (从 Keil uVision IDE 内打开)。

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

  3. 确保目标硬件使用 合适的调试器接口连接至主机——演示是使用 J-Link 进行开发和调试的。

  4. 从 IDE 的“项目”菜单中选择“构建目标”, RTOSDemo 项目应该在没有任何错误或警告的情况下构建。

  5. 构建完成后,从 IDE 的 "Debug" 菜单中选择 "Start/Stop Debug Session" , 对 Cortex-M7 微控制器进行编程,启动调试 会话,并命令调试程序中断向 main() 函数输入。



RTOS 配置和使用详情


ARM Cortex-M7 FreeRTOS 端口特定配置

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

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

  • configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY

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

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITYconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

    鉴于 configKERNEL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY 是完整的八位未移位值,并且被定义为作为原始数据直接 ARM CORTEX-M7 NVIC 寄存器中用作原始数字,configLIBRARY_lowest_INTERRUPT_PRIORITYconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 是仅使用 STM32F7 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 微控制器制造商会实现不同数量的优先级位, 并提供优先级指定方式不同的库函数。 例如, STM32F7 ARM Cortex-M7 微控制器上可以指定的最低优先级实际上为 15,这是由 FreeRTOSConfig.h 中的常量 configLIBRARY_lowest_interrupt_PRIORITY 定义的。 可指定的最高优先级 始终为零。

我们还建议确保将所有优先级位指定为 抢占式优先级位,不要将任何优先级位指定为次优先级位, 正如在演示项目中通过函数调用进行这样的设置

HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_4 );

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


中断服务例程

与许多 FreeRTOS 移植不同的是,引发上下文切换的中断服务例程 没有特殊要求,可根据编译器文档编写。 宏 portEND_SWITCHING_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.