rt パッチを使用して Linux カーネル 4.6 をインストールしました。 uname -a の後に rt と PREEMPT が表示されますが、アプリケーションを作成して証明する必要があるため、以下のようなアイデアが浮かびました。5 ミリ秒間スリープさせて、起動してハードウェア時間をチェックし、配列に格納して、ハードウェア時間の差を確認した後、50 回ほど実行します。そのため、正しい方法とそれを実装するためのヒントを知る必要があります。事前に感謝します。
これは私のコードです /* "gcc -o swave swave.c -lrt -Wall" を使用してコンパイルします */
#
include < stdlib.h > #include < stdio.h > #include < time.h > #include < sched.h > #include < sys / io.h >
#define PORT 0x378# define NSEC_PER_SEC 1000000000
/* using clock_nanosleep of librt */
extern int clock_nanosleep(clockid_t __clock_id, int __flags,
__const struct timespec * __req,
struct timespec * __rem);
/* the struct timespec consists of nanoseconds
* and seconds. if the nanoseconds are getting
* bigger than 1000000000 (= 1 second) the
* variable containing seconds has to be
* incremented and the nanoseconds decremented
* by 1000000000.
*/
static inline void tsnorm(struct timespec * ts) {
while (ts - > tv_nsec >= NSEC_PER_SEC) {
ts - > tv_nsec -= NSEC_PER_SEC;
ts - > tv_sec++;
}
}
/* increment counter and write to parallelport */
void out() {
static unsigned char state = 0;
outb(state++, PORT);
}
int main(int argc, char * * argv) {
struct timespec t;
struct sched_param param;
/* default interval = 50000ns = 50us
* cycle duration = 100us
*/
long array[500001], diff[500001];
int n = 500000;
int interval = 50000;
/* set permissions of parallelport */
ioperm(PORT, 1, 1);
if (argc >= 2 && atoi(argv[1]) > 0) {
printf("using realtime, priority: %d\n", atoi(argv[1]));
param.sched_priority = atoi(argv[1]);
/* enable realtime fifo scheduling */
if (sched_setscheduler(0, SCHED_FIFO, & param) == -1) {
perror("sched_setscheduler failed");
exit(-1);
}
}
if (argc >= 3)
interval = atoi(argv[2]);
/* get current time */
clock_gettime(0, & t);
/* start after one second */
t.tv_sec++;
while (n) {
/* wait untill next shot */
clock_nanosleep(0, TIMER_ABSTIME, & t, NULL);
/* do the stuff */
array[n] = t.tv_nsec;
/* calculate next shot */
t.tv_nsec += interval;
tsnorm( & t);
n--;
}
printf("hell\n\n");
n = 500000;
while (array[n]) {
diff[n] = array[n - 1] - array[n];
if (diff[n] != 50000) {
printf("%ld n:%d ", diff[n], n);
}
n--;
}
return 0;
}