gpt4 book ai didi

休眠函数的 Python C 扩展

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:33 26 4
gpt4 key购买 nike

我正在写一个 Python extension用于 GPIO 驱动程序提供的功能。我在 set_bit() 和 clear_bit() 等简单函数上很容易取得进展。但是现在我需要实现 wait_int(),它会一直休眠直到在输入引脚上检测到事件,我不确定在 c 和 python 之间编排它的正确方法。这是在 c 中使用该函数的精简示例:

main(int argc, char *argv[])
{
int c;

//some setup like testing port availability, clearing interrupts, etc
...

while(1)
{
printf("**\n");
c = wait_int(1);//sleeps until an interrupt occurs on chip 1
if(c > 0) {
printf("Event sense occured on Chip 1 bit %d\n",c);
++event_count;
}
else
break;
}

printf("Event count = %05d\r",event_count);
printf("\nExiting Now\n");
}

我是否只是直接公开 wait_int 然后执行无限循环的 python 等效成语?还有一些去抖动需要完成。我已经用 c 语言完成了,但也许可以将其移至 python 端。

最佳答案

你不需要在 Python 端做任何事情,你可以把它当作一个同步函数。在 C 端,您只是阻塞直到事件发生,可能允许中断。例如,看看 implementationtime.sleep功能:

/* LICENSE: http://docs.python.org/license.html */

/* Implement floatsleep() for various platforms.
When interrupted (or when another error occurs), return -1 and
set an exception; else return 0. */

static int
floatsleep(double secs)
{
/* XXX Should test for MS_WINDOWS first! */
#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)
struct timeval t;
double frac;
frac = fmod(secs, 1.0);
secs = floor(secs);
t.tv_sec = (long)secs;
t.tv_usec = (long)(frac*1000000.0);
Py_BEGIN_ALLOW_THREADS
if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
#ifdef EINTR
if (errno != EINTR) {
#else
if (1) {
#endif
Py_BLOCK_THREADS
PyErr_SetFromErrno(PyExc_IOError);
return -1;
}
}
Py_END_ALLOW_THREADS
#elif defined(__WATCOMC__) && !defined(__QNX__)
...

它所做的就是使用 select 函数在给定的时间段内休眠。使用 select 以便如果收到任何信号(例如 SIGINT 来自在终端按下 Ctrl+C),系统调用将被中断并且控制返回到 Python。

因此。您的实现只需调用 C wait_int 函数即可。如果它支持被信号打断,那就太好了,这将允许用户通过按 Ctrl+C 来打断它,但要确保做出适当的 react 以便抛出异常(我不确定这是如何工作的,但是看起来从顶层函数返回 NULL(本例中为 time_sleep)就可以了。

同样,为了更好的多线程性能,用一对 Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS 宏包围等待调用,但这不是必需的,特别是如果您不使用多线程。

关于休眠函数的 Python C 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com