下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

适用于 Microchip ATmega-0 移植的 FreeRTOS 演示
使用 XC8、AVR-GCC 和 IAR EWAVR 编译器
[RTOS 移植]


ATmega4809 Curiosity Nano 开发板。

有多个适用于 Microchip AVR 微控制器的 FreeRTOS 移植,本页描述了 ATmega-0 系列移植。 这些移植适用于 Atmel AVR-GCC、XC8 和面向 AVR的 IAR Embedded Workbench (IAR EWAVR) 编译器。

支持的设备

本页描述的演示和示例均为 ATmega4809 配置,其具有 48 KB 闪存和 6 KB SRAM。此大小 FreeRTOS 演示的大小取决于所使用的编译器,但在 Full 演示配置中,它需要大约 15 KB 或更少的程序内存。除了空闲任务之外,运行 10 个实时任务需要约 2 KB SRAM。 因此,剩余 SRAM 足够用于通信缓冲、高级算法和应用程序的其他 SRAM 密集型部件 。

有关 ATmega-0 微控制器的更多信息,请访问 ATmega-0 页面

支持的编译器和 IDE

这些移植适用于三种不同的编译器。括号中显示了用于开发移植的版本:

  • XC8 (v2.20)
  • AVR-GCC (build 3.6.2.1778)
  • IAR EWAVR (7.30)

以下 IDE 版本用于移植的开发和测试:

  • Microchip MPLAB X (5.40,含设备包 ATmega_DFP 2.2.108)

    用于 XC8 移植

  • Atmel Studio 7 (7.0.2397,含设备包 ATmega_DFP 1.4.351)

    用于 AVR-GCC 移植和演示应用程序项目

XC8 和 AVR-GCC 编译器集成在 Microchip MPLAB X 和 Atmel Studio 7 IDE 中。

演示应用程序

适用于 ATmega-0 微控制器的 FreeRTOS 演示应用程序(Blinky 演示、Minimal 演示、Full 演示)均面向 ATmega4809 Curiosity Nano 评估套件。此等演示应用程序可以使用 MPLAB X (XC8)、Atmel Studio (AVR-GCC) ,或 IAR EWAVR 构建。

Atmel START 提供了更高级的应用程序示例。该示例面向以下三类板的组合: Curiosity Nano Base for Click 板ATmega4809 Curiosity Nano 评估套件 OLED1 Xplained Pro 板



重要提示!使用 Microchip AVR Dx 移植的注意事项

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

  1. 源代码组织
  2. 演示应用程序功能
  3. 在 QEMU 仿真器中使用 Microchip AVR Dx 构建和运行 RTOS 演示应用程序 仿真器
  4. RTOS 配置和使用详情

另请参见常见问题:我的应用程序未运行,哪里出错了?



源代码组织

FreeRTOS 内核和演示的代码可从 FreeRTOS.org 的 主下载页面获取。 FreeRTOS zip 文件下载内容包含所有 FreeRTOS 移植和演示应用程序的源代码——因此包含的文件比此项目所需文件多得多。请参阅源代码组织部分, 获取目录结构的描述以及有关新建 FreeRTOS 项目的信息。

ATmega4809 演示应用程序的 MPLAB X 项目位于 FreeRTOS/Demo/AVR_ATMega4809_MPLAB.X 目录。

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

ATmega4809 演示应用程序的 IAR EWAVR 项目名为 RTOSDemo.eww,位于 FreeRTOS/Demo/AVR_ ATMega4809_IAR 目录。



Microchip ATmega-0 演示应用程序

功能

每个端口都配有三个不同的演示,可使用定义 (#define mainSELECTED_APPLICATION) 进行选择,该定义可以在 main.c 文件中找到。每个演示都自带 main-<demo-name>.c 文件。此结构体适用于全部 三个 IDE(Atmel Studio 7、MPLAB X 和 IAR EWAVR)。它们都使用相同的 FreeRTOSConfig.h 文件, 以容纳最全面的演示(Full 演示)。

Blinky 演示

如果 mainSELECTED_APPLICATION 设置为 0,则 main() 调用 main_blinky() 创建简单演示, 如下所示:

  • main_blinky() 函数创建一个队列和两个任务,然后启动 RTOS 调度器。
  • 队列发送任务通过 main_blinky.c 中的 prvQueueSendTask() 实现。此任务每 200 毫秒向队列发送一个固定值 (100)。
  • 队列接收任务通过 main_blinky.c 中的 prvQueueReceiveTask() 的实现。此任务在队列读取时进入阻塞状态, 并在每次从队列发送任务发出的消息被接收时,解除阻塞并切换 LED。队列发送任务 每 200 毫秒向队列发送一次消息,因此队列接收任务每 200 毫秒解除阻塞状态并切换一次 LED 。

Minimal 演示

如果 mainSELECTED_APPLICATION 设置为 1,则 main() 调用 main_minimal() 创建以下测试任务 :

  • 整数数学测试通过 integer.c 文件中的 vStartIntegerMathTasks() 实现。 此测试创建一个任务函数,它重复执行 32 位计算并检查结果是否符合预期 。
  • 寄存器测试通过 regtest.c 文件中的 vStartRegTestTasks() 实现。此测试创建 两个任务,它们在所有寄存器中写入不同的值并验证其上下文是否在上下文切换期间被保留 。
  • 轮询队列测试通过 PollQ.c 文件中的 vStartPolledQueueTasks() 实现。此测试 创建两个任务,它们通过单个队列进行通信。其中一个任务作为生产者,另一个作为消费者, 所有队列访问都不会被阻塞。
  • 串行通信测试通过 comtest.c 文件中的 vAltStartComTestTasks() 实现。 此测试创建两个任务,它们在中断驱动程序串口上运行。为确保所有传输内容都被接收, 应使用环回连接器。

最后,创建通过 vErrorChecks() 实现的检查任务,对标准演示任务进行定期检查, 以确保所有任务都正常运行。检查任务还会切换 LED,以提供系统状态的 视觉反馈。如果 LED 每 3 秒切换一次,则表示检查任务未发现任何问题。如果 LED 停止切换, 则表示检查任务在至少一个任务中发现了问题。

我们提供了 Minimal 演示项目文件,目的是展示 RTOS 内核的使用, 而不是提供一个优化的解决方案。这点对于 comtest.c 而言尤其如此,它使用了中断驱动的 UART 驱动程序示例 (serial.c)。我们编写此等文件旨在强调(并因此测试)RTOS 内核实现, 而不是提供一个优化的解决方案示例。

 

Full 演示

如果 mainSELECTED_APPLICATION 设置为 2,则 main() 调用 main_full() 创建全面演示, 此演示可展示并测试多种 FreeRTOS 功能,包括任务直达任务通知队列信号量软件定时器等 。此演示创建了以下测试:

  • 信号量测试任务通过 semtest.c 文件中的 vStartSemaphoreTasks() 实现, 此任务创建两个任务集,每个任务集包含两个任务。任务集内的任务共享一个变量,其访问由信号量保护。
  • 直达任务通知任务通过 TaskNotify.c 文件中的 vStartTaskNotifyTask() 实现, 此任务创建一个单独执行某些测试的任务,之后再循环操作,通过一个软件定时器和 一个中断接收通知。
  • 寄存器测试任务由 Regtest.c 文件中的 vStartRegTestTasks() 实现,此任务创建两个任务, 它们在所有寄存器中写入不同的值并验证其上下文是否在上下文切换期间被保留 。
  • 递归互斥锁任务通过 RecMutex.c 文件中的 vStartRecursiveMutexTasks() 实现, 它演示递归互斥锁的使用。此任务创建了三个访问相同递归互斥锁的任务。

然后,创建通过 vErrorChecks() 实现的检查任务,对标准演示任务进行定期检查, 以确保所有任务都正常运行。检查任务还会切换 LED,以提供系统状态的 视觉反馈。如果 LED 每 3 秒切换一次,则表示检查任务未发现任何问题。如果 LED 停止切换, 则表示检查任务在至少一个任务中发现了问题。

创建的任务来自标准演示任务集。标准演示任务供所有 FreeRTOS 移植演示应用程序使用,不具有特定功能。它们用于演示 FreeRTOS API 的使用方法和 RTOS 移植的测试方法。

 

构建 RTOS 演示应用程序

开发工具选项

这些演示应用程序可用于 AtmelStudio、MPLAB X 和 IAR EWAVR。这表示,共有三个编译器:AVR-GCC、XC8 和 IAR EWAVR。从演示代码角度来看,三个演示项目都是相同的。Also, the porting files are identical for Atmel Studio 和 MPLAB X 的移植文件也是相同的,但 IAR EWAVR 使用了不同的移植文件。

准备项目文件

开始前,我们首先通过下载(或以递归方式克隆)GitHub 存储库获取 FreeRTOS 内核和演示的代码 (下载地址: https://github.com/FreeRTOS/FreeRTOS)。FreeRTOS 下载包含用于多个处理器移植和演示应用程序的源代码, 但每个支持的处理器架构都需要少量特定于架构的 RTOS 代码。这是 RTOS 可移植层,位于 FreeRTOS-Kernel/Source/Portable/<compiler>/<architecture> 子目录,其中 <compiler> 和 <architecture> 分别是用于创建移植的编译器和移植运行的架构 。请参阅 FreeRTOS 源代码组织页面, 获取 FreeRTOS 目录结构的完整说明。

注意:GCC 和 XC-8 编译器的移植文件相同,因此 MPLAB-X 项目使用了 .../Portable/GCC/AVR_Mega0 文件夹中的移植文件。

对于 ATmega-0 设备,可在以下文件夹中找到所有必要的移植文件和演示:


文件夹结构。

下一步是从 FreeRTOS/Demo 内的项目文件夹中打开应用程序。每个 IDE/编译器的项目都链接了所有必要文件。

使用 MPLAB X 和 XC8 构建

要使用 MPLAB X 编译演示项目,请按以下步骤操作:

  1. 启动 MPLAB-X。
  2. 从开始菜单中进入 File -> Open Project 并浏览到项目所在的文件夹:

  3. 选择并打开 "AVR_ATMega4809_MPLAB.X"。
  4. 构建项目。

使用 Atmel Studio 7 和 AVR-GCC 构建

要使用 Atmel Studio 7 编译演示项目,请按以下步骤操作:

  1. 启动 Atmel Studio。
  2. 从工具菜单中进入 File -> Open -> Project/Solution。浏览到项目所在的文件夹:

  3. 选择 "RTOSDemo.asln" 并打开此项目。
  4. 构建项目。

使用 IAR EWAVR 构建

要使用 IAR EWAVR 编译演示项目,请按以下步骤操作:

  1. 启动 IAR Embedded Workbench。
  2. 从菜单中进入 File -> Open Workspace 并浏览到项目位置。

  3. 选择并打开 "RTOSDemo.eww"。
  4. 构建项目。

 

配置和用法详情

RTOS 移植特定配置

FreeRTOS 演示的特定配置项目位于每个项目文件夹内的 FreeRTOSConfig.h 文件中。 下文给出了几个定义示例。您可以编辑此文件中定义的所有常量,以适配特定的应用程序。

  • #define configCPU_CLOCK_HZ - 定时器使用的微控制器时钟,用于计算通信的延迟和波特率 。
  • #define configTICK_RATE_HZ – 用于设置 RTOS 滴答频率。该值在所有演示中都设为 1000 Hz, 以测试 RTOS 内核功能。
  • #define configUSE_PREEMPTION - 用于在抢占式和协作 FreeRTOS 内核之间切换。
  • #define configUSE_TIMER_INSTANCE - 此移植允许用户选择用于 RTOS 滴答的定时器。 FreeRTOS_Config.h 文件详细描述了可用选项列表,支持函数/宏 位于 porthardware.h 文件。

每个移植还将 'BaseType_t' 类型定义为该处理器的最有效数据类型。 ATmega-0 移植将 'BaseType_t' 定义为 char(8 位):

  • #define portBASE_TYPE char

注意:滴答定时器选项列表包含可用于 ATmega-0 系列中较大成员的选项。请 参阅可用选项列表中的特定设备数据表。

编译器使用的内存区域

FreeRTOS 移植需要您定义编译器使用的堆和堆栈。这样做是为了容纳 更全面的演示示例(Full 演示),但是您可以根据应用程序的实现自定义大小 。当前移植使用以下定义(所有工具/编译器都有类似的定义):

  • #define configTOTAL_HEAP_SIZE 0x1000
  • #define configMINIMAL_STACK_SIZE 120

注意:IAR 编译器需要两个堆栈(CSTACKRSTACK);CSTACK 配置为120 字节,RSTACK 配置为 30 字节。

内存分配

Source/Portable/MemMang/heap_1.c 包含在 ATmega4809 演示应用程序项目中, 以提供 RTOS 内核所需的内存分配。请参阅 API 文档的内存管理部分, 获取完整信息。

演示应用程序 USART 和移植驱动程序

demos 应用程序文件夹包含两个驱动程序的示例。

  • USART 驱动程序包含在 serial.c 文件中。它是一个基于中断的驱动程序, 使用连接到板载调试器 USART 的 USART 实例。这样,您就可以在电脑上查看串行通信测试 (ComTest) 任务发送的消息,除板本身和 USB 电缆外,无需使用任何特殊硬件 。由于 ComTest 会验证发送的数据是否被正确接收,因此 USART 驱动程序启用了 RX 和 TX 信号之间的内部环回连接。
  • 演示应用程序包括一个名为 partest.c 的文件,该文件是 MCU 的完整移植的驱动程序。 (该名称具有历史意义,后来失去了其含义,但它源自 'parallel port test'。)该文件包含 用于设置 LED、清除 LED 和切换 LED 的接口函数。在这些示例中,移植 C 被选为 连接板载 LED 的移植。要将演示从硬件平台移植到其他平台, 首先要让 LED 输出正常工作,因此我们选择了 LED 引脚。对于选定的硬件平台 (ATmega4809 Curiosity Nano),由 partest.c 控制的其他 LED 引脚未与 LED 物理连接。

其他注意事项

无需阅读本节即可使用移植。

使用其他硬件平台

之所以选择 ATmega4809 Curiosity Nano 是因为其功能易于使用, 但您也可以轻松使用其他任何硬件平台。滴答定时器的多个可用选项以及可用演示有助于 在 ATmega-0 系列中的任何设备上开发 FreeRTOS 应用程序。

使用其他 ATmega-0 设备

FreeRTOS 演示移植可在此系列中的任何设备上运行。只需在开发工具配置窗口中更改设备类型, 然后重新编译项目即可。使用的任务数量以及应用程序的复杂性 指定了程序和数据内存的大小,从而表明可以使用哪个设备。

滴答定时器选择

所有可用的演示移植都使用 TCB0 作为默认滴答定时器 (#define configUSE_TIMER_INSTANCE 0)。此定时器 适用于所有 ATmega-0 设备。您也可以使用 configUSE_TIMER_INSTANCE 来选择其他定时器,如下所示(请参阅 FreeRTOS_Config.h 文件获取可用选项):

  • #define configUSE_TIMER_INSTANCE 0——使用 TCB0 作为滴答定时器
  • #define configUSE_TIMER_INSTANCE 1——使用 TCB1 作为滴答定时器
  • #define configUSE_TIMER_INSTANCE 2——使用 TCB2 作为滴答定时器
  • #define configUSE_TIMER_INSTANCE 3 - 使用 TCB3 作为滴答定时器
  • #define configUSE_TIMER_INSTANCE 4 - 使用 RTC 作为滴答定时器

时钟配置

ATmega-0 移植使用片上振荡器作为主时钟。考虑到其内部架构,内部时钟只能 使用特定的预定义值。为方便您使用 ATmega-0 平台,我们还提供了一个 clk_config.h 文件。此文件包含支持的时钟配置列表、时钟初始化程序 (clk_init()),并使用 #define configCPU_CLOCK_HZ(位于 FreeRTOS_Config.h 文件) 作为输入。

串口配置

mainSELECTED_APPLICATION 设置为 1 时,项目包含一个中断驱动的驱动程序示例,用于串行通信, 该驱动程序使用了 USART3 实例(serial.c 文件)。必要时,任何其他可用 USART 实例 (USART0-3) 可直接作为替代实例使用。此外,还应配置 USART Rx 和 Tx 引脚。我们已针对当前演示 在硬件初始化过程中完成了配置:

void init_minimal( void ) 
{ 
    /* Configure UART pins: PB1 Rx, PB0 Tx */ 
    PORTC.DIR &= ~PIN0_bm; 
    PORTC.DIR |= PIN1_bm;

    ... 
} 

LED 移植配置

LED 是获取演示应用程序运行视觉反馈的最简单方法,因此很有必要尽快使用新硬件平台上的 LED。

无论是向其中移植演示的硬件平台还是在其中开发演示的硬件平台,它们的 LED 不太可能出现在相同 IO 移植上, 因此需要做出少许修改。

partest.c 文件中的 vParTestInitialise() 函数包含 IO 移植模式和指示 配置。main.c 中的 prvSetupHardware() 函数包含额外的通用硬件配置, 可能也需要根据所使用的移植进行修改。

对上段提到的两个函数进行必要的修改,然后编写一个简单的程序, 以检查 LED 输出是否正常工作。

使用中断

如果没有特殊要求,可以使用不用于上下文切换的中断。中断矢量的安装方法 取决于所使用的移植和编译器。请参阅您正在使用的移植的现有演示。如果 中断用于上下文切换,则需要对其进行特殊处理。请参阅 serial.c 和移植文件, 获取用于上下文切换的中断使用示例。

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.