AUTOSAR CAN Driver模块(4)--功能描述“唤醒”,“通知”和“重入问题”

唤醒

CAN模块处理CAN控制器自己检测到的“唤醒”事件,而非那些通过CAN收发器检测到的唤醒。可通过轮询或中断方式唤醒(ECU)。

通过中断唤醒,当硬件检测到唤醒事件,将调用一个ISR。

SWS_Can_00364,如果ISR被调用,在ISR中将调用EcuM_CheckWakeup。这个函数的参数应为唤醒源ID,这个是从CanWakeupSourceRef参数引用得来。

然后,ECUSM模块将设置MCU并通过CANIF调用CAN模块的Can_CheckWakeup函数。

当唤醒事件通过轮询检测到,ECUSM将通过CanIf循环调用Can_CheckWakeup。

在两个情况下,Can_CheckWakeup都会去检查是否存在唤醒被CAN控制器检测到,并返回结果。

CAN驱动将会通过EcuM_SetWakeupEvent.通知ECUSM这个唤醒事件。

防止错误唤醒事件的唤醒验证将由ECUSM和CANIF完成,无需CAN模块的任何帮助。

AUTOSAR CAN Driver模块(4)--功能描述“唤醒”,“通知”和“重入问题”_第1张图片

 

通知

CAN模块仅仅提供事件触发的通知接口给到CANIF。每个通知都对应一个回调函数。

SWS_Can_00099,通过一个中断或硬件对象的轮询状态标识可以检测到硬件事件。哪个事件可以被轮询,或哪个事件必须被轮询,这个需要根据不同的硬件去识别。

SWS_Can_00007,完全的轮询(无中断)是可以通过配置实现的。

在主函数(Can_MainFunction_xxx)之中完成轮询。同样地,轮询事件通过合适的回调函数进行通知。
AUTOSAR CAN Driver模块(4)--功能描述“唤醒”,“通知”和“重入问题”_第2张图片

 

重入问题

例程必须满足以下条件才能重入:

  • 它以原子方式使用所有共享变量,除非每个共享变量都分配给函数的特定实例。
  • 它不调用非重入函数。
  • 它不会以非原子方式使用硬件。

在函数CanIf_Transmit之中,发送请求被简单地通过CANIF模块传递。

函数CanIf_Transmit是可重入的。因此,函数Can_Write需要实现线程安全(例如,通过使用互斥锁):

当无法重新执行写入时,进一步(抢占式)调用将返回CAN_BUSY。示例:写入不同的硬件 TX 句柄被允许,写入同一 TX 句柄不被允许。

如果CAN_BUSY情况发生,CANIF模块将请求进行排列。与所有硬件对象都繁忙的行为相同。

Can_EnableCanInterrupts 和Can_DisableCanInterrupts可以在可重入函数中被调用。因此这俩函数也应该是可重入的。

所有其他服务不必作为可重入函数来执行。

CAN主函数(Can_MainFunction_Read)不应被自己打断。因此这些CAN主函数为非重入。

AUTOSAR CAN Driver模块(4)--功能描述“唤醒”,“通知”和“重入问题”_第3张图片

 

你可能感兴趣的:(攻克AUTOSAR的悟空,开发语言,c语言)