C中的时间中断

时间:2015-11-05 07:40:59

标签: c time timer real-time interrupt

使用ATmega328我前段时间编码了LED矩阵。 为了达到这个目的,我在ATmega328上使用了一个定时器中断(ISR),每隔10ms调用一次,因此Matrix没有闪烁。

现在我问我,操作系统(Windows,Linux,MacOSX)是否可以这样做。 (我希望如此。)

有人可以给我更多的信息,我在WWW中找不到任何东西。 我想每1ms调用一次函数(只是为了学习)。

2 个答案:

答案 0 :(得分:0)

在内核空间或用户空间中有两种不同的方法, 在内核空间中,我认为你可以在任何操作系统上做到这一点,至少在Linux和Windows上是肯定的。

从用户空间来看,Linux和Windows有不同的实时扩展, 例如https://rt.wiki.kernel.org/index.php/Main_Page,没有使用这些修改我怀疑你可以从用户空间用1ms周期调用一些函数。

答案 1 :(得分:0)

好的,我现在编译了最新的内核(Ubuntu Linux 15.04)。

$ uname -a
Linux comments 4.1.10-rt11 #1 SMP PREEMPT RT Thu Nov 5 14:29:16 CET 2015 x86_64 x86_64 x86_64 GNU/Linux

现在我找到了这个例子:

int main(int argc, char* argv[])
{
        struct timespec t;
        struct sched_param param;
        int interval = 50000; /* 50us*/

        /* Declare ourself as a real time task */

        param.sched_priority = MY_PRIORITY;
        if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
                perror("sched_setscheduler failed");
                exit(-1);
        }

        /* Lock memory */

        if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
                perror("mlockall failed");
                exit(-2);
        }

        /* Pre-fault our stack */

        stack_prefault();

        clock_gettime(CLOCK_MONOTONIC ,&t);
        /* start after one second */
        t.tv_sec++;

        while(1) {
                /* wait until next shot */
                clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);

                /* do the stuff */

                /* calculate next shot */
                t.tv_nsec += interval;

                while (t.tv_nsec >= NSEC_PER_SEC) {
                       t.tv_nsec -= NSEC_PER_SEC;
                        t.tv_sec++;
                }
   }
}

但我还有更多疑问,我如何确定优先级或如何从其他正在运行的应用程序中找出优先级?

它是否也适用于线程(libpthread)?