TI MSP432 ARM Cortex-M4F RTOS演示
支持 IAR、ARM (Keil) 和 TI (CCS) 编译器
[RTOS 移植]
MSP-EXP432P401R LaunchPad 开发套件
简介
此页面记录的演示应用程序面向
Texas Instruments MSP432 微控制器
——它是采用 ARM Cortex-M4F 核心的 MSP430
低功耗微控制器的变体。
我们为以下三种 ARM Cortex-M4 编译器分别提供了面向 MSP432P401R Launchpad
开发套件的预配置 MSP432 项目:
-
IAR 使用 ARM IDE 嵌入式工作台
-
ARM 使用 uVision IDE
-
TI 使用基于 Code Composer Studio Eclipse 的工具
每个项目都可进行编译,以创建简单的 blinky 演示
或综合测试和演示应用程序。
综合演示使用 FreeRTOS-Plus-CLI
通过 UART 创建一个简单的命令行接口。
blinky 演示使用 FreeRTOS 的无滴答空闲模式来降低功耗。
通过停止 RTOS 滴答中断,微控制器可以维持在深度节能状态,
直到中断发生,或者到了 RTOS 内核
将任务转换为“就绪”状态的时间。
请注意,本文仅演示了通用 ARM Cortex-M 无滴答实现,
以防止进入任何高级 MSP432 低功耗模式,
因此避免了可通过其他方式实现节能效果的演示
。
FreeRTOS 旨在允许通用无滴答模式被
特定于应用程序的实现覆盖。 通过提供特定于目标的无滴答实现,
允许 RTOS 滴答中断
由低功耗时钟而非 ARM Cortex-M SysTick 时钟生成。 之后,
应用程序编写器可以通过使用睡眠前和睡眠后宏将实现定制为特定于
应用的实现。 通过定制特定于 MSP432
的无滴答实现,
可显著降低功耗。
请参阅低功耗支持
和适用于 ARM Cortex-M MCU 的低功耗 RTOS
页面。
FreeRTOS 状态查看器插件的屏幕截图
该插件为 IAR IDE 附带
重要提示!使用 TI MSP432 ARM Cortex-M4F 演示的注意事项
使用此 RTOS 移植之前,请阅读以下所有要点。
- 源代码组织
- 演示应用程序
- RTOS 配置和使用详情
另请参阅常见问题我的应用程序
未运行,问题可能出在哪里?
源代码组织
FreeRTOS 下载文件包含每个 FreeRTOS 移植的源代码和
所有演示应用程序,因此包含的文件数量远多于 MSP432
演示所需的文件。 请参阅本网站源代码组织部分,
了解有关下载文件的描述。
IAR、Keil uVision 和 CCS 项目均位于
/FreeRTOS/Demo/CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil 目录:
-
IAR ARM (EWARM) 嵌入式工作台项目称为 RTOSDemo.eww
-
Keil uVision 项目称为 RTOSDemo.uvproj
-
CCS 项目具有通常的 Eclipse 项目名称 .project
构建和运行 MSP432 ARM Cortex-M4F RTOS 应用程序
RTOS 演示项目可以被配置为建立
一个简单的 blinky 项目,同时演示 FreeRTOS 的通用无滴答低功率模式,
或者一个全面的测试和演示应用。 常量
configCREATE_SIMPLE_TICKLESS_DEMO
在项目的 FreeRTOSConfig.h 文件顶部定义,
用于在二者之间进行切换。
-
如果 configCREATE_SIMPLE_TICKLESS_DEMO
设置为 1,则创建简单的无滴答演示。
-
如果 configCREATE_SIMPLE_TICKLESS_DEMO
设置为 0,则创建全面演示。
请注意本页顶部的注释,
了解使用所演示的通用
无滴答实现与使用特定于 MSP432
的无滴答实现时的节能效果区别。
此演示使用了在 Launchpad 开发套件上构建的 LED,
因此无需进行硬件设置。
以下各小节提供了每个 ARM
Cortex-M4 工具链的使用说明。
-
使用 IAR Embedded Workbench 构建
-
使用 ARM Keil 构建
-
使用 Code Composer Studio 构建
-
IAR 嵌入式工作台应该能够使用可通过 Launchpad 硬件的 USB 连接器访问的
CMSIS DAP 调试接口。
但想要实现最快、最可靠的调试体验,
建议将 JLINK Lite 连接到 Launchpad 硬件的外部 JTAG 连接器。
如果使用的是外部 JTAG 连接器,则使用 Launchpad
硬件的 "JTAG Switch" 必须设置为 "Ext"。
-
打开 FreeRTOS/Demo/CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil/RTOS Demo.eww
(在 IAR 嵌入式工作台 IDE 中打开)。
-
从 IAR 嵌入式工作台的 "Project" 菜单中选择 "Rebuild All"(或按 F7)以构建
以构建演示项目。
-
从 IAR Embedded Workbench 的 "Project" 菜单中选择 "Download and Debug",
对微控制器闪存进行编程并启动调试会话
会话。
注意: 如果在比最初创建项目时所用的版本更早的 EWARM 中打开,IAR 项目可能无法构建并被损坏
(因此它不能再用于任何 IAR 版本)
。
-
Keil uVision 应该能够使用可通过 Launchpad 硬件的 USB 连接器访问的
CMSIS DAP 调试接口。
但想要实现最快、最可靠的调试体验,
建议将 UINK ME 连接到 Launchpad 硬件的外部 JTAG 连接器。
如果使用的是外部 JTAG 连接器,则使用 Launchpad
硬件的 "JTAG Switch" 必须设置为 "Ext"。
-
确保 MSP432 包已安装并可供
uVision IDE 使用。
-
在 Keil IDE 中打开 FreeRTOS/Demo/CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil/RTOSDemo.uvprojx
。
-
从 Keil 的 "Project" 菜单中选择 "Rebuild Target"(或按 F7)以构建
演示项目。
-
从 Keil 的 "Project" 菜单中选择 "Start/Stop Debug Session",
对微控制器闪存进行编程并启动调试会话
会话。
-
使用硬件的 USB 连接器将 Launchpad 开发套件直接连接到主机
(运行 CCS 的计算机),无需其他调试
接口。 确保 Launchpad 硬件的 "JTAG Switch"
设置为 "XDS"。
-
启动 CCS Eclipse IDE,然后按照提示创建一个新的或选择一个现有的
工作区。
-
在 IDE 的 "File" 菜单中选择 "Import"。 系统将显示
如下对话框。 选择 "Code Composer Studio->CCS Projects"(如下所示)。
首次点击 "Import" 时显示的对话框
-
在下一个对话框中,选择 /FreeRTOS/Demo/CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil
作为根目录。 确保 RTOSDemo 项目在 "Projects" 区域中已勾选,
并确保 “Copy Projects Into Workspace”
未勾选,然后单击
"Finish" 按钮(请参阅下图查看正确的复选框状态)。
确保 RTOSDemo 已勾选且 "Copy projects into workspace" 未勾选
-
从 CCS Eclipse 的 "Project" 菜单中选择 "Build All",以构建
演示项目。
-
从 Eclipse 的 "Run" 菜单中选择 "Debug",
对微控制器闪存进行编程并启动调试
会话。
注意 1:所有编译器的项目都包含在
FreeRTOS .zip 文件下载的同一个目录中。 如果该目录已包含由不同的编译器生成的对象文件,
那么 Code Composer Studio (CCS)
将无法构建项目。 必须从目录及其子目录删除中所有中间文件,
之后才能在
IAR 或 uVision 项目已经使用的情况下切换使用
Code Composer Studio 项目。
注意 2: CCS 项目使用相对路径引用文件,包括
/FreeRTOS-Plus 目录中的 FreeRTOS-Plus-CLI 文件。 如果目录路径已更改或文件已移动,
则无法构建项目。 Eclipse
的 'export' 功能可用于将项目转换为独立项目,
此项目只能使用 .project 文件所在目录下的目录。
演示应用程序功能
使用无滴答操作的简单 blinky 示例
当 configCREATE_SIMPLE_TICKLESS_DEMO 设置为
1 时,创建简单的无滴答示例。 FreeRTOSConfig.h 的顶部定义了 configCREATE_SIMPLE_TICKLESS_DEMO。
FreeRTOS 无滴答闲置模式在闲置期间(没有可执行的应用程序任务的期间)停止周期性 RTOS 滴答中断
。
此 blinky 示例创建了两个任务,它们每秒只取消阻塞一次,
因此在大部分执行时间内都会停止滴答中断。
通过停止 RTOS 滴答中断,微控制器可以维持在深度节能状态,
直到中断发生,或者到了 RTOS 内核
将任务转换为“就绪”状态的时间。
请注意本页顶部的注释,
了解使用所演示的通用
无滴答实现与使用特定于 MSP432
的无滴答实现时的节能效果区别。
将 configCREATE_SIMPLE_TICKLESS_DEMO 设置为 1 会导致 main() 调用
main_blinky():
综合测试和演示应用程序
CLI 会话示例
当 configCREATE_SIMPLE_TICKLESS_DEMO 设置为
0 时,创建全面示例。 FreeRTOSConfig.h 中定义了 configCREATE_SIMPLE_TICKLESS_DEMO。
综合演示包含一个
命令行接口
(CLI),在其中可查看任务和运行时统计信息。 下文提供了
CLI 的连接和使用说明。
将 configCREATE_SIMPLE_TICKLESS_DEMO 设置为 0 会导致 main() 调用
main_full():
要连接到 CLI:
-
通过硬件的 USB 连接器为 Lauchpad 硬件供电。
-
运行综合演示。 MPS432 上的 UART 将在主机上
作为一个名为 "XDS110 Class Application/User UART" 的虚拟 COM 端口
进行枚举。
-
打开 Tera Term 或 Hyper Terminal 等哑终端程序,
并以 19200 波特率连接到枚举的 COM 端口。
-
与 FreeRTOS-Plus-CLI 一样,在控制台中键入 "help" 以查看
已注册命令列表。 右侧显示了 CLI 会话示例。
中断服务程序
优先级分配
请注意!:请参阅说明如何在 ARM Cortex-M 设备上设置中断优先级的页面。 请记住,ARM Cortex-M 核心中,
数字越小表示中断优先级越高。 这一点
可能有悖直觉,容易混淆! 如果要将
中断设置为低优先级,请不要将其优先级指定为 0(或其他低数值),
因为这会导致该中断在系统中具有
最高优先级,并且如果这个优先级
高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,可能会导致系统崩溃。 另外,请勿忘记
分配中断优先级,因为默认情况下,中断优先级为 0,
这可能导致其处于最高优先级。
ARM Cortex-M 核心上的最低优先级实际上是 255,但不同
ARM Cortex-M 微控制器制造商会实现不同数量的优先级位,
并提供优先级指定方式不同的库函数。 例如,
TI MSP432 ARM Cortex-M4 微控制器实现了 3 个优先级位,
允许使用最多 8 个不同的优先级(0 到 7,含 0 和 7)。 最低优先级对应
最大数字。 某些库函数会使用数值 7 作为
最低优先级,而其它函数则会使用数值 224 作为最低优先级(
即 7 << 5,这样 ARM Cortex-M 才能在中断控制器中看到该值)。
这两个数字分别由
FreeRTOSConfig.h 中的 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 和 configKERNEL_INTERRUPT_PRIORITY 定义。 可指定的最高优先级
始终为零。
我们还建议确保将所有优先级位指定为
抢占式优先级位,不要将任何优先级位指定为子优先级位。
实施中断服务程序
导致上下文切换的中断服务程序
无特殊要求。 在
/FreeRTOS/Demo/CORTEX_M4F_MSP432_LaunchPad_IAR_CCS_Keil/Full_Demo/serial.c
中定义的 vUART_Handler() 函数可作为示例使用。 下面是另一个例子:
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 task notification is used for this purpose. Note
lHigherPriorityTaskWoken is initialised to zero. Only FreeRTOS API functions
that end in "FromISR" can be called from an ISR! */
vTaskNotifyGiveFromISR( xTaskToNotify, &lHigherPriorityTaskWoken );
/* If the task with handle xTaskToNotify was blocked waiting for a notification,
and giving the notification 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 vTaskNotifyGiveFromISR(). Passing pdTRUE into
the portYIELD_FROM_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 portYIELD_FROM_ISR() has no effect. */
portYIELD_FROM_ISR( lHigherPriorityTaskWoken );
}
特定于 RTOS 移植的配置
这些演示的特定配置项目位于 FreeRTOSConfig.h
文件中,该文件位于项目文件所在的目录。 您可以
编辑 FreeRTOSConfig.h 中定义的常量,使其适合您的应用程序。 尤其是以下常量:
每个移植都将 "BaseType_t" 定义为
。 所有 ARM Cortex-M4F 移植都将 BaseType_t 的类型定义为 long。
请注意 vPortEndScheduler() 尚未实现。
内存分配
Source/Portable/MemMang/heap_4.c 包含在 ARM CORTEX-M4F 演示应用程序项目中,用以提供
RTOS 内核所需的内存分配。
请参阅 API 文档的内存管理部分,
获取完整信息。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.