下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

NXP LPC43xx ARM Cortex-M4F 演示
使用 Keil MDK 开发工具
[RTOS 移植]


NXP LPC4300 系列微控制器



本页记录的 FreeRTOS ARM Cortex-M4F 演示应用程序面向 NXP LPC43xx 微控制器。 应用程序一个 Keil 项目,预配置为可在 Hitex 提供的 LPC4350 开发板上 运行。 LPC4350 演示项目将在未来几周内更新, 更新后也将支持 LPC4350 的基于 ARM Cortex-M0 的协处理器。

演示将 LPC4350 配置为以 204MHz 运行。 请参阅下面 RTOS 配置 和使用部分中的说明。

FreeRTOS ARM CORTEX-M4F 移植支持完整的中断嵌套模型,从不 完全禁用中断。 仅当 在用于构建源文件的项目编译时间选项中打开硬件浮点支持时 才能使用此移植。 不包含浮点单元的 ARM Cortex-M4 设备 不应使用此移植,而应使用 FreeRTOS ARM Cortex-M3 移植层。

请注意,需要 Keil MDK 4.2.2 或更高版本以确保 no_allow_fpreg_for_nonfpdata 编译器 选项可用。


重要提示!使用 FreeRTOS Keil LPC4300 演示项目的注意事项

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

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

源代码组织

FreeRTOS zip 下载文件中包含所有 FreeRTOS 移植 以及每个演示应用程序项目的源代码。 因此,该下载包含的文件远多于构建和运行 NXP LPC4350 演示所需的文件。请参阅 源代码组织部分, 获取对已下载文件的描述以及关于创建新项目的信息。

LPC4350 上的 ARM Cortex-M4F 核心的 Keil MDK 演示项目称为 M4.uvproj, 位于 FreeRTOS/Demo/CORTEX_M4F_M0_LPC43xx_Keil/M4 目录下, 该目录位于官方 FreeRTOS .zip 文件下载中。 FreeRTOS/Demo/CORTEX_M4F_M0_LPC43xx_Keil/M0 目录当前为空,并作为占位符,为不久的将来增加 对 LPC4350 协处理器核心的支持做准备。



NXP LPC4350演示应用程序

功能

此演示应用程序会演示以下几个方面:

可对演示应用程序进行配置,使其提供非常简单的 "blinky" 样式的演示, 或者提供 FreeRTOS 功能的完整全面测试和演示。 配置构建的由常量 #define mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY 控制,该常量 在 main.c 中定义。

演示应用程序任务分为标准演示任务 和演示特定任务。 所有 FreeRTOS 移植和演示应用程序都使用标准演示任务。 这些任务仅用于演示 FreeRTOS API 和测试移植,没有其他用途。

mainCREATE_SIMPLE_LED_FLASHER_DEMO_ONLY 设置
说明
设置为 1 创建一个非常简单的示例 , 该示例下创建了三个标准的演示“闪烁”任务。 这三个任务分别按固定的不同频率触发 LED 切换状态。 使用 LED3、LED2 和 LED1 这几个 LED。

设置为 0 这是一个非常全面的演示,会创建 46 个任务, 之后启动 RTOS 调度器。 随后在应用程序执行过程中, 它会持续创建和删除另外两个任务。

此演示包含大量队列、软件定时器和各种不同类型的信号量。 这些任务主要由 标准演示任务组成。

还创建了面向应用程序的“寄存器测试”任务。 开始执行这些任务之前,需使用已知的值填充所有通用寄存器和浮点寄存器 。 然后,任务反复检查 每个寄存器是否在任务的生命周期内均保持已写入的值不变 。 该任务按空闲优先级运行,因此经常会退出并重新进入 运行状态。 这两个寄存器检查 任务分别使用不同的值,如果寄存器包含意外值, 则表明上下文切换 机制中存在错误。

创建一个“检查”软件定时器,用于定期检查标准 演示任务和寄存器测试任务,以确保所有任务 都按预期运行。 检查软件定时器的 回调函数会切换 LED LED0。 为系统健康提供了 直观反馈。 如果 LED LED0 每 3 秒切换一次,则 检查软件定时器未发现任何问题。 如果 LED LED0 每 200 毫秒切换一次,则表明检查软件定时器 在一个或多个任务中发现了问题。

就像简单的闪光灯演示一样, 全面的演示会创建标准演示闪烁任务,该任务会按固定的不同频率 切换 LED3、LED2 和 LED1 这几个 LED。


硬件设置

演示使用的是直接焊接到 Hitex 印刷电路板上的 LED, 因此不需要进行硬件设置。


构建和执行演示应用程序

  1. 确保已使用合适接口将目标硬件 连接到主机。 该项目已经过 ULINK2 和 ULINK ME 的测试。

  2. 从 Keil IDE 中打开 M4.uvproj Keil 项目。

  3. 在 IDE 的 "Project" 菜单中选择 "Build" 或直接按 F7。 此项目 应该在没有任何错误或警告的情况下构建。

  4. 构建完成后,从 IDE 的 "Debug" 菜单中选择 "Start/Stop Debug Session" (或直接按 CTRL+F5),即可对微控制器闪存进行编程, 然后启动调试会话。 执行将在进入 main() 函数时 中断。



RTOS 配置和使用详情


Cortex-M4FFreeRTOS 移植相关配置

此演示的相关配置项位于 FreeRTOS/Demo/CORTEX_M4F_M0_LPC43xx_Keil/M4/FreeRTOSConfig.h您可以编辑此文件中定义的常量,使其适合您的应用程序。 特别是:
  • configTICK_RATE_HZ

    此常量设置了 RTOS tick 中断的频率。 提供的数值 1000 Hz 可用于 测试 RTOS 内核功能,但这超过了大部分应用程序的频率要求。 降低此值可提高效率。

  • 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-M4F NVIC 寄存器中,configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 是完全等效物,定义为仅使用 LPC4300 上可用的 5 个优先级位。 CMSIS 库函数 NVIC_SetPriority() 需要未移动的 5 位格式。

请注意!: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), 因为这会导致该中断在系统中具有 最高优先级,并且如果这个优先级 高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。

ARM Cortex-M 核心上的最低优先级实际上是 255,但不同 Cortex-M 供应商会实现不同数量的优先级位, 提供期望以不同方式指定优先级的库函数。 例如, LPC ARM Cortex-M 微控制器上可以指定的最低优先级实际上为 31——这是由 FreeRTOSConfig.h 中的常量 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 定义的。 可指定的最高优先级 始终为零。

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

每个移植 #defines 'BaseType_t' 为对该处理器而言最有效的 数据类型。 此移植将 BaseType_t 定义为长整型。


核心时钟配置

演示让 LPC4350 时钟以 204MHz 运行。 要做到这一点,函数就必须 将并行闪存控制器配置为 在 RAM 不足时执行。 这些函数的映射在链接器脚本(散点文件)中执行, 且 Hitex_fast_startup.c 中包含使核心时钟升至 204MHz 的代码。


中断服务程序

与大多数移植不同,引发上下文切换的中断服务程序 无特殊要求,可根据编译器文档编写。 宏 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 semaphore is used for this purpose.  Note
    lHigherPriorityTaskWoken is initialised to zero. */
    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 );
}

只有以 “FromISR” 结尾的 FreeRTOS API 函数可以从 中断服务例程中调用 - 而且中断的优先级须 小于或等于 configMAX_SYSCALL_INTERRUPT_PRIORITY 配置常量设置的 优先级。


FreeRTOS 使用的资源

FreeRTOS 需要独占 SysTick 和 PendSV 中断。 其也使用 SVC 编号 #0。


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

RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式调度; 设置为 0 以使用协作式调度。 选择协作式 RTOS 调度器时,完整的演示应用程序可能 无法正确执行。


编译器选项

与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点, 最佳方法是基于提供的演示应用程序文件构建您的应用程序。


内存分配

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


其他事项

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




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