简介此页面上的项目介绍了 FreeRTOS ARM Cortex-M0 IAR 移植。 它配置为在 STM320518-EVAL 评估板上运行,该评估板配有一个 STM32F051 微控制器。该项目可以配置为创建基本的 "blinky" 风格的演示, 或配置为更全面的测试和演示应用程序, 应用程序中包括一些 FreeRTOS 标准演示任务。
FreeRTOS 状态查看器插件的屏幕截图 (此插件是 IAR IDE 的 标准配件)。 注意:如果项目构建失败,可能是使用的 IAR 嵌入式工作台版本过低。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 将其恢复至初始状态,然后才能使用新版本的 IAR 构建项目。
重要!使用 IAR ARM Cortex-M0 演示的注意事项使用此 RTOS 移植之前,请阅读以下所有要点。另请参阅常见问题我的应用程序 未运行,问题可能出在哪里?
源代码组织FreeRTOS 下载包含所有 FreeRTOS 移植的源代码, 因此其中包含的文件远比演示所需的文件多。 请参阅源代码组织 了解关于已下载文件的说明 和新项目创建的信息。FreeRTOS STM32F0 演示应用程序的 IAR EWARM 工作区名为 RTOSDemo.eww, 位于 FreeRTOS/Demo/CORTEX_M0_STM32F0518_IAR 目录下。请注意, 此工作区创建于 STM32F0 支持加入 EWARM 之前, 因此,该项目配置为使用通用 ARM Cortex-M0 内核, 本页上提供了相应说明,介绍了对微控制器闪存进行编程所用的独立 ST-Link 实用程序。
演示应用程序演示应用程序硬件设置该演示采用了集成在 STM320518-EVAL 板上的 LED, 因此不需要任何硬件设置。
构建和运行演示应用程序单个 RTOS 演示 项目可配置为运行简单的 "blinky" 风格的项目或者更全面的测试和演示应用程序。 main.c 顶部的 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置用于在两者之间进行选择。 将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1, 以创建基本的 "Blinky" 风格演示。 将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0, 以创建更全面的测试和演示应用程序。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时的功能将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 会导致 main() 调用 main_blinky()。 main_blinky() 创建了一个非常简单的演示程序, 请参阅下文。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 会导致 main() 调用 main_full()。 main_full() 会创建更全面的测试和演示应用程序, 请参阅下文。
RTOS 配置和使用详情中断服务程序导致上下文切换的中断服务程序 无特殊要求。 portEND_SWITCHING_ISR() 宏可用于从 ISR 内请求上下文切换。请注意,portEND_SWITCHING_ISR() 将启用中断。 在 main.c 的末端提供名为 Dummy_IRQHandler() 的虚拟中断处理程序作为参考实现。 此外,还将 Dummy_IRQHandler() 复制到了下方。
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. Only FreeRTOS API functions that end in "FromISR" can be called from an ISR! */ 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 ); } 请注意,以下行包含在 FreeRTOSConfig.h 中。 #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler这些定义将 FreeRTOS 内核中断处理程序函数名映射到 CMSIS 中断处理程序函数名上;如此一来,无需任何修改, 就可以使用 ST 或 IAR 提供的链接器脚本和启动文件。 请注意! 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), (或其他低数字值),因为这会导致该中断在系统中 实际上具有最高优先级。 另外,请勿忘记指定中断优先级, 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。 RTOS 移植特定配置专用于此类演示的配置项包含在 FreeRTOS/Demo/cortex_M0_STM32F0518_IAR/FreeRTOSConfig.h 中。 可以 编辑 FreeRTOSConfig.h 中定义的常量,使其适合您的应用程序。 尤其是以下常量:
每个移植都将 "BaseType_t" 定义为 数据类型。 此移植将 BaseType_t 定义为长类型。 请注意,vPortEndScheduler() 尚未实现。 在抢占式和协同式 RTOS 内核之间切换将 FreeRTOS/Demo/CORTEX_M0_STM32F0518_IAR/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,以使用抢占式调度,或设置为 0 以使用协同式调度。内存分配Source/Portable/MemMang/heap_2.c 包含在 ARM Cortex-M0 演示应用程序项目中, 以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 获取完整信息。Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|