摩托罗拉/Freescale HCS12 RTOS 端口
内存块模型
[RTOS 端口]
感谢 Uri Kogan 提供原装 MC9S12DP256B 端口。
从 FreeRTOS V3.1.1 开始, HCS12 端口可同时支持小型和内存块模型。 此页面演示了内存块模型
在 mC9S12DP256B 处理器上的使用。 请参阅 MC9S12C32 RTOS 端口页面
关于使用小型存储器模型的示例。
端口 是在 M68KIT912DP256 开发套件上进行开发的,
该套件来自 Freescale(如果您想使用其他开发板,可以参考说明)。 其
使用了 CodeWarrior HC12 开发工具
和 P&E Multilink USB BDM 接口——两者均
包含在开发套件中。
重要提示!Freescale (Motorola) HCS12 RTOS 移植使用说明
使用此 RTOS 移植之前,请阅读以下所有要点。
- 源代码组织
- 演示应用程序
- 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?
源代码组织
FreeRTOS 源代码下载文件包含所有 FreeRTOS 移植的源代码。
请参阅源代码组织部分,了解
有关下载文件的说明和创建新项目的信息。
HCS12 CodeWarrior内存块模型演示应用程序项目文件位于 FreeRTOS/Demo/HCS12_CodeWarrior_banked 目录下,
名为 RTOS Demo.mcp。
演示应用程序
FreeRTOS 源代码下载文件包括用于内存块 HCS12 RTOS 端口的完全抢占式多任务演示应用程序。
演示应用程序硬件设置
演示应用程序包括通过串行端口发送和接收字符的任务。 一个任务发送的字符
需要另一个任务来接收,如果任何字符被遗漏或接收顺序错误,则标记错误情况。 串行端口上
需要一个环回连接器才能让此机制正常运行(只需在标记为 P1 的串行端口连接器上
将引脚 2 和 3 连接在一起即可)。
演示应用程序利用了原型板上构建的 LED。
功能性
演示应用程序可创建 21 个任务,包括 20 个标准演示应用程序任务和一个空闲
任务。 另外两项任务则由标准演示“创建”任务定期进行动态创建和删除。
一些简单的演示功能也通过空闲任务钩子包含在了空闲任务中。 具体请参阅
演示应用程序章节,了解标准演示实时任务的详细信息。
如果演示应用程序正确执行,将实现以下效果:
构建演示应用程序
RTOSDemo.mcp 项目文件(位于FreeRTOS/Demo/HCS12_CodeWarrior_banked 目录中)
应在 CodeWarrior IDE 中打开。
该项目最初使用 UNIS Processor Expert 配置功能进行创建,
导致项目中包含大量自动生成的文件和文件夹。
而 FreeRTOS 实时内核
源文件包含在 'Source->Kernel Source' 项目文件夹中,在下图中以红色突出显示。
演示应用程序源文件位于 'Source->RTOS Demo' 项目文件夹中 ,在下图中以绿色
突出显示。
显示 RTOS 演示源文件的
CodeWarrior 项目窗口
演示应用程序项目包含两个构建配置:
- 模拟器构建
要模拟 RTOS 演示项目,首先在下拉列表中选择 “Simulator” 配置,
如上图以蓝色突出显示部分。 构建成功后,在 “Project” 菜单中选择 “Debug” 将自动打开
模拟器并启动调试会话。
- 远程调试构建
可以使用 USB BDM 接口直接在 HCS12 微控制器上执行和调试项目。 要启动
远程调试会话,首先从上图蓝色突出显示的下拉列表中选择 "P&E ICD"。
构建成功后,在 “Project” 菜单中选择 “Debug” 会自动将程序加载到微控制器
闪存中,并启动调试会话(前提是您已使用提供的 USB 数据线为目标主板接通了电源并进行连接!)。
内存模型
所下载的 MC9S12DP256B 演示使用了内存块模型。
若要使用内存块模型:
- BANKED_MODEL 必须在文件FreeRTOS/Demo/HCS12_CodeWarrior_banked/FreeRTOSConfig.h 中进行定义。
- CodeWarrior 项目必须被配置为使用内存块模型。
只有 PPAGE 寄存器保存为任务上下文的一部分。
请注意:RTOSDemo.mcp 项目将大多数内存库定义为仅有 256 字节长度。 这单纯是为了
强制代码位于不同的库中,以便测试 RTOS 内核库代码切换。 用户应根据其应用程序的需求修改此
内存映射。
RTOS 端口特定配置
此端口的特定配置项目包含在 FreeRTOS/Demo/HCS12_CodeWarrior_banked/FreeRTOSConfig.h 中。 本文件中定义的常量
此文件中定义的常量,以适配您的应用程序。 尤其是 configTICK_RATE_HZ 定义,
用于设置 RTOS 的 tick 频率。 演示项目提供的值 1000 Hz 可用于测试 RTOS 内核功能,
但该值超出了大多数应用程序需要的速率。 降低此值将提高效率。
每个移植都会将 "BaseType_t" 定义为该处理器的最有效数据类型。 此移植将
BaseType_t 定义为 char 类型。
请注意,vPortEndScheduler() 尚未实现。
中断服务程序
中断向量表包含在 Vectors.c 源文件中。 Vectors.c 最初
由 Processor Expert 实用程序创建,但随后经手动修改,定制为能够与实时内核和
演示应用程序共同使用。 如果再次使用 Processor Expert,它将重新创建文件并覆盖这些修改。
因此,建议保留 Vectors.c 写入保护,且仅使用手动更新。
不会引起上下文切换的中断服务程序没有特殊要求,可以按照
正常的 CodeWarrior 语法写入。
通常,上下文切换需要中断服务程序。 例如,正在被接收的串行端口字符
可能会唤醒在等待该字符时被阻塞的高优先级任务。 如果 ISR 中断了一个优先级较低的任务,
则其应立即返回到已被唤醒的任务。 提供的 宏 portTASK_SWITCH_FROM_ISR() 用以允许
此项功能。 请注意,portTASK_SWITCH_FROM_ISR() 只能在 ISR 结束时(且其未声明任何静态局部变量)
使用。 如果 ISR 使用了局部变量,则调用 portYIELD() 可以
用于代替 portTASK_SWITCH_FROM_ISR() 宏。
作为示例,
以下为演示应用程序中的函数 vButtonPush() :
/* ISR connected to PP0 button input. */
void interrupt vButtonPush( void )
{
static UBaseType_t uxValToSend = 0;
/* Send an incrementing value to the button push
task each time the button is pushed. */
uxValToSend++;
/* Clear the interrupt flag. */
PIFP = 1;
/* Send the incremented value down the queue. The
button push task is blocked waiting for the data.
As the button push task is high priority it will
wake and a context switch should be performed before
leaving the ISR. */
if( xQueueSendFromISR( xButtonQueue, &uxValToSend, pdFALSE ) )
{
/* Posting the message caused a higher priority
task to unblock. This is the end of the ISR so
we can perform the task switch here. This can be
used as the only local variable is static. */
portTASK_SWITCH_FROM_ISR();
}
}
有关使用局部堆栈变量的完整示例,请参阅 FreeRTOS/Demo/HCS12_CodeWarrior_banked/serial/serial.c 内的中断函数 vCOM0_ISR()
。
在抢占式和协同式 RTOS 内核之间切换
将 FreeRTOS/Demo/HCS12_CodeWarrior_banked/FreeRTOSConfig.h 内的定义 configUSE_PREEMPTION 设置为 1 即可使用抢占式机制,设置为 0 即可使用
协同式调度。
编译器选项
与所有的端口一样,使用正确的编译器选项至关重要。 确保这一点的最佳方法是,基于
提供的演示应用程序项目文件构建您的应用程序——就如
源代码组织章节中所述。
SWI 说明
SWI 指令由 RTOS 内核使用,不能被应用程序代码使用。
定时器的使用
可以在 TickTimer.c Processor Expert 生成的源文件中查看用于生成 RTOS 滴答的定时器配置
。
内存分配
FreeRTOS/Source/Portable/MemMang/heap_2.c 包含在 HCS12 演示应用程序项目中,
以分配 RTOS 内核所需的内存。
请参阅 API 文档的内存管理部分,
获取完整信息。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.