- 主题:Linux应用需要精度1毫秒的定时器,有什么方案?
rt
--
FROM 36.112.69.*
换操作系统吧
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 222.71.112.*
可以这样试试?
用一个线程疯狂轮询读取那个时钟频率寄存器。然后根据频率转换成时间。
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 121.69.86.*
没用,linux本身计时器有误差,加上系统本身不是实时的,1ms基本不可能。
否则用gettimeofday就行,里面有微秒。
【 在 chunhui 的大作中提到: 】
: 标 题: Re: Linux应用需要精度1毫秒的定时器,有什么方案?
: 发信站: 水木社区 (Thu Aug 18 10:03:28 2022), 站内
:
: 可以这样试试?
:
: 用一个线程疯狂轮询读取那个时钟频率寄存器。然后根据频率转换成时间。
: 【 在 wjhtingerx 的大作中提到: 】
: : rt
:
: --
: 大街上的灯光 又亮得像白天
: 那是因为大排档在冒烟烧烤 还有重新亮起招牌的足疗店
: 关门打(lei)烊最多也就一周 因为无故死了一个青年
: 生意如往常红火 喝酒撸串儿扯淡
: 喝酒最特么自由 撸串儿无需尊严 扯淡绝对很安全
: 39-38/2
:
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 121.69.86.*]
--
FROM 112.53.225.*
Linux的任务调度的时间精度是在10ms左右,要1ms的精度通常是不可能的。
如果要用Linux做实时任务,一般的做法是:
1. 独立出一些CPU核,这要修改grub启动参数。这些被独立出的核一般的进程不能使用。
2. 有实时任务的进程,绑定到这样的独立核(sched_setaffinity)。如果该进程还有子进程
或子线程,每个子进程或子线程要绑定到不同的独立核,保证每个独立核上只有一个进程或
线程。
3. 设定任务的scheduler为实时(sched_setscheduler)。
4. 需要等待1ms时,不要用sleep/usleep/nanosleep,而是不停循环来判断有没有到预定时间。
以上除了第4项简单一点,都比较麻烦且坑比较多,我只是参与过项目也说不了很细。
另外,既然有实时性的需求,还是推荐换个实时操作系统,用合适的工具才能事半功倍。
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 58.33.81.*
这个基本可以做到的。用RT Linux kernel, 打开CONFIG_PREEMPT_RT, 用户空间用nanosleep。
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git/
或git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
RT kernel在Intel比较新的处理器上延迟可以小于50us。
【 在 wjhtingerx 的大作中提到: 】
: rt
--
FROM 192.55.54.*
我没这么试过。如果能接受这个误差不那么大,凑合也可以。
【 在 liuxueshen 的大作中提到: 】
: 没用,linux本身计时器有误差,加上系统本身不是实时的,1ms基本不可能。
: 否则用gettimeofday就行,里面有微秒。
--
FROM 121.69.86.*
我说的就是这个意思。用一个孤立核心上的线程疯狂轮询频率寄存器。。。
【 在 RunningOn 的大作中提到: 】
: Linux的任务调度的时间精度是在10ms左右,要1ms的精度通常是不可能的。
: 如果要用Linux做实时任务,一般的做法是:
: 1. 独立出一些CPU核,这要修改grub启动参数。这些被独立出的核一般的进程不能使用。
: ...................
--
FROM 121.69.86.*
没用的。
要解决这个问题上rt kernel,极限可以做到max jitter 4000ns左右,典型可以做到10000ns
【 在 chunhui 的大作中提到: 】
: 我说的就是这个意思。用一个孤立核心上的线程疯狂轮询频率寄存器。。。
--
FROM 117.136.35.*
我没试过轮询那种方法。要求不高凑合一下或许可以。真正严格准确定时器肯定要内核才行。
【 在 lvsoft 的大作中提到: 】
: 没用的。
: 要解决这个问题上rt kernel,极限可以做到max jitter 4000ns左右,典型可以做到10000ns
--
FROM 121.69.86.*