数据发送通过调用ecrt_master_send接口来发送报文。
红框内容说明:为什么有条件的插入主站状态机数据呢?其实是和主栈的idle和op线程有关,通过之前的介绍我们知道,主站启动时启动了idle线程,idle线程会主动的调用ecrt_master_send接口来发送报文
但是当我们在应用程序中请求主站的时候,idle线程就退出了,转而启动了op线程继续执行主站状态机
可以看到op线程没有调用send函数,写过IgH应用程序就应该知道,我们会在周期任务中周期的调用send函数,此时如果op线程中也调用send会带来两个问题, 1、pdo数据同步的问题,pdo数据一般要求周期的发送,不能随便发送;2、实时性问题,当应用成调用send时发现op线程也在send,这时候只能等待op send完成,就会给主站应用程序执行带来较大的抖动,处理不好有可能导致周期超时。
下面我们看一下报文组装发送接口ec_master_send_datagrams;
当数据超过MTU时,就需要把报文分包发送
EtherCAT命令数据就是上面红框中那样一条一条的插入报文的,当数据长度小于最小报文长度时就补0,然后调用ec_device_send接口,ec_device_send调用网卡的发送函数,就把数据报文发送出去了。