1

Здравствуйте! У меня следующая проблема: скачал linux-headers-2.6.32-art_20110303_i386.deb для Linux Ubuntu 10.04, установил. При попытке скомпилировать следующую программу:

// asd.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/art_task.h>

int main(int argc, char *argv[])
{
    art_prio_t prio;
    if (argc < 3 || (prio = atoi(argv[1])) < ART_PRIO_MIN ||
         prio > ART_PRIO_MAX) {
         fprintf(stderr, "usage: %s prio file arg .../n", argv[0]);
         return -1;
    }
    if (art_enter(prio, ART_TASK_RR, 0) == -1) {
         perror("art_enter");
         return -1;
    }
    if (execvp(argv[2], &argv[2]) == -1) {
         perror("execvp");
         return -1;
    }
    return 0;
}

пишет ошибку:

/tmp/ccVIkQup.o: In function `main':
asd.c:(.text+0x74): undefined reference to `art_enter'
collect2: ld returned 1 exit status

Компилировал с помощью gcc: gcc asd.c -o twest.

2 (09.06.2011 21:00:51 отредактировано Fat-Zer)

что за art? и вы уверены, что это системный вызов, а не какая-то внутренняя функция? и вообще, что он должен делать?

95% процентов проблем находятся между клавиатурой и стулом.

3

ART Linux (Advanced Real-Time Linux) является операционной системой реального времени. Разрабатывается Исследовательским центром Digital Human Research Center при Токийском Национальном Политехническом Институте (AIST). Ставится на Ubuntu Linux 10.04. Насколько я понял он работает как второе ядро, позволяя программе работать в режиме реального времени.
То что это системные вызовы (art_enter) я уверен, программу я брал отсюда (http://art-linux.sourceforge.net/), там и написано более подробно про эту систему.

4

мм... жёсткое реальное время...
само ядро ставили или самостоятельно собирали? загрузились с него? не уверен, как gcc системные вызовы обрабатывает и что нужно указывать при линковке...
на всякий случай: вы уверены, что вам это нужно, нужно именно это и что вы понимаете, что делаете?

95% процентов проблем находятся между клавиатурой и стулом.

5 (09.06.2011 22:30:44 отредактировано r1u1)

Насколько я понял ядро ставится само при установке linux-headers-2.6.32-art_20110303_i386.deb, а как его запускать я нигде не могу найти, то же относится к компиляции приведенной программы через gcc.
Если честно я не сильно разбираюсь в Linux, но у меня есть готовая программа которая читает из файла раз в 30 сек информацию и выдавать ответ, осталось только запустить ее в режиме реального времени.

6

r1u1 пишет:

Насколько я понял ядро ставится само при установке linux-headers-2.6.32-art_20110303_i386.deb

нет, вы поставили только хедеры, посмотрите, что в пакете ради интереса...
пакет с ядром должен будет называться linux-image-2.6.32-art_20110303_i386.deb или что-то вроде того...

r1u1 пишет:

у меня есть готовая программа читает из файла раз в 30 сек информацию и выдавать ответ, осталось только запустить ее в режиме реального времени.

вы понимаете, что такое система реального времени? это система, которая должна реагировать на внешнее событие за определённое время. например система управления самолётом, системы различных роботов или управления каким-то сложным производством. А ваш один несчастный процесс, наверняка,  достаточно запустить на обычной системе с повышенным приоритетом:

 Консоль:
nice -n -10 <команда> <аргументы>

95% процентов проблем находятся между клавиатурой и стулом.

7 (10.06.2011 00:42:52 отредактировано r1u1)

Скачал и установил linux-image-2.6.32-art_20110303_i386.deb, все равно таже ошибка.

Fat-Zer пишет:

Система реального времени - это система управления
каким-то сложным производством.

Моя программа определяет загруженность материалом газоструйной мельницы, и если она пуста посылает сигнал что бы ее загрузить. Т.е. надо сделать так что бы она не реагировала на системные вызовы Linux, и ее нельзя было убить с помощью сигналов TERM и т.п.

8

r1u1 пишет:

Скачал и установил linux-image-2.6.32-art_20110303_i386.deb, все равно таже ошибка.

в /boot должен появится новый образ ядра. его надо прописать в загрузчик. в бубунте grub2 используется, я с ним не знаком, так что погуглите как это сделать(может он и сам автоматом добавил новую строчку)... потом перезагрузитесь с новым ядром... если после этого не слинкуется - будем думать...

r1u1 пишет:

Т.е. надо сделать так что бы она не реагировала на системные вызовы Linux, и ее нельзя было убить с помощью сигналов TERM и т.п.

системные вызовы - это точки входа ядра.
это вряд ли оставит сигналы... большинство сигналов можно обработать.

95% процентов проблем находятся между клавиатурой и стулом.

9

Fat-Zer пишет:

в /boot должен появится новый образ ядра. его надо прописать в загрузчик. в бубунте grub2 используется, я с ним не знаком, так что погуглите как это сделать(может он и сам автоматом добавил новую строчку)... потом перезагрузитесь с новым ядром

Все зделал как вы сказали, Linux запустился нормально, но все равно таже ошибка при компиляции. А в grub2 надо было просто прописать update-grub и он сам добавляет ядро ART 2.6.32. Только он почемуто его впихнул в подпункт "previous Linux versions". Может потому что у меня на моем ubuntu стоит ядро 2.6.38-8. Может из-за этого и программа не хочет компилится?

10

r1u1 пишет:

Может из-за этого и программа не хочет компилится?

нет, не из-за этого... это просто порядок записей... можете ещё почитать про редактирование конфигурации grub'а.

в пакете с ядром идёт файл /usr/lib/art_syscalls.o попробуйте с ним слинковать... т.е.

 Консоль:
gcc asd.c /usr/lib/art_syscalls.o

95% процентов проблем находятся между клавиатурой и стулом.

11

Заработало! Спасибо вам большое! Откомпилировал как вы сказали и все работает.