前言:
目前学习面临着需要在kv260板载嵌入式linux系统中使用python编写脚本调用定时器来完成数据解析的问题。其中任务需要进行ns级别的定时,而查到的一些直接使用python方式定时的方式多半是ms或者s级别。第一次接触使用python完成定时器调用,所以不太熟练,这篇笔记为其中的一个学习心得和记录。
步骤:
目前实现的一种方式是通过c函数来调用time库中的clock_nanosleep()函数来实现。c代码重新编写一个定时函数,然后通过构建共享链接库的方式被python调用。
step1:c代码重定义定时函数
c++代码重定义定时函数nsleep(),文件命名为nsleep.cpp:
#include <time.h>
//该函数为ns级别的定时器,python通过libnsleep.so共享库调用
extern "C" {
int nsleep(long nanoseconds) {
struct timespec req, rem;
if (nanoseconds > 999999999) {
req.tv_sec = nanoseconds / 1000000000;
req.tv_nsec = nanoseconds % 1000000000;
} else {
req.tv_sec = 0;
req.tv_nsec = nanoseconds;
}
return clock_nanosleep(CLOCK_MONOTONIC, 0, &req, &rem);
}
}
step2:使用命令行编译文件为共享库
g++ -fPIC -shared -o libnsleep.so nsleep.cpp
使用一下命令查看是否成功:
nm -D libnsleep.so | grep nsleep
结果返回如下则表示编译成功:
00000000000006b4 T nsleep
step3:在 Python 中使用 ctypes 调用
import ctypes
import os
'''这是应用nsleep定时器的一个实例'''
# 获取当前脚本的目录路径
current_dir = os.path.dirname(os.path.abspath(__file__))
lib_path = os.path.join(current_dir, "libnsleep.so") # 构造 libnsleep.so 的完整路径
nsleep_lib = ctypes.CDLL(lib_path) # 加载共享库
# 设置函数参数类型和返回类型
nsleep_lib.nsleep.argtypes = [ctypes.c_long] # 设置输入参数类型
nsleep_lib.nsleep.restype = ctypes.c_int # 设置返回值类型
# 循环调用函数
for i in range(100):
nanoseconds = 1000000000 # 1秒 = 1,000,000,000 纳秒
result = nsleep_lib.nsleep(nanoseconds) # 调用 C 函数
print(f"{i}\n") # 打印当前循环次数
结果如下: