源代码组织官方 FreeRTOS zip 文件下载包含所有 RTOS 移植的源文件和所有演示应用程序,其中只有少数是 EFM32 Gecko 项目所需的。 请参阅源代码组织部分, 了解关于已下载文件的说明 新项目的信息。用于 Silicon Labs EFM32 Giant Gecko STK3700 演示应用程序的 Simplicity Studio 项目 位于 FreeRTOS/Demo/CORTEX_EFM32_Giant_Gecko_Simplicity_Studio 目录中。 用于 Silicon Labs EFM32 Pearl Gecko SLSTK3401A 演示应用程序的 Simplicity Studio 项目 位于 FreeRTOS/Demo/CORTEX_EFM32_Pearl_Gecko_Simplicity_Studio 目录中。 这些是在将项目导入至 Simplicity Studio Eclipse 工作区时应选择的目录。
The EFM32 Gecko RTOS 演示应用程序硬件设置演示使用内置在 EFM32 Gecko 入门套件板上的 LED,因此无 需硬件设置。
功能性可对 RTOS 演示项目进行配置,以构建简单的低功耗无 tick 项目,或构建全面测试和演示项目。 常量 configCREATE_LOW_POWER_DEMO 定义于 FreeRTOSConfig.h 的顶部,可用于在两者间切换 。 下表描述了将为 Pearl 和 Giant Gecko 项目的所有 configCREATE_LOW_POWER_DEMO 有效值构建的项目。
当(configCREATE_LOW_POWER_DEMO = = 0)时的功能如果 configCREATE_LOW_POWER_DEMO 设置为 0,则 main () 将调用 main_full ()。 main_full() 在 main_full.c C 源文件中实现。main_full() 会创建全面测试和演示应用程序 以展示: 由综合演示创建的大多数任务来自 标准演示任务集。 标准演示任务被 所有 RTOS 端口演示应用程序所使用。 它们没有特定的功能, 创建目的只是为了演示如何使用 FreeRTOS API,并测试 RTOS 端口。 除了标准演示任务外,综合演示还创建 “RegTest” 任务和“检查”任务:
当(configCREATE_LOW_POWER_DEMO ! = 0)时的功能如果 configCREATE_LOW_POWER_DEMO 设置为 1 或 2,则 main () 将调用 main_low_power ()。 main_low_power() 在 main_low_power.c C 源文件中实现。 请参阅上表,以了解 EFM32 Giant 和 Pearl Gecko 演示的有效 configCREATE_LOW_POWER_DEMO 设置。main_low_power () 会创建队列、“队列发送”任务和“队列接收”任务。 然后它会启动调度器。
构建和执行演示应用程序注意: Simplicity Studio Eclipse 项目使用 虚拟和链接路径 从项目目录外部引用文件,且如果 目录结构体已更改,可能无法构建。
RTOS 配置和使用详情ARM Cortex-M3 和 M4F FreeRTOS 端口特定配置此演示的特定配置项目包含在 FreeRTOS/Demo/CORTEX_EFM32_[part]_Gecko_Simplicity_Studio/FreeRTOSConfig.h 中。 您可以编辑此文件中定义的常量,使其适合您的应用程序。 特别是:
请注意!: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), 因为这会导致该中断在系统中具有 最高优先级,并且如果这个优先级 高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。 ARM Cortex-M 核心上的最低优先级实际上是 255,但不同 ARM Cortex-M 微控制器制造商会实现不同数量的优先级位, 并提供优先级指定方式不同的库函数。 例如, Silicon Labs ARM Cortex-M 微控制器上可以指定的最低优先级实际上为 7——这是由 FreeRTOSConfig.h 中的常量 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 定义的。 可指定的最高优先级 始终为零。 每个端口 #defines 'BaseType_t',以等效于对处理器最有效的数据类型 数据类型。 此移植将 BaseType_t 定义为长类型。
中断服务例程与许多 FreeRTOS 移植不同的是,引发上下文切换的中断服务例程 无特殊要求,可根据编译器文档进行编写。 宏 portYIELD_FROM_ISR() 可用于在 中断服务例程内请求上下文切换。请注意,portYIELD_FROM_ISR() 将使中断处于启用状态。 下列源代码片段仅作为示例提供。 中断 使用直达任务通知以同步任务(未显示),并调用 portYIELD_FROM_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 direct to task notification is used for this purpose. Note lHigherPriorityTaskWoken is initialised to zero. */ vTaskNotifyGiveFromISR( xTaskHandle, &lHigherPriorityTaskWoken ); /* If the task referenced by the xTaskHandle handle was in the Blocked state waiting for a notification then calling vTaskNotifyGiveFromISR() will have moved the task into the Ready state. If the task was moved into the Ready state, and the task's priority is higher than the priority of the currently executing task (the task this interrupt interrupted), then lHigherPriorityTaskWoken will have been set to pdTRUE internally within vTaskNotifyFromISR(). Passing pdTRUE into the portYIELD_FROM_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 portYIELD_FROM_ISR() has no effect. */ portYIELD_FROM_ISR( lHigherPriorityTaskWoken ); } 只有以 “FromISR” 结尾的 FreeRTOS API 函数可以从 中断服务例程中调用 - 而且中断的优先级须 小于或等于 configMAX_SYSCALL_interrupt_PRIORITY 配置常量(或 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)设置的优先级。
FreeRTOS 使用的资源当 configCREATE_LOW_POWER_DEMO 设置为 0 时,标准 FreeRTOS Cortex-M 端口被 使用,此时需要独占使用 SysTick 和 PendSV 中断。 也使用 SVC 编号 #0。当 configCREATE_LOW_POWER_DEMO 设置为 1 时,需独占访问 RTC、RTCC 或 BURTC 外围设备,具体依配置而定。 内存分配Source/Portable/MemMang/heap_4.c 包含在 ARM Cortex-M 演示应用程序项目中,用以提供 RTOS 内核所需的内存分配。 该综合演示还展示了 使用静态分配而不是动态分配的内存创建的 RTOS 对象 。 请参阅 API 文档的内存管理部分, 以获取完整信息。其他事项请注意,vPortEndScheduler() 尚未实现。Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|