如何将客户端的recv()部分更改为中断服务例程?

如何将客户端的recv()部分更改为中断服务例程?,c,interrupt,client-server,C,Interrupt,Client Server,我目前有一个客户端在它自己的线程中监听数据包。我被告知尝试实现ISR,以便可以立即处理从recv()调用收到的数据包,而不是等待线程被调度 编辑:这现在在windows中,但稍后将移植到DSP。ISRs根据定义在内核空间中运行。除非您在没有内存保护的嵌入式系统中,否则您将需要向项目中添加内核代码。此外,为了重新实现recv,它需要根据需要处理IP和TCP或UDP,以便从以太网数据包中提取数据 重新调度和切换到线程的开销是最小的,并且无论如何都需要发生,除非数据包完全在内核中处理。大多数操作系统都

我目前有一个客户端在它自己的线程中监听数据包。我被告知尝试实现ISR,以便可以立即处理从recv()调用收到的数据包,而不是等待线程被调度


编辑:这现在在windows中,但稍后将移植到DSP。

ISRs根据定义在内核空间中运行。除非您在没有内存保护的嵌入式系统中,否则您将需要向项目中添加内核代码。此外,为了重新实现recv,它需要根据需要处理IP和TCP或UDP,以便从以太网数据包中提取数据


重新调度和切换到线程的开销是最小的,并且无论如何都需要发生,除非数据包完全在内核中处理。大多数操作系统都有最高优先级的线程设置,有时称为“实时”,这会导致用户空间代码在驱动程序接收数据后以最小的延迟运行。这通常用于音频/视频I/O和网络。

您使用的是什么操作系统?最有可能的解决方案是更改线程的优先级或配置,以便根据现有ISR立即安排。如果没有更多信息(如操作系统等),这个问题无法回答。我不想重新实现recv()。我要做的是实现一个ISR,当recv()函数返回时触发它。很抱歉,我没有弄清楚原来的问题。@emge:像这样的ISR是由微处理器的外部信号触发的。如果
recv
已返回,则ISR已完成is作业并已切换到您的线程。您的内核可能会提供一种在数据到达
recv
之前过滤数据的方法,或者直接在内核空间中调用另一个
recv
,但是在不知道您的平台的情况下,我也无能为力。这是在windows中实现的,但稍后会移植到DSP