下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Infineon XMC1000 ARM Cortex-M0 演示
支持 IAR、Keil 和 GCC 编译器
[RTOS 移植]


ARM Cortex-M0 RTOS
XMC1300 boot 套件


简介

本页介绍了适用于 ARM Cortex-M0 微控制器的 Infineon XMC1000 系列的演示应用程序 。

以下 ARM Cortex-M0 编译器均已提供预配置项目:

每个项目包含三个构建配置, 分别对应以下三个 XMC1000 评估板:

每个构建配置均可以使用 #define 进一步配置, 来创建简单的 blinky 风格应用程序,或更全面的测试和演示 应用程序。


与 FreeRTOS 编译器一起使用的 IAR 内核感知调试器
FreeRTOS 状态查看器插件的屏幕截图
该插件为 IAR IDE 附带


注意: 如果 IAR 项目未能构建,可能是 IAR Embedded Workbench 版本过低。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 从主 FreeRTOS zip 下载文件还原到原始状态后才可以构建, 即使 EWARM 版本已更新。



重要!使用 XMC1000 ARM Cortex-M0 演示的注意事项

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

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



源代码组织

FreeRTOS 下载包含所有 FreeRTOS 移植的源代码, 因此包含的文件比 XMC1000 演示所需的文件多得多。 请参阅源代码组织 了解关于已下载文件的说明 和新项目创建的信息。

支持的所有三个编译器的项目文件位于 FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC 目录。

  • IAR Embedded Workbench 项目名为 RTOSDemo.eww
  • Keil 项目名为 RTOSDemo.uvproj
  • Atollic TrueSTUDIO 项目采用常见的 Eclipse 项目名称 .project



构建和运行 ARM CORTEX-M0 RTOS 应用程序

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 常量。

演示使用了内置在 Boot 套件 PCB 上的 LED , 因此不需要任何硬件设置。 任何跳线和开关都应保持在 默认位置。

以下各小节介绍了如何使用这三种 支持的 ARM Cortex-M0 编译器和工具链。

  1. 使用 IAR Embedded Workbench 构建
  2. 使用 ARM Keil 构建
  3. 使用 ARM GCC 在 Atollic TrueSTUDIO Eclipse IDE 构建


使用 IAR Embedded Workbench 构建

  1. 打开 FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/RTOSDemo.eww (位于 IAR Embedded Workbench IDE 中)。

  2. 为目标硬件的构建配置设置正确选项。 XMC1100、XMC1200 和 XMC1300 boot 套件的构建配置已提供 。 使用 EWARM IDE 工作区窗口顶部的下拉列表 设置活动构建配置。

  3. 从 IAR Embedded Workbench 的 "Project" 菜单中选择 "Rebuild All"(或按 F7) 以构建演示项目。

  4. 用 USB 缆线连接 主机和所选 XMC1000 boot 套件上的 USB 端口。

  5. 在 IAR Embedded Workbench 的 "Project" 菜单中选择 "Download and Debug" 对微控制器闪存进行编程并启动调试会话 。


使用 ARM Keil 构建

  1. 打开 FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/RTOSDemo.uvproj (位于 Keil IDE 中)。

  2. 为目标硬件的构建配置(在 Keil IDE 中称为目标 ) 设置正确选项。 XMC1100、XMC1200 和 XMC1300 boot 套件的构建配置已提供 。 活动构建配置通常显示在 IDE 菜单工具栏的下拉列表中。

  3. 从 Keil 的 "Project" 菜单中选择 "Rebuild Target"(或按 F7) 以构建演示项目。

  4. 用 USB 缆线连接 主机和所选 XMC1000 boot 套件上的 USB 端口。

  5. 从 Keil 的 "Project" 菜单中选择 "Start/Stop Debug Session" 对微控制器闪存进行编程并启动调试会话 。


使用 ARM GCC 在 Atollic TrueSTUDIO Eclipse IDE 构建

请注意, Eclipse 项目使用的文件引用与项目位置相关。 该项目或其引用的任何文件不得 改变其在 FreeRTOS 目录结构中的默认位置 (此目录结构在 FreeRTOS 下载包解压时创建)。
  1. 启动 Eclipse IDE ,根据提示创建创建一个新的或选择一个现有的 工作区。

  2. 在 IDE 的 "File" 菜单中选择 "Import"。 系统将显示 如下对话框。 选择 "General->Existing Project into Workspace",如下所示。

    将 Cortex-M0 RTOS 演示项目导入 Atollic TrueSTUDIO Eclipse IDE
    首次点击 "Import" 时显示的对话框


  3. 在下一个对话框中,选择 FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC 作为根目录。 确保 RTOSDemo 项目在 "Projects" 区域中已勾选, 并确保 “Copy Projects Into Workspace” 勾选,然后单击 "Finish" 按钮(请参阅下图查看正确的复选框状态)。

    导入到 Eclipse CDT 时选择 RTOS 源代码
    确保 RTOSDemo 已勾选,并且未勾选 "Copy projects into workspace"


  4. 导入项目后,右键单击 Eclipse 项目浏览器窗口中的项目名称, 然后使用弹出菜单中的 "Build Configurations->Set Active" 选项, 为目标硬件的构建配置设置正确选项。 XMC1100、XMC1200 和 XMC1300 boot 套件的构建配置已提供 。

  5. 从 Eclipse 的 "Project" 菜单中选择 "Rebuild Project", 以构建演示项目。

  6. 用 USB 缆线连接 主机和所选 XMC1000 boot 套件上的 USB 端口。

  7. 从 Eclipse 的 "Run" 菜单中选择 "Debug", 以进行启动配置, 用于对微控制器闪存进行编程并启动调试会话。


演示应用程序功能

mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 时的功能

mainCREATE_SIMPLE_BLINKY_DEMO_ 设置为1时,进行构建会导致 main () 调用 main_blinky()。 main_blinky() 创建了一个非常简单的演示程序, 请参阅下文。
  • main_blinky() 函数:

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

  • 队列发送任务:

    队列发送任务由 main_blinky.c 中的 prvQueueSendTask() 函数实现。 prvQueueSendTask() 处于一个循环中, 在将值100发送到 main_blinky() 创建的队列之前,该任务会被重复阻塞 200 毫秒。

  • 队列接收任务:

    队列接收任务由 main_blinky.c 中的 prvQueueReceiveTask() 函数实现 。 prvQueueReceiveTask() 处于一个循环中, 会重复阻塞从 main_blinky() 创建的队列中读取数据的尝试。 接收到数据时, 该任务自动解除阻塞,检查数据的值,检查该值是否等于 预期的100 ,并切换 LED。

    传递给队列接收函数的 "block time" 参数规定, 此任务应当无限期地保持在“已阻塞”状态, 直到队列上有可用数据为止。 只有当 队列发送任务写入队列时,队列接收任务才会解除“已阻塞” 。 由于队列发送任务每 200 毫秒向队列写入一次, 队列接收任务每 200 毫秒解除一次“已阻塞”状态, 因此 LED 每 200 毫秒切换一次。


mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能

mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为0时,进行构建会导致 main () 调用 main_full()。 main_full() 会创建更全面的测试和演示应用程序, 请参阅下文。
  • main_full() 函数:

    main_full () 创建了一组标准演示任务 ,一些应用程序专用 测试任务和一个定时器。 然后它会启动 调度器。

  • “寄存器测试”任务:

    这些任务用已知值填充寄存器,然后检查 每个寄存器在整个任务生命周期内是否保持其预期值 。 每个任务使用不同的值集。 寄存器测试任务以非常低的优先级执行, 因此经常被抢占。 包含意外值的寄存器 表示上下文切换机制中存在错误 。

  • “中断信号量获取”任务

    此任务仅阻止 tick hook 函数(在 main.c 中定义)“释放”的信号量。 任务 接收信号量时,会切换 LED 4。 信号量 每隔50 毫秒释放一次,因此 LED 4 每50 毫秒就切换一次。

  • “检查”软件定时器:

    检查软件定时器的周期最初设置为三 秒。 其回调函数检查所有标准演示任务和 寄存器检查任务是否仍在执行, 且执行时是否报告任何错误。 如果检查定时器回调发现 任务已停顿,或报告了错误,之后它会将 检查定时器的周期从最初的三秒钟更改为仅 200 毫秒。 每次调用回调函数时, 也会切换 LED 5。 系统状态 的直观体现为: 如果 LED 5 每三秒钟切换一次, 则表示没有发现任何问题。 如果 LED 每 200 毫秒切换一次, 则已在至少一个任务中发现问题



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中包含了以下行,以将中断处理程序函数名称FreeRTOS映射 中断处理程序函数映射到 CMSIS 中断处理程序函数名称上。 这使编译器工具供应商提供的链接器脚本可 在无需修改的情况下使用。

	#define vPortSVCHandler      SVC_Handler
	#define xPortPendSVHandler   PendSV_Handler
	#define xPortSysTickHandler  SysTick_Handler


RTOS 移植特定配置

这些演示的特定配置项目包含在 FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/FreeRTOSConfig.h 中。 编译在此项目中的 编辑 FreeRTOSConfig.h 中定义的常量,使其适合您的应用程序。 尤其是以下常量:
  • configTICK_RATE_HZ

    此常量设置了 RTOS 滴答中断的频率。 提供的 500Hz 值可用于 测试 RTOS 内核功能,但比大多数应用程序要求的速度更快。 降低此值可提高效率。

每个移植都将 "BaseType_t" 定义为 对处理器而言最有效的数据类型。 所有 ARM Cortex-M0 移植都将 BaseType_t 定义为长整型。

请注意,vPortEndScheduler() 尚未实现。


在抢占式和协同式 RTOS 内核之间切换

FreeRTOS/Demo/CORTEX_M0_Infineon_XMC1000_IAR_Keil_GCC/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式调度; 设置为 0,则可使用协同式。


内存分配

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




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