请注意: 从 FreeRTOS V5.1.0 开始,本页面上展示的演示已经不再使用旧版和已经停止供应的 Keil DKARM 编译器, 改用最新的 Keil/RVDS/ARM 编译器。 该移植是在 MCB2100 开发板/原型板 上使用 ULINK USB JTAG 适配器开发的 (如果您希望使用替代开发板,我们也提供了说明) 。 事实证明,Keil 模拟器也非常有用。 可以从 Hitex 开发工具获得完整的开发套件。 MCB2100 是一款功能齐全的原型板,可轻松访问 LPC2129 外设, 包括 8 个内置 LED ,由 FreeRTOS 演示应用程序使用。 开发工具中包含一整套由编译器、汇编器和链接器组成的工具链、IDE 以及 性能出色的设备专用模拟器。 模拟器中包含“逻辑分析器”功能,可用于监视微控制器 IO, 在模拟环境中提供与 LED 在真实目标硬件上工作时的实际视觉反馈一样的模拟视觉反馈。 不幸的是, 这些工具的评估版受到了限制,ROM 和 RAM 的组合映像大小被限制为 16 KB,这一限制太过严苛,导致无法运行此演示 (因为 FreeRTOS 堆内存包含在 16 KB 中,即使未使用堆内存时,也是如此)。
重要提示!Keil/ARM/RVDS LPC2129 RTOS 移植使用说明使用此 RTOS 移植之前,请阅读以下所有要点。另请参阅常见问题:我的应用程序未运行,问题可能出在哪里? 源代码组织FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码,因此包含的文件远多于运行此演示所需的文件。 请参阅源代码组织部分,获取 下载文件的描述和有关创建新项目的信息。
此演示的 uVision 项目文件称为 RTOSDemo.Uv2,可位于 Demo/ARM7_LPC2129_Keil_RVDS 目录中。
该项目包含两个配置,一个使用 ARM 指令集,另一个使用 THUMB 指令集。
演示应用程序FreeRTOS 源代码下载包含用于 Keil LPC2000 RTOS 移植的完全抢占式多任务演示应用程序。演示应用程序硬件设置演示应用程序包括通过串行端口发送和接收字符的任务。 一个任务发送的字符 需要另一个任务来接收,如果任何字符被遗漏或接收顺序错误,则标记错误情况。 串行端口上 需要一个环回连接器才能让此机制正常运行(只需在 COM 1 的 P1 串行端口连接器上将引脚 2 和 3 连接在一起 ——通常情况下,使用回形针便能实现此目的)。演示应用程序使用原型板中内置的 LED,因此不需要其他硬件设置。 功能此演示应用程序创建了 25 个任务。 如果演示应用程序正确执行,其表现如下:
构建演示应用程序
运行演示应用程序该演示应用程序可以在模拟器中或在目标硬件上执行。 要在模拟器和 JTAG 调试器之间切换:
使用模拟器和逻辑分析器微控制器 IO 端口可以使用模拟器的“逻辑分析器”功能进行监控。 下方 是在模拟演示应用程序时使用逻辑分析器监控某些输出引脚时 的屏幕截图。
监控逻辑分析器中的端口引脚 红线、绿线、蓝线分别表示由 "Flash" 任务控制的引脚 P1.16、P1.17 和 P1.18。 黑线表示 引脚 P1.19,每当传输字符时就会切换该线。 您需要近距离放大, 才能看到为每个传输的字符切换的线路。 模拟时,检查任务会在 "ComTest" 任务中发现一个错误。 这是因为 "ComTest" 任务需要 上述环回连接器。
编写闪存可以在 Keil IDE 中通过 "Flash" 菜单项将演示应用程序编程到微控制器闪存中。 必须重置原型板才能开始执行程序。必须先对闪存进行编程,然后才能使用 JTAG 调试器。
配置和用法详情RTOS 移植特定配置此移植的特定配置项目位于 Demo/ARM7_LPC2129_Keil_RVDS/FreeRTOSConfig.h 中。 可以编辑此文件中定义的常量 编辑此文件中定义的常量。 特别是,可通过定义 configTICK_RATE_HZ 来设置 RTOS 滴答的频率。 演示项目提供的数值 1000 Hz 可用于测试 RTOS 内核功能,但 此速度超过了大部分应用程序的要求。 降低此值将提高效率。每个移植都会将 "BaseType_t" 定义为该处理器的最有效数据类型。 本移植将 BaseType_t 定义为长整型。 请注意,vPortEndScheduler() 尚未实现。 中断服务程序如果中断导致某个任务(通过队列或信号量事件)解除阻塞,并且解除阻塞的任务的优先级高于被中断的任务, 则可能需要从中断服务程序内部进行上下文切换。不会引起上下文切换的中断服务程序没有特殊要求,可以按照 正常的 RVDS 语法写入。 会引起上下文切换的中断服务程序需要用到汇编文件包装器,具体如下所示。
有关完整示例,请参阅演示应用程序中的文件 Demo/ARM7_LPC2129_Keil_RVDS/serial/serialISR.s。 汇编文件包装器调用 C 函数(在上方示例中,该 C 函数被称为 vUART_ISRHandler()), 可以在该函数中实现主中断功能。 C 函数没有特殊要求,因而不需要任何特殊函数 限定符。 有关完整示例,请参阅 Demo/ARM7_LPC2129_Keil_RVDS/serial/serial.c 中的 vUART_ISRHandler() 函数。 vUART_ISRHandler() 还演示了宏 portEXIT_SWITCHING_ISR(),该宏用于确保 在中断退出时选择正确的任务来运行。 使用 LPC2129 以外的部件LPC2129 使用带有特定于处理器的外围设备的标准 ARM7 内核。 核心实时内核组件应该 可以在所有 ARM7 设备上移植,但是需要考虑到外设设置和内存需求。 需要考虑的项目如下:
在抢占式和协同式 RTOS 内核之间切换将 Demo/ARM7_LPC2129_Keil_RVDS/FreeRTOSConfig.h 中的定义 configUSE_PREEMPTION 设置为 1,可使用抢占式; 设置为 0,则可使用协同式。编译器选项与所有的端口一样,使用正确的编译器选项至关重要。 确保这一点的最佳方法是,基于 提供的演示应用程序项目文件构建您的应用程序——就如 源代码组织部分中所述。执行上下文RTOS 调度器以特权模式执行,任务以系统模式执行。注意!: 启动 RTOS 调度器时(vTaskStartScheduler 被调用),处理器必须处于监管器模式 。 FreeRTOS 下载中包含的演示应用程序, 会在 main 函数调用前切换到监管器模式。 如果您没有使用 这些演示应用程序,那请在调用 vTaskStartScheduler() 之前确保处理器已进入监管者模式。 中断服务例程总是在 ARM 模式下运行。 Demo/ARM7_LPC2129_Keil_RVDS/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.
|