代码框架
代码框架主要包含3部分
- 与ESC对接的硬件抽象层,需要在此层处理与ESC的通信如SPI、FMC。对接一些中断
- 协议栈,包含状态机,邮箱,过程数据通信。此层可以使用SSC工具配置
- 用户应用。
各层对应具体的代码实现如下图·
上图中AOE,FOE,EOE功能都找不到具体的实现。是因为在第一弹中,SSC里我们没有配置任何参数直接生成的代码。
执行流程
前后台流程,后台mainloop循环,前台执行中断。
大循环在ecatappl.c中,代码如下(删减)
void MainLoop(void)
{
UINT16 ALEvent = HW_GetALEventRegister(); //获取ALEVENT
PDO_OutputMapping(); //输出映射
ECAT_Application(); //用户应用
PDO_InputMapping(); //输入映射
ECAT_Main(); //ALEVENT和邮箱处理,邮箱处理中包含EOE,FOE,AOE等功能实现
COE_Main(); //COE
pAPPL_MainLoop(); //函数指针,应该是协议栈希望用户将该指针指向自定义的应用函数
//但是在SSC生成的某些参考代码中,应用是在ECAT_Application()中处理的
}
中断处理
协议栈需要如下中断
- 1ms定时中断,用于LED和看门狗
- Sync0:过程数据处理和DC同步
- Sync1:过程数据处理和DC同步
- PDI Interrupt:过程数据处理
如果设备不支持DC同步,那么Sync0, Sync1中断是没有必要的。PDI中断将在中断服务函数中通过轮询ALEVENT的方式执行源Sync0 Sync1中的服务函数,在这个过程中执行PDO_OutputMapping()和PDO_InputMapping()
如果设备PDI中断都不支持,那么MainLoop中,ESC将会轮询ALEVENT,执行PDO_OutputMapping()和PDO_InputMapping()
过程数据处理
主要对接如下3个函数,注意都是站在master视角描述的
- PDO_OutputMapping:处理master到slave的数据。
- ECAT_Application() :应用层,比如根据获得的数据点灯,读取模拟量输入等等
- PDO_InputMapping():处理slave到master的数据。
三个函数处理顺序一定是OutputMapping,App,InputMapping
三个函数对应的用户实现是(SSC-Device.c)
void APPL_InputMapping(UINT16* pData)
void APPL_OutputMapping(UINT16* pData)
void APPL_Application(void)