硬件设置演示使用的是直接焊接到 Hitex 印刷电路板上的 LED, 因此不需要进行硬件设置。
构建和执行演示应用程序
RTOS 配置和使用详情
Cortex-M4FFreeRTOS 移植相关配置此演示的相关配置项位于 FreeRTOS/Demo/CORTEX_M4F_M0_LPC43xx_Keil/M4/FreeRTOSConfig.h。 您可以编辑此文件中定义的常量,使其适合您的应用程序。 特别是:
请注意!: 请参阅说明如何在 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.
|