任务统计页面 构建和执行演示应用程序使用“标准生成” Eclipse 项目。 这意味着要构建的文件和构建选项在标准生成文件中进行了详细介绍,该生成文件可以使用 Eclipse IDE 进行编辑和查看 。 优化级别由生成文件顶部的 Optim 定义进行设置。
WITTENSTEIN 提供的 FreeRTOS Eclipse 插件 可用于查看任务和队列状态信息:
使用FreeRTOS Eclipse 插件查看器
配置和使用详情RTOS 移植特定配置此演示的特定配置项目包含在 FreeRTOS/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h 中。 可以 在本文件中定义的常量,以适配您的应用程序。 特别是:
每个移植 # 定义 'BaseType_t' 等于该处理器的最有效数据类型。 本移植将 BaseType_t 定义为长整型。 请注意,尚未实现 vPortEndScheduler ()。 写入中断服务例程CodeSourcery 库使用默认处理程序填充中断矢量表-每个处理程序都称为 __ cs3_isr_interrupt_xx () ,其中“xx”是矢量数。 只需提供您自己对处理程序函数的定义,即可覆盖默认处理程序 。 例如,UART1 外围设备使用向量 数字 78 -提供您自己的 UART1 处理程序,表示只需提供您自己对 __ cs3_isr_interrupt_78 () 函数的定义即可。中断服务例程没有特殊要求,可以按照编译器文档进行编写。 宏端口 END_SWITCHING_ISR () 可用于确保中断始终返回到最高优先级 就绪状态任务-可以由 ISR 解除阻塞的任务,因此 ISR 结束时的最高优先级就绪任务 可能不同于输入 ISR 时的最高优先级就绪/正在运行的任务。 可以使用 MCF52233 演示中的 FEC 中断作为示例。 下面的列表 1 提供了另一个示例:
/* The function prototype must use the 'interrupt' attribute.*/ void __attribute__( ( interrupt ) ) __cs3_isr_interrupt_78( void ); Next provide the ISR function, with the correct vector number in the name. NOTE: This is NOT intended to be an example of an efficient ISR. It is provided only to demonstrate using queues from within interrupts. Great efficiency improvements would be gained by simply placing received characters in a RAM buffer, then using a single write to a semaphore to unblock a task if required. void __cs3_isr_interrupt_78( void ) { unsigned char ucChar; BaseType_t xHigherPriorityTaskWoken = pdFALSE, xDoneSomething = pdTRUE; while( xDoneSomething != pdFALSE ) { xDoneSomething = pdFALSE; /* Does the tx buffer contain space? */ if( ( MCF_UART1_USR & MCF_UART_USR_TXRDY ) != 0x00 ) { /* Are there any characters queued to be sent? */ if( xQueueReceiveFromISR( xCharsForTx, &ucChar, &xHigherPriorityTaskWoken ) == pdTRUE ) { /* Send the next char. */ MCF_UART1_UTB = ucChar; xDoneSomething = pdTRUE; } else { /* Turn off the Tx interrupt until such time as another character is being transmitted. */ MCF_UART1_UIMR = serRX_INT; xTxHasEnded = pdTRUE; } } /* Any characters in the receive buffer? */ if( MCF_UART1_USR & MCF_UART_USR_RXRDY ) { /* Queue the character for processing by a task? */ ucChar = MCF_UART1_URB; xQueueSendFromISR( xRxedChars, &ucChar, &xHigherPriorityTaskWoken ); xDoneSomething = pdTRUE; } } /* Finally we call portEND_SWITCHING_ISR(). This ensures that the interrupt returns to the highest priority ready task - which may not be the currently running task if reading from or writing to a queue causes a task of higher priority to unblock. */ portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } 列表 1 : ISR 示例
RTOS内核使用的资源RTOS 内核使用 PIT0 定时器生成 RTOS 滴答 (tick)。 可以更改函数 vApplicationSetupInterrupts() 以使用任何适宜的定时器源。RTOS此外,RTOS 内核还需要一个额外的中断向量。 在 MCF52233 中,中断控制器 0 的向量 16 没有被任何外设使用, 因此是备用的。 RTOS 内核结合中断强制寄存器 0 (INTFRCL0) 使用此向量。 出于效率原因, 假设 RTOS 内核具有此寄存器的独占访问权限,因此不会尝试保持其状态-尽管此操作可 通过使用寄存器上的位集和清除,而非写入整个寄存器,来轻松改变。 为了使用户灵活更改矢量分配,PIT0 和矢量 16 配置都在名为 FreeRTOS _tick_setup.c 的文件中执行, 这是用户应用程序的一部分,而非固定 RTOS 内核代码的一部分。 临界区退出临界区将始终设置中断优先级,以便启用所有中断,无论输入临界区时的级别如何 。 FreeRTOS API 函数本身将使用临界区。执行上下文出于效率原因,任务以主管权限运行。在抢占式和协同式 RTOS 内核之间切换将 FreeRTOS/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h 内的定义 configUSE_PREMPTION 设置为 1 以使用抢占式,或设置为 0 以使用协同式机制。 如果 configIDLE_SHOULD_YIELD 设置为 1,则仅当 configUSE_PREEMPTION 设置为 0 时,演示应用程序才会正确执行 。编译器选项与所有的端口一样,使用正确的编译器选项至关重要。 若要确保这一点, 最佳方法是基于提供的演示应用程序文件构建您的应用程序。内存分配Source/Portable/MemMang/heap_2.c 包含在 ColdFire 演示应用程序项目中,以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 获取完整信息。Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|