使用ATmega328我前段时间编码了LED矩阵。 为了达到这个目的,我在ATmega328上使用了一个定时器中断(ISR),每隔10ms调用一次,因此Matrix没有闪烁。
现在我问我,操作系统(Windows,Linux,MacOSX)是否可以这样做。 (我希望如此。)
有人可以给我更多的信息,我在WWW中找不到任何东西。 我想每1ms调用一次函数(只是为了学习)。
答案 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, ¶m) == -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)?