嵌入式技术论坛
直播中

LL-LING宁

9年用户 1400经验值
擅长:电源/新能源
私信 关注
[问答]

软件定时器中可以使用socket吗?

我用软件定时器想实现周期性发送udp报文
实际发现,只要一执行
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
就会报错:
Function[rt_mutex_take] shall not be used in ISR

是不是socket不能在定时器中使用。。

谢谢

回帖(5)

lalajie

2023-5-17 10:34:10
你应该这么操作,在软件定时器中释放一个信号量,然后单独写一个线程来获取这个信号量,获取到之后发送数据。
举报

LL-LING宁

2023-5-17 10:34:20
嗯。。现在改成这么做了
是不是因为socket 实现里面用了阻塞信号量的原因。。
举报

lalajie

2023-5-17 10:34:30
出现你问题中的原因是:你在中断里面使用 socket 函数会调用 rt_malloc 申请空间,但是 rt_malloc 不应该出现在中断上下文中,因为这两个函数会操作锁,而 rtt 的中断上下文中不可以获取锁。所以提示了你问题中的话

[rt_mutex_take] shall not be used in ISR
另外 socket 创建一次就行了,每次定时器到时后直接释放信号量,然后另一个线程获取到信号量之后直接发送就行不用再次创建 socket
举报

lalajie

2023-5-17 10:34:36
不是的,是因为中断中不能使用锁,而 socket 函数会调用 rt_malloc 申请空间, rt_malloc 会获取锁就出错了。
举报

LL-LING宁

2023-5-17 10:34:46
原来如此,明白了

感谢解答
举报

更多回帖

发帖
×
20
完善资料,
赚取积分