下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Silicon Labs EFM32 低功耗 RTOS 演示
使用 Simplicity Studio (GCC),针对 Giant 和 Pearl Gecko 入门套件
[RTOS 移植]

EFM Pearl Gecko ARM Cortex-M4 入门套件
EFM32 Pearl Gecko 入门套件 SLSTK3401A

EFM Giant Gecko ARM Cortex-M4 Starter Kit
EFM32 Giant Gecko 入门套件 STK3700


简介

此页面记录的演示应用程序 是针对 Silicon Labs 的 EFM32 ARM Cortex-M3 和 ARM Cortex-M4F 微控制器。

此处提供了两个 Simplicity Studio (GCC) 项目,一个已预配置为针对 EFM32 Giant Gecko 入门套件 (STK3700),另一个已预配置为针对 EFM32 Pearl Gecko 入门套件 (SLSTK3401A)

这两个项目都可用于构建全面测试和演示应用程序, 或构建低功耗演示应用程序。该应用程序使用 FreeRTOS 的 tick 抑制功能 (无 tick 闲置)。 此处提供了三个 EFM32 特定的无 tick 闲置实现 : 在 Giant Gecko 上使用 RTC 外围设备的实现、 在 Giant Gecko 上使用 BURTC 外围设备的实现,以及 在 Pearl Gecko 上使用 RTCC 外围设备的实现。



重要!使用 EFM32 RTOS 演示的注意事项

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

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


源代码组织

官方 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 有效值构建的项目。


EFM32 Giant Gecko 演示
设置 构建的项目
0 将构建全面测试和演示应用程序。

1 将构建简单低功耗无 tick 演示,参数 如下:
  • tick 由 BURTC 外围设备生成。
  • 进入能量模式 3( EM3 )。
  • 使用 ULFRCO 时钟。

使用 BURTC 外围设备的无 tick 闲置实现 包含在 low_power_tick_management_BURTC.c 源文件中。

请注意,使用 ULFRCO 时钟的优点是运行功耗极低, 但会影响时间精度。

2 将构建简单低功耗无 tick 演示,参数 如下:
  • tick 由 RTC 外围设备生成。
  • 进入能量模式 2( EM2 )。
  • 使用 LXFO 时钟。

使用 RTC 外围设备的无 tick 闲置实现 包含在 low_power_tick_management_RTC.c 源文件中。

EFM32 Pearl Gecko 演示
设置 构建的项目
0 将构建全面测试和演示应用程序。

1 将构建简单低功耗无 tick 演示,参数 如下:
  • tick 由 RTCC 外围设备生成。
  • 进入能量模式 2(EM2)。
  • 使用 LXFO 时钟。

使用 RTCC 外围设备的无 tick 闲置实现 包含在 low_power_tick_management_RTCC.c 源文件中。


当(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” 任务和“检查”任务:

  • RegTest 任务

    两个 RegTest 任务用唯一值填充所有 CPU 寄存器,然后 检查值是否在任务存在期间不发生改变。 包含意外值的寄存器表示 上下文切换机制存在错误(或如果演示已被修改,则存在用户错误 )。

  • 检查任务。

    检查任务负责检查 RegTest 和标准演示 任务是否按预期执行,并通过切换 LED 来 显示系统状态。

    如果 LED 每 3 秒切换一次,则 检查任务未发现任何问题。 如果 LED 每 200 毫秒切换一次,则表明检查任务 在至少一个任务中发现了一个潜在问题。


当(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 () 会创建队列、“队列发送”任务和“队列接收”任务。 然后它会启动调度器。

  • 队列发送任务

    队列发送任务每秒向队列发送值 100。

  • 队列接收任务

    队列接收任务会在队列上阻塞, 每次从队列发送任务中收到数值 100 时, LED 灯就会闪烁(快速开关)。 队列发送任务每秒写入队列,因此 LED 灯会每秒闪烁一次。

这两个任务大部分时间都在阻止状态,在此期间,RTOS tick 关闭,并根据配置情况, 进入能量模式 2 (EM2)或能量模式 3 (EM3)。


构建和执行演示应用程序

注意: Simplicity Studio Eclipse 项目使用 虚拟和链接路径 从项目目录外部引用文件,且如果 目录结构体已更改,可能无法构建。
  1. 请确保您的 Simplicity Studio 安装包中 含有 Giant 和(或)Pearl Gecko 入门套件支持, 否则将无法构建项目。 可为额外的 EFM32 设备和入门套件安装支持, 使用 Simplicity Studio 菜单即可实现。

  2. 启动 Simplicity Studio,根据提示选择现有工作区, 或创建新的工作区。

  3. 从 Simplicity Studio IDE 的“文件”菜单中选择“导入”。将出现 下图所示对话框。选择“导入现有项目至工作区”。

    将低功耗的 Cortex-M4 RTOS 演示导入 simplicity studio


  4. 在下一个对话框中,选择 /FreeRTOS/Demo/CORTEX_EFM32_[part]_Gecko_Simplicity_Studio 作为根目录,其中 [part] 为 “Giant” 或 “Pearl”。然后,确保 在“项目”区域勾选 RTOS 演示项目,请勿勾选 “将项目复制到工作区”框,然后点击完成按钮(正确的 复选框状态见下图,图片中不包含完成按钮)。

    将低功耗无 tick RTOS 演示导入 Eclipse


    项目源文件将显示在 Eclipse 项目浏览器 窗口中。

  5. 打开 FreeRTOSConfig.h,并将 configCREATE_LOW_POWER_DEMO 设置为生成 低功耗无滴答模式演示,或完整测试和演示应用程序, 根据需求操作。 有关有效设置,请参阅上表

  6. 确保目标硬件使用合适的 USB 数据线连接到主计算机。

  7. 从 Simplicity Studio “项目”菜单中选择“构建全部”,以构建 应用程序。

  8. 构建完成后,从 Simplicity Studio “运行”菜单中选择“调试”, 对微控制器闪存进行编程并启动调试会话。



RTOS 配置和使用详情

ARM Cortex-M3 和 M4F FreeRTOS 端口特定配置

此演示的特定配置项目包含在 FreeRTOS/Demo/CORTEX_EFM32_[part]_Gecko_Simplicity_Studio/FreeRTOSConfig.h 中。 您可以编辑此文件中定义的常量,使其适合您的应用程序。 特别是:
  • configTICK_RATE_HZ

    此常量设置了 RTOS tick 中断的频率。 此演示 使用的设置取决于 configCREATE_LOW_POWER_DEMO 设置。

  • configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

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

  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

    尽管 configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY 是完整的 8 位偏移值,定义为原始数据,直接用于 ARM CORTEX-M NVIC 寄存器中,configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 等效,定义为仅使用 EFM32 NVIC 中实现的 3 个优先级位 。 提供这些值是因为 CMSIS 库函数 NVIC_SetPriority() 需要未移位的 3 位格式。

请注意!: 请参阅说明如何在 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.