简介本页所述项目演示了 FreeRTOS ARM CORTEX-M0 GCC 移植。 该项目配置是为了在 LPC1114 版本的 LPCXpresso 开发板上运行,使用基于 Eclipse 的免费 LPCXpresso IDE 。使用编译时间选项(如下所述) ,可以将项目配置为 创建基本 blinky 风格的演示,或配置为创建更全面的测试和演示应用程序 (其中包括执行中断嵌套行为的任务)。
重要!使用 LPC1114 LPCXpresso ARM Cortex-M0 演示的注意事项使用此 RTOS 端口之前,请阅读以下所有要点。另请参阅常见问题我的应用程序 未运行,问题可能出在哪里?
源代码组织FreeRTOS 下载包含所有 FreeRTOS 移植的源代码, 因此其中包含的文件远比演示所需的文件多。 请参阅源代码组织 了解关于已下载文件的说明 和新项目创建的信息。FreeRTOS 演示应用程序依赖于 CMSIS 库, 该库已作为单独的 LPCXpresso 项目提供。 演示应用程序项目和 CMSIS 项目 两者都必须导入到 LPCXpresso 工作区。 两个项目均位于 FreeRTOS/Demo/CORTEX_M0_LPC1114_LPCXpresso 目录的子目录中, 可一并导入 LPCXpresso 。 下面的 准备 Eclipse 项目部分 包含关于如何设置演示项目目录 并将演示项目导入 LPCXpresso IDE 的重要信息。
演示应用程序演示应用程序硬件设置该演示采用了集成在 LPCXpresso 开发板上的 LED , 因此不需要任何硬件设置。准备 Eclipse 项目目录Eclipse 项目既可以是标准 makefile 项目,也可以是托管 make 项目。 FreeRTOS LPCXpresso ARM CORTEX-M0 项目使用托管 make 项目。 这 反过来又意味着:
CreateProjectDirectoryStructure.bat 必须在 LPCXpresso 项目导入到 Eclipse 工作区之前执行。 CreateProjectDirectoryStructure.bat 不能 在 LPCXpresso IDE 内部执行。
将演示应用程序和 CMSIS 项目导入 LPCXpresso Eclipse 工作区要想将必要的项目导入现有或新的 Eclipse 工作区:
构建和运行演示应用程序单个 RTOSDemo 项目提供了两种配置。 可配置 为简单的 blinky 风格的项目,或配置为更全面的测试和演示应用程序。 main.c 中的 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 设置为 1 时的功能将 mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 1 会导致 main() 调用 main_blinky()。 main_blinky() 创建了一个非常简单的演示程序, 请参阅下文。
mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 时的功能mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 设置为 0 会导致 main() 调用 main_full()。 main_full() 会创建更全面的测试和演示应用程序, 请参阅下文。
RTOS 配置和使用详情中断服务程序导致上下文切换的中断服务程序 无特殊要求。 portEND_SWITCHING_ISR() 宏可用于从 ISR 内请求上下文切换。请注意,portEND_SWITCHING_ISR() 将启用中断。 中断嵌套测试任务要求配置两个定时器, 以生成中断。 中断服务例程在 IntQueueTimer.c 中定义,并且可用作应用程序编写器的示例。 但是, 此类任务不能直接演示 FreeRTOS 安全 API 函数的使用 (函数以 "FromISR" 结尾)。 因此,在 main.c 的末尾 提供了名为 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 中。 #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler这些定义将 FreeRTOS 内核中断处理程序函数名映射到 CMSIS 中断处理程序函数名中(或是未修正的向量表中使用的任何名称,向量表由编译器提供)。这样, 就可以使用 Code Red 提供的链接器脚本和启动文件,且不加修正。 请注意!: 请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中, 数字越小表示中断优先级越高。 这一点 可能有悖直觉,容易混淆! 如果要将 中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值), (或其他低数字值),因为这会导致该中断在系统中 实际上具有最高优先级。 另外,请勿忘记指定中断优先级, 分配中断优先级,因为默认情况下,中断优先级为 0, 这可能导致其处于最高优先级。 RTOS 移植专用配置这些演示的特定配置项目包含在 FreeRTOS/Demo/CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo/Source/FreeRTOSConfig.h 中。 main.c 顶部的 编辑 FreeRTOSConfig.h 中定义的常量,使其适合您的应用程序。 尤其是以下常量:
每个移植都将 "BaseType_t" 定义为 数据类型。 此移植将 BaseType_t 定义为长类型。 请注意,vPortEndScheduler() 尚未实现。 在抢占式和协同式 RTOS 内核之间切换将 FreeRTOS/Demo/CORTEX_M0_LPC1114_LPCXpresso/RTOSDemo/Source/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为1,可使用抢占式调度; 设置为0,可使用协同式调度。内存分配Source/Portable/MemMang/heap_1.c 包含在 ARM Cortex-M0 演示应用程序项目中,用于 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 获取完整信息。Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|