autosar唤醒与睡眠流程
时间: 2025-07-10 15:09:42 浏览: 10
在 AUTOSAR 架构中,ECU 的唤醒与睡眠流程是由多个模块协同工作完成的,涉及 EcuM(ECU 管理)、BswM(基础软件管理)、ComM(通信管理)以及网络管理(Nm)等多个模块。以下是关于 ECU 唤醒流程、睡眠流程及通信网络管理的详细说明。
### ### ECU 唤醒流程
ECU 的唤醒通常由外部或内部事件触发,例如接收到特定的 CAN 报文、定时器超时或硬件中断等。当检测到有效的唤醒事件后,系统会执行一系列步骤将 ECU 从休眠状态过渡到运行状态:
1. **唤醒事件检测**
BswM 模块通过 `BswM_EcuM_CurrentWakeup` 接口获取当前的唤醒源状态,并判断是否有有效的唤醒事件发生。如果存在有效唤醒源,BswM 将允许各通信通道恢复运行。
2. **EcuM 设置唤醒事件**
在确认唤醒源有效后,EcuM 调用 `EcuM_SetWakeupEvent` 函数通知系统该唤醒事件已被处理,并开始进行状态切换。
3. **进入运行模式**
在 `ESH_WakeupToRun` 阶段,系统逐步恢复各模块的功能,包括初始化通信控制器、重新激活网络接口等。
4. **通信使能**
ComM 模块在此阶段进入 `FULL_COMMUNICATION` 状态,表示通信功能被完全使能,可以正常收发报文[^2]。
### ### ECU 睡眠流程
当系统检测到没有有效的唤醒事件持续一段时间后,ECU 会进入休眠状态以降低功耗。睡眠流程主要包括以下几个关键步骤:
1. **准备进入休眠**
ComM 模块首先进入 `NO_COMMUNICATION` 状态,停止所有非必要的通信活动,并等待网络中的其他节点也进入静默状态。
2. **通知各模块准备休眠**
EcuM 向各基础软件模块发出准备休眠的通知,要求它们完成必要的清理和保存操作。
3. **进入 Bus Sleep Mode**
当所有模块准备好后,CAN 控制器进入 Bus Sleep Mode,停止接收和发送报文,从而降低功耗。
4. **ECU 进入休眠状态**
最终,ECU 进入低功耗模式,仅保留最小限度的唤醒检测电路运行,等待下一次唤醒事件的到来[^1]。
### ### 通信网络管理(Nm)
在 AUTOSAR 中,网络管理(Nm)负责协调整个网络中 ECU 的通信状态,确保在网络唤醒和睡眠过程中各节点行为一致。主要机制如下:
- **网络唤醒**
只有接收到预定义的有效唤醒报文(如外部网络管理报文)时,ECU 才会被唤醒并恢复通信功能。测试案例表明,若接收到的是非外部网络管理报文,则不应触发唤醒行为[^3]。
- **网络睡眠**
当一段时间内未检测到有效报文时,网络进入睡眠状态。此时所有节点应同步进入 Bus Sleep Mode,以减少能耗。
- **时间参数控制**
整个唤醒与睡眠过程的时间参数(如唤醒响应时间 Twakeup、重复消息间隔 Trepeatmessage、准备进入睡眠前的延迟 Tpreparebussleep 等)均需严格符合规范要求,以确保系统稳定性与一致性[^4]。
### 示例代码片段:验证非网络管理报文不能唤醒 ECU
```c
// Test case: Verify ECU cannot wake up by non-external NM message
void TC1_VerifyEcuNotFromBusSleepMode2RepeatMessageByNonExtNmMsg() {
int i;
testCaseDescription("TEST Purpose: Verify ECU cannot wake up when receiving non-external NM message");
testStep("TEST Step_1", "Send non-external NM message 5 times, make sure ECU cannot wake up");
for (i = 0; i < 5; i++) {
output(nonExtNmMsg); // Send non-external NM message
if (1 != testWaitForMessage(0x681, Twakeup + Trepeatmessage)) {
testStepPass("TEST Rest_1", "ECU not wake up in %dth", i + 1);
} else {
testStepFail("TEST Rest_1", "ECU wake up in %dth", i + 1);
}
}
testStep("TEST Completion", "Wait for %ds to make ECU sleep", Twakeup + Trepeatmessage + Treadysleep + Tpreparebussleep);
testWaitForTimeout(Twakeup + Trepeatmessage + Treadysleep + Tpreparebussleep);
}
```
阅读全文
相关推荐


















