與ATmega328我前一段時間編碼一個LED矩陣。 爲了達到這個目的,我在ATmega328上使用了一個定時器中斷(ISR),每隔10ms調用一次,所以Matrix沒有閃爍。時間中斷在C
現在我問我,如果操作系統(Windows,Linux,MacOSX)可以做同樣的事情。 (我期望它。)
有人可以給我更多的信息,我沒有在WWW中找到任何東西。 我想每1ms調用一次函數(僅供學習)。
與ATmega328我前一段時間編碼一個LED矩陣。 爲了達到這個目的,我在ATmega328上使用了一個定時器中斷(ISR),每隔10ms調用一次,所以Matrix沒有閃爍。時間中斷在C
現在我問我,如果操作系統(Windows,Linux,MacOSX)可以做同樣的事情。 (我期望它。)
有人可以給我更多的信息,我沒有在WWW中找到任何東西。 我想每1ms調用一次函數(僅供學習)。
有兩種不同的方法可以在內核空間或用戶空間中執行它, 在內核空間我認爲您可以在任何操作系統上至少在Linux和Windows上執行它。
從用戶空間有不同的Linux和Windows的實時擴展, 例如https://rt.wiki.kernel.org/index.php/Main_Page,沒有使用這種修改我懷疑你可以從用戶空間1ms週期調用一些函數。
我想在用戶空間中運行它。所以我應該使用CONFIG_PREEMPT_RT。修補linux內核不應該是問題(我之前做過)。但是,Windows是什麼? – clausismus
之前,你應該修補內核或使用rt回購,然後是用'CONFIG_PREEMPT_RT'重建內核 – fghj
好吧,我現在編譯了最新的內核(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)?
*一般*,對於通用桌面/服務器操作系統,我會說答案是「否」。另一方面,1 kHz不是經常超頻的,但這樣的系統並不能保證實時響應。 – unwind