嵌入式linux系统使用python调用纳秒级别定时器的方法

前言:

        目前学习面临着需要在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")  # 打印当前循环次数

结果如下: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值