
(北邮研一)嵌入式系统实验报告(邝坚)
5星
- 浏览量: 0
- 大小:None
- 文件类型:DOCX
简介:
嵌入式系统实验知识点总结:在本次实验中,我们主要围绕嵌入式系统的实际操作进行了深入研究与探讨。具体而言,在数据采集与处理方面,实现了对目标信号的有效捕捉并完成了相应的预处理工作;硬件架构分析部分,则重点考察了不同处理器配置下的系统性能评估指标;算法设计与实现方案的优化是本实验的关键环节,通过多维度的数据对比分析得出了最优算法参数设置。整个实验过程中,我们着重掌握了理论知识与实践技能的结合运用,并通过反复调试确保了系统的稳定运行。该实验基于...
本份实验报告由北邮的研究生邝坚完成,其主题聚焦于“基于消息驱动模式的实时软件架构”。本次实验旨在构建一个适用于实时系统软件架构的设计方案,并以期帮助学生深入理解嵌入式处理器的特性和实时操作系统(RTOS),同时掌握强实时嵌入式系统的软硬件设计规范。
实验环境部分由硬件环境和软件配置组成,确保实验运行所需的各项条件得到充分满足。本实验主要使用的是VxSim仿真环境或基于ARM920T内核的开发板2440作为开发平台。VxWorks是一款成熟的商用RTOS,在航空航天、军事以及工业控制等多个领域都有广泛应用。开发板2440则是一款典型的基于ARM920T内核的设备,专为嵌入式系统的设计与开发提供支持。
必选功能的开发和实现以消息驱动构建的任务统一架构
为实现基于消息的任务统一架构,在设计阶段需要建立统一的消息格式规范。该 messenger结构体旨在整合消息驱动的技术方案。其核心定义如下:
typedef struct _MESSAGE {
int mType; // 消息类型标识:0表示定时器到客户端的消息,1表示客户端到服务端的消息,2表示服务端到客户端的消息
int mSendId; // 发送任务的唯一消息标识符
int mRecvId; // 接收任务的唯一消息标识符
int mData; // 消息中包含的具体数据内容
} MESSAGE;
该Messenger结构体旨在整合消息驱动的技术方案。其核心定义如下:
- 消息类型:分为定时器到客户端(0)、客户端到服务端(1)和服务端到客户端(2)三大类,确保不同任务间的通信机制具有明确的划分和一致性。
- 数据标识:包含发送者与接收者的唯一标识符,以避免消息丢失或混用的问题。
- 信息内容:传递的数据部分则用于具体业务逻辑处理。
通过这种结构化的消息定义方式,可以有效提升系统内各任务之间的协作效率。在确定了消息格式之后,接下来是规范其应用方法。每一个具体的任务都需要遵循特定的规则来进行消息的发送与接收,以确保系统的稳定运行。以下是一个示例代码片段:
```c
STATUS Task() {
初始化操作中包含了MBox、DataStructure和Timer等元素;
持续不断地执行以下步骤:
接收消息;
如果满足条件…则进行相应的处理;
否则,如果满足其他条件…则执行不同的处理逻辑;
...
}
```
支持消息驱动模式的软定时器机制为了在消息驱动模式下实现软定时器机制,我们设计并开发了一个名为`timer`的功能模块。该功能模块将按照预先设定的时间间隔向客户端的消息队列发布消息。具体实现细节如下:```c
STATUS timer(int id) {
MESSAGE *txMsg; * 用于从消息队列中接收消息 *
int tick; * 创建一个定时,用于提醒发送者任务定时发送消息 *
tick = sysClkRateGet();
semTake(semSynStart, WAIT_FOREVER);
FOREVER {
taskDelay((int)(tick * DELAY_SECOND));
txMsg = (MESSAGE *)memMalloc(MAX_MSG_LEN);
txMsg->mType = 0;
txMsg->mSendId = MID_TIMER(id);
txMsg->mRecvId = MID_CLIENT(id);
txMsg->mData = 0;
printf(tTimer%d send message to tClient%d!n, id, id);
if (msgQSend(msgQIdClient[id], (char *)&txMsg, MAX_MSG_LEN, WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR) {
return(ERROR);
}
}
return(OK);
}
```此段代码首先执行系统时钟频率获取操作,随后持续不断地运行循环结构,在每一轮迭代中先进行一段延时操作后将一条指令传递至目标客户端的的消息通道。此任务负责实现启动同步操作。为确保各个Task能够按照预期的方式启动,必须实现一个Task启动同步功能。该功能的核心是通过一个称为`manager()`的特定Task创建并负责启动其他所有相关Task,并将它们保持在等待状态直至`manager()`Task发布启动指令后,所有受控任务才同时开始运行。具体实施方式如下:在启动过程中,在初始化阶段,系统首先生成全部的任务实例,并将它们放置在相应的同步变量`semSynStart`上。随后,这些任务实例会被安排等待信号源的到来。具体来说,这可以通过调用`semTake()`函数来完成这一操作。需要注意的是,在缺乏相应的信号源时,这些任务实例会等待并保持待命状态。**同步机制**:在初始化阶段被创建的一个Task,在其启动后会等待所有相关子任务已完成并处于待执行状态,随后通过释放同步信号量`semSynchronizeStart`向其余的子任务发出启动指令。
* progStart() 创建实例进程 *
STATUS progStart(void) {
int id; 用于标识不同的定时器或客户任务
void (*initialPtr)();
mallocPtr = &sysMalloc;
// 为内存空间分配并初始化 frontBlock字段
mallocPtr->frontBlock = 0;
initialPtr = initial();
tidServer = tidManager = 0;
for (id = 0; id < NUM_CLIENT; id++) {
tidClient[id] = 0;
}
for (id = 0; id < NUM_TIMER; id++) {
tidTimer[id] = 0;
}
* 建立消息队列 *
msgQIdServer = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO | MSG_Q_EVENTSEND_ERR_NOTIFY);
if (msgQIdServer == NULL) {
return(ERROR);
}
for (id = 0; id < NUM_CLIENT; id++) {
msgQIdClient[id] = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO | MSG_Q_EVENTSEND_ERR_NOTIFY);
if (msgQIdClient[id] == NULL) {
return(ERROR);
}
}
* 创建任务 *
...省略创建Task的代码...
* manager() 任务 *
tidManager = taskCreate(manager, (char *)Manager, WPRI, (char *)&initialPtr, STACK_SIZE, T_JOINABLE);
...省略其他细节 ...
return(OK);
]
可选功能的实现过程得以完成除了上述必选功能外,还增加了可选功能以供进一步探索。这些功能包括但不限于:
- **无信号量(互斥)支持的临界资源访问方法**:通过利用原子操作或其他技术,在无需信号量的情况下实现对共享资源的访问。
- **ZeroCopy机制**:降低了数据复制频率,并提升了系统的运行效率。其中的主要内容涉及嵌入式系统设计的关键技术。具体来说,在实验报告中主要探讨了基于消息驱动的Task统一框架设计、实现了软时钟机制的设计,并完成了任务间启动同步优化。通过这些实验,我们不仅能够更加深刻地掌握了嵌入式系统的理论基础,还进一步提升对实时操作系统(RTOS)实际操作能力的掌握程度。
全部评论 (0)


