目前,基于 Philips LPC2000 ARM7 的嵌入式微控制器包含四个 FreeRTOS 移植,本页 仅涉及 GCC 移植。此演示同时支持 ARM 和 THUMB 模式。 该移植 使用 LPC-P2106 低成本原型板进行开发 (如果您希望使用替代开发板,我们也提供了说明), 并使用开源 GNUARM 开发工具(编译器和调试器)。 FreeRTOS 下载包括一个全面的 ARM7 RTOS 移植演示应用程序,可创建并执行 32 个实时任务。 还包括两个单独的嵌入式以太网 TCP/IP Web 服务器示例应用程序。 重要提示!使用 LPC2106 RTOS 移植的注意事项使用此 RTOS 移植之前,请阅读以下所有要点。另请参阅常见问题:我的应用程序未运行,问题可能出在哪里? 源代码组织FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码。 请参阅源代码组织部分, 下载文件的描述和有关创建新项目的信息。LPC2106 GCC 演示应用程序的生成文件位于 FreeRTOS/Demo/ARM7_LPC2106_GCC 目录。 FreeRTOS/Demo/ARM7_LPC2106_GCC/Serial 目录中包含一个中断驱动的串行端口驱动程序示例。 演示应用程序FreeRTOS 源代码下载包含用于 LPC2000 GCC RTOS 移植的完全抢占式多任务演示应用程序。ARM、THUMB、ROM 和 RAM 版本提供以下批处理文件来构建演示应用程序。 批处理文件 先调用 make,然后再为相关版本设置必要的环境变量。
RTOS 演示应用程序硬件设置演示应用程序包括 ComTest 任务,其中一个任务会向另一个任务传输 RS232 字符。 要正确执行此实时任务, 必须将环回连接器安装到原型板的 RS232 端口 (9 路连接器上的引脚 2 和 3 必须连接在一起)。有三个 "flash"(闪烁)实时任务,假定 LED 安装到引脚 P0.10、P0.11 和 P0.12。 忽略这些 LED 不会 不会导致 RTOS 演示应用程序失败,但会移除一些表明一切都按预期运行的视觉反馈。 此外,ComTest Tx 任务发送的每个字符都会切换引脚 P0.13。 并非所有任务都会改变 LED,所以没有可见的指示来表明它们运行正常。 因此,系统创建了一个 "check"(检查)任务,用于确保所有其他任务中没有检测到任何错误。 板载 LED 由检查 "check" 任务控制,用于指示 RTOS 演示应用程序的状态。 如果所有实时任务都按预期执行并且没有发生错误, 则此 LED 将每 3 秒切换一次。 如果切换速率增加到 500 毫秒, 则表示至少有一个任务发生错误。 可通过移除环回连接器故意创建一个错误, 来测试此机制。 有关 RTOS 演示应用程序任务的更多信息,请参阅本网站的演示应用程序部分。 构建和执行 RTOS 演示应用程序 - 单独运行于闪存RTOS 演示应用程序在闪存和 RAM 都能执行。 本节介绍如何创建 发布版本并将其写入 LPC2106 闪存。 假设 GNUARM 和 UNXUTILS 开发工具 已正确安装并包含在 PATH 中(以便在 Windows DOS 提示下使用)。
构建应用程序:
准备原型板以供下载:
将 RTOS 演示下载到闪存:
编程后运行 RTOS 演示应用程序 :
构建和执行演示应用程序——通过 JTAG 调试本节介绍了如何使用 低成本 WIGGLER 兼容 JTAG 接口的调试器。 调试器和 JTAG WIGGLER 之间的接口使用名为 OCDLibRemote 的实用程序。 同样, 假定 GNUARM 和 UNXUTILS 开发工具已正确安装, 并包含在 PATH 中(以便在 Windows DOS 提示下使用)。
构建应用程序 :
准备原型板以供调试:
设置 OCDLibRemote:
使用调试器 :
提示:调试器运行良好,而“寄存器”菜单项出现错误。 要查看寄存器内容, 请打开控制台 (CTRL+N),然后在控制台中键入 "info registers"。
配置和用法详情Win32 GNU 开发工具预构建的 GNU ARM7 开发工具可以从多个位置获取。 我在 Windows 2000 主机上使用从 http://www.gnuarm.com 获取的开发工具。 二进制 发行版包括便捷安装程序。安装程序会安装所需的一切。 一些 GNU 开发工具 的发行版需要单独安装 Cygwin,相比之下不太方便。此外,还需要 GNU make 兼容实用程序, 我使用的是 UNXUTILS 版本。 RTOS 移植特定配置此移植的特定配置项目位于 Source/Demo/ARM7_LPC2106_GCC/FreeRTOSConfig.h。 可编辑此文件中定义的常量, 编辑此文件中定义的常量。 特别是,可通过定义 configTICK_RATE_HZ 来设置 RTOS 滴答的频率。 演示项目提供的数值 1000 Hz 可用于测试 RTOS 内核功能,但 此速度超过了大部分应用程序的要求。 降低此值将提高效率。每个移植都会将 "BaseType_t" 定义为该处理器的最有效数据类型。 本移植将 BaseType_t 定义为长整型。 请注意,vPortEndScheduler() 尚未实现。 中断服务程序不会引起上下文切换的中断服务程序没有特殊要求,可以正常编写。 例如 :void vASimpleISR( void ) __attribute__((interrupt("IRQ"))); void vASimpleISR( void ) { /* ISR code goes here. */ } 注意:在 ISR 内强制切换上下文的方法从 FreeRTOS V4.5.0 开始已发生更改。 很遗憾,新方法 使用不同的语法,但不再依赖于使用的编译器的版本、命令行开关或优化级别。 因此改用这里描述的方法,今后应该无需再做任何修改。 此处的示例假设中断处理程序被直接矢量化,也就是说,没有所有中断通用的入口代码 。 一些其他 FreeRTOS 演示应用程序被配置为使用通用入口,作为此方法的替代方法。 编写可以引起上下文切换的中断服务程序:
/* Declare the wrapper function using the naked attribute.*/ void vASwitchCompatibleISR_Wrapper( void ) __attribute__ ((naked)); /* Declare the handler function as an ordinary function.*/ void vASwitchCompatibleISR_Handler( void ); /* The handler function is just an ordinary function. */ void vASwitchCompatibleISR_Handler( void ) { long lSwitchRequired = pdFALSE; /* ISR code comes here. If the ISR wakes a task then lSwitchRequired should be set to 1. */ /* If the ISR caused a task to unblock, and the priority of the unblocked task is higher than the priority of the interrupted task then the ISR should return directly into the unblocked task. portYIELD_FROM_ISR() is used for this purpose. */ if( lSwitchRequired ) { portYIELD_FROM_ISR(); } } void vASwitchCompatibleISR_Wrapper( void ) { /* Save the context of the interrupted task. */ portSAVE_CONTEXT(); Call the handler function. This must be a separate function unless you can guarantee that handling the interrupt will never use any stack space. */ vASwitchCompatibleISR_Handler(); /* Restore the context of the task that is going to execute next. This might not be the same as the originally interrupted task.*/ portRESTORE_CONTEXT(); } 请参阅 Demo/ARM7_LPC2106_GCC/serial/serial.c 中定义的 vUART_ISR(),获取完整示例。 使用 LPC2106 以外的部件LPC2106 使用标准 ARM7 内核,并配备处理器特定外围设备。 核心实时内核组件应该 能够在所有 ARM7 设备上移植,但需要考虑外围设备的设置和内存要求。 应考虑的事项:
在抢占式和协作式 RTOS 内核之间切换将 Demo/ARM7_LPC2106_GCC/FreeRTOSConfig.h 中的定义 configUSE_PREMPTION 设置为 1,可使用抢占式调度; 设置为 0,则可使用协作式。编译器选项与所有的端口一样,使用正确的编译器选项至关重要。 要确保这一点,最佳方法是 基于提供的演示应用程序生成文件构建应用程序。执行上下文RTOS 调度器以特权模式执行,任务以系统模式执行。注意!: 启动 RTOS 调度器时(vTaskStartScheduler 被调用),处理器必须处于监管器模式 。 FreeRTOS 下载中包含的演示应用程序, 会在 main 函数调用前切换到监管器模式。 如果您没有使用 这些演示应用程序,那请在调用 vTaskStartScheduler() 之前确保处理器已进入监管者模式。 中断服务例程总是在 ARM 模式下运行。 其他所有代码将运行在 ARM 或 THUMB 模式,这取决于构建。 应该注意的是,portmacro.h 中定义的一些宏只能从 ARM 模式代码调用,而且如果从 THUMB 代码 调用会导致编译时错误。 Demo/ARM7_LPC2106_GCC/boot.s 仅为系统/用户、IRQ 和 SWI 模式配置堆栈。 SWI 指令由实时内核使用,因此应用程序代码不能使用。 内存分配LPC2000 演示应用程序生成文件包含 Source/Portable/MemMang/heap_2.c, 以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 以获取完整信息。串行端口驱动器此外还需注意的是,编写串行驱动程序是为了测试部分实时内核功能,并不是 为了提供一个优化的解决方案。
Linux 用户注意事项:我仅使用 GNUARM 开发工具的 Win32 版本测试了生成文件。Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|