目前,基于 Philips LPC2000 ARM7 的嵌入式微控制器包含四个 FreeRTOS 移植。 此页面仅涉及 IAR 开发工具移植。 该移植在 MCB2100 开发板/原型板 上 使用 J-Link USB JTAG 接口开发(如果您希望使用替代开发板,我们也提供了说明)。 MCB2100 是一款功能齐全的原型板,可轻松访问 LPC2129 外设, 包括 8 个由 FreeRTOS 演示应用程序使用的内置 LED。 注意:如果项目构建失败,可能是使用的 IAR 嵌入式工作台版本过低。 如果构建失败, 那么也可能是项目文件(在无提示的情况下)已经损坏,因此需要 将其恢复至初始状态,然后才能使用新版本的 IAR 构建项目。
重要提示!使用 IAR LPC2000RTOS 移植的注意事项使用此 RTOS 移植之前,请阅读以下所有要点。另请参阅常见问题:我的应用程序未运行,问题可能出在哪里? 源代码组织FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码,因此包含的文件多于此演示使用的文件。 请参阅源代码组织部分,获取 下载文件的描述和有关创建新项目的信息。此演示的 IAR Embedded Workbench 文件位于 Demo/ARM7_LPC2129_IAR 目录。 其中还包含 main.c,源文件包含 main() 函数。
Demo/ARM7_LPC2129_IAR/SrcIAR 和 Demo/ARM7_LPC2129_IAR/resource 目录
包含 IAR Philips 构建环境的支持文件。
演示应用程序FreeRTOS 源代码下载包含用于 IAR LPC2129 RTOS 移植的完全抢占式多任务演示应用程序。功能可使用 IAR 开发工具 KickStart 版本构建演示应用程序,该版本文件大小限制 为 32K 字节。项目文件中提供了两个配置:“Flash Debug ”(无优化)和 “Flash Bin ”(完全优化)(不包括静态群集选项)。 此演示应用程序可创建 25 个标准演示任务、一个空闲任务和一个“check”任务。 (请参阅演示应用程序部分,了解各个任务的详细信息)。 如果演示应用程序正确执行,其表现如下:
演示应用程序硬件设置演示应用程序包括通过串行端口发送和接收字符的任务。 一个任务发送的字符 需要另一个任务来接收,如果任何字符被遗漏或接收顺序错误,则标记错误情况。 串行端口上 需要一个环回连接器才能让此机制正常运行(只需在 COM 0 的 P2 串行端口连接器上 将引脚 2 和 3 连接在一起)。演示应用程序使用原型板中内置的 LED,因此不需要其他硬件设置。 构建演示应用程序只需在 IARIDE 中打开 RTOSDemo.ewp 项目工作区文件,选择所需的配置, 然后在 IDE "Project" 菜单中 选择 "Make"。 应用程序应能成功构建,不出现任何错误或警告。
选择 "Flash Debug" 配置 运行演示应用程序无法使用 IAR 模拟器执行 IAR 移植,因此必须在目标硬件上执行:
可选择使用“项目选项”对话框 中的“调试器”类别替代 JTAG 接口。
配置和用法详情RTOS 移植特定配置此移植的特定配置项目位于 Demo/ARM7_LPC2129_IAR/FreeRTOSConfig.h 中。 可以编辑此文件中定义的常量 编辑此文件中定义的常量。 特别是,可通过定义 configTICK_RATE_HZ 来设置 RTOS 滴答的频率。 演示项目提供的数值 1000 Hz 可用于测试 RTOS 内核功能,但 此速度超过了大部分应用程序的要求。 降低此值将提高效率。每个移植都会将 "BaseType_t" 定义为该处理器的最有效数据类型。 本移植将 BaseType_t 定义为长整型。 请注意,vPortEndScheduler() 尚未实现。 中断服务程序不会引起上下文切换的中断服务程序没有特殊要求,可以按照 正常的 IAR 语法写入。 例如:static __arm __irq void vAnISR( void ) { /* ISR C code goes here. */ /* End the interrupt in the VIC. */ VICVectAddr = 0; } 通常情况下,您需要中断服务程序来引起上下文切换。 例如,正在被接收的串行端口字符 可能会唤醒在等待该字符时被阻塞的高优先级任务。 如果 ISR 中断了一个优先级较低的任务, 则其应立即返回到已被唤醒的任务。 由于 IAR 内联汇编器的限制, 中断服务程序必须包含汇编文件包装器。
具备上下文切换功能的 ISR 示例可按照下列模板,在任何源文件中用 C 语言编写 ISR 主体部分。 这只是一个普通的 ARM 模式函数,其结尾处包括对 END_SWITCHING_ISR() 的调用。/* For simplicity the C function should operate in ARM mode. Note that the __irq modifier is NOT used. */ __arm void vASwitchingISR( void ) { char cContextSwitchRequired; /* Write the ISR body here as per normal. A boolean is used to say whether a context switch is required. In this example assume we posted onto a queue and this caused a task to be woken. */ cContextSwitchRequired = pdTRUE; /* Immediately before the end of the ISR call the portEND_SWITCHING_ISR() macro. */ portEND_SWITCHING_ISR( ( cContextSwitchRequired ) ); /* End the interrupt in the VIC. */ VICVectAddr = 0; }有关完整示例,请参阅在 Demo/ARM7_LPC2129_IAR/serial/serial.c 中定义的函数 vSerialISR() 。
ISR 的入口点必须写入汇编文件中。 这只是
在调用 portSAVE_CONTEXT() 和 portRESTORE_CONTEXT() 宏之间分别放置一个 C 函数,具体操作模板如下所示:
使用 LPC2129 以外的部件LPC2129 使用带有特定于处理器的外围设备的标准 ARM7 内核。 核心实时内核组件应该 可以在所有 ARM7 设备上移植,但是需要考虑到外设设置和内存需求。 应考虑以下事项:
在抢占式和协同式 RTOS 内核之间切换将 Demo/ARM7_LPC2129_IAR/FreeRTOSConfig.h 中的定义 configUSE_PREMPTION 设置为 1,可使用抢占式调度; 设置为 0,则可使用协作式。编译器选项与所有的端口一样,使用正确的编译器选项至关重要。 确保这一点的最佳方法是,基于 提供的演示应用程序项目文件构建您的应用程序——就如 源代码组织部分中所述。执行上下文RTOS 调度器以特权模式执行,任务以系统模式执行。
注意!: 启动 RTOS 调度器时(vTaskStartScheduler 被调用),处理器必须处于监管器模式 。 FreeRTOS 下载中包含的演示应用程序, 会在 main 函数调用前切换到监管器模式。 如果您没有使用 这些演示应用程序,那请在调用 vTaskStartScheduler() 之前确保处理器已进入监管者模式。 中断服务例程总是在 ARM 模式下运行。 其他所有代码将运行在 ARM 或 THUMB 模式,这取决于构建。 应该注意的是,portmacro.h 中定义的一些宏只能从 ARM 模式代码调用,而且如果从 THUMB 代码 调用会导致编译时错误。 Embedded Workbench 项目配置为 THUMB 模式,请参阅 LPC2006 GCC 移植, 了解仅使用 ARM 模式所需的配置示例。 Demo/ARM7_LPC2129_IAR/Startup.s 仅为系统/用户、IRQ 和 SWI 模式配置堆栈。 SWI 指令由实时内核使用,不能被应用程序代码使用。 内存分配Source/Portable/MemMang/heap_2.c 包含在 ARM7 演示应用程序的 makefile 中,以提供实时内核所需的 内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。串行端口驱动器此外还需注意的是,编写串行驱动程序是为了测试部分实时内核功能,并不是 用于表示优化过的解决方案。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|