下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Atmel ARM Cortex-M7 SAMV71/SAME70 RTOS 演示

使用 IARAtmel Studio (GCC) 和 ARM Keil 嵌入式开发工具
[RTOS 端口]


Atmel 的 SAMV71 Cortex-M7 微控制器


简介

此页文档包含:

由于 SAM V70 包含超集功能,因此 SAM V70 Xplained Ultra 开发板也可以 用于评估 RTOS 在 SAM V70、 SAM S70, 和 SAM E70 ARM Cortex-M7 设备上的运行。


FreeRTOS 查看器窗口打开的 Atmel Studio。 点击放大。


重要!关于使用 SAMV7 和 SAME7 ARM Cortex-M7 RTOS 演示的说明

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

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



源代码组织

FreeRTOS zip 文件下载包含所有 FreeRTOS 的源文件 端口的源文件以及所有演示应用程序的项目。 因此,它的文件数量 远超此项目所需。 请参阅源代码组织章节, 获取目录结构的描述以及创建 新 FreeRTOS 项目的信息。

SAMV7 演示应用程序的 Atmel Studio 项目文件名称为 RTOSDemo.atsln,位于 FreeRTOSAtmel/Demo/CORTEX_M7_SAMV71_Xplained_Studio 目录。

SAME7 演示应用程序的 Atmel Studio 项目名为 RTOSDemo.atsln,位于 FreeRTOS/Demo/cortex_M7_SAME70_Xplained_AtmelStudio 目录。

SAMV7 演示应用程序的 IAR ARM Embedded Workbench for ARM 工作区名为 RTOSDemo.eww,位于 FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil 目录。

SAMV7 演示应用程序的 ARM Keil 项目文件名称为 RTOSDemo.uvprojx ,位于 FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil 目录。



Atmel ARM Cortex-M7 演示应用程序

功能性

mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 定义在 main.c 中。 演示的行为 取决于其设置。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时的功能

如果 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为1 ,则 main () 调用 main_blinky()main_blinky()创建一个非常简单的演示如下:
  • main_blinky() 函数:

    main_blinky() 会创建一个队列和两个任务。 然后它会启动 RTOS 调度器。

  • 队列发送任务:

    队列发送任务由 main_blinky.c 中的 prvQueueSendTask() 实现。 它每 200 毫秒向队列发送值 100。

  • 队列接收任务:

    队列接收任务由 prvQueueReceiveTask()main_blinky.c 实现。 每当接收到队列发送任务的消息时,它会阻止队列读取并解除阻止和切换 LED。 队列发送任务 每 200 毫秒发送到队列,所以队列 接收任务离开阻塞状态并每 200 毫秒 切换一次 LED。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能

如果 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 ,则 main() 调用 main_full()main_full() 会创建一个综合测试和演示应用程序 来展示: 创建的任务来自标准演示 任务集。 所有 FreeRTOS 端口演示应用程序使用标准演示任务, 它们没有特定的功能。 它们用于演示如何使用 FreeRTOS API , 并测试 RTOS 端口。

创建“检查”任务以定期检查标准 演示任务,确保所有任务都能按预期 正常运行。 检查任务还会切换 LED,以提供系统状态的 视觉反馈。 如果 LED 每 3 秒切换一次,则 检查任务未发现任何问题。 如果 LED 每 200 毫秒切换一次,则表明检查任务 在一个或多个任务中发现了问题。


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

  1. 打开项目文件 FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_AtmelStudio/RTOSDemo.atslnFreeRTOS/Demo/CORTEX_M7_SAME70_Xplained_AtmelStudio/RTOSDemo.atsln (从 Atmel Studio IDE 中打开)。

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

  3. 确保目标硬件使用 合适的调试器接口与主计算机连接——演示是使用 J-Link 进行开发和调试的; 也可以使用目标硬件上的 Edge 调试接口。

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

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


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

  1. 打开 FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/RTOSDemo.eww (从 IAR Embedded Workbench IDE 中打开)。

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

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

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

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


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

  1. 从 Keil uVision IDE 中打开 FreeRTOS/Demo/cortex_M7_SAMV71_Xplained_IAR_Keil/RTOSDemo.uvprojx

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

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

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

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



RTOS 配置和使用详情


ARM Cortex-M7 FreeRTOS 端口特定配置

此演示的特定配置项目位于 FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/FreeRTOSConfig.hFreeRTOS/Demo/CORTEX_M7_SAME70_Xplained_IAR_Keil/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 为等效,定义为仅使用 SAMV7 和 SAME7 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 微控制器制造商会实现不同数量的优先级位, 并提供优先级指定方式不同的库函数。 例如, 在 Atmel SAMV7/SAME7 ARM CORTEX-M7 微控制器上,您可以指定的最低优先级实际上是 7,这是由 FreeRTOSConfig.h 中的 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 定义的。 可指定的最高优先级 始终为零。

我们还建议确保将所有优先级位分配为 抢占式优先级位,并且不设置子优先级位,就和演示 中的一样。

每个移植 #defines '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.