Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Общие вопросы по операционным системам семейства Linux.
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

MX_Master писал(а):По моим прикидкам, gpio.read и write в апельсине могут вместе занимать до 20 мкс и более.
Михаил, поделись "прикидками", в смысле как измерял и в каких условиях. Это важно.
Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение MX_Master »

LinuxCNC замеряет всё сам, по бырому подсмотреть можно с консоли:

halcmd show all
halcmd show all stepgen
halcmd show all трампарам
...

Для каждой функции там есть время выполнения в наносекундах.
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):Выделил два ядра (2,3) xenomai-ну, а грузится только одно - последнее 3-е ядро. Как-то странно он нагрузку распределяет.
последнее cpu3 лучше оставить в покое. На нём крутится со-ядро, которое рулит всеми прерываниями и запуском РТ задач.
DmitriiNT писал(а):Кто знает, за связь с Cobalt-ом в LinuxCNC какие файлы отвечают?
В текущей версии LinuxCNC использует xenomai только, как вариант RTPREEMPT, т.е. работает в пространстве пользователя.
Тот факт, что тебе удалось это преодолеть, уже большой прогресс.
Что LinuxCNC хочет, смотри "linuxcnc/src/rtapi/rtapi*.h
Что предоставляет ядро xenomai соответственно в "xenomai/include/cobalt/*.h"
DmitriiNT писал(а):Может можно их переписать, и заставить работать base_thread в пространстве ядра?
Возможность запустить задачу в РТ режиме предоставляет "xenomai/include/alchemy/*.h"
Как бы работы не початый край.
Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

MX_Master писал(а):LinuxCNC замеряет всё сам,
И результат зависит от того на каком ядре и в каком пространстве эта задача выполняется.
Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
MX_Master
Мастер
Сообщения: 7465
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3088
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение MX_Master »

Пошёл-ка я нахрен из этой темы, тут и без меня слишком много умных парней...
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

MX_Master писал(а):Пошёл-ка я нахрен из этой темы
:thinking:
Диалог полезен всем! Ты не находишь, что собеседник может заблуждаться и имеет право иметь своё мнение?
Приведи аргументы!
"нахрен" это не вежливо.
Платы: BPI-M3, BPI-A64, OPI-PC2
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

MX_Master писал(а):Дмитрий, не забывай, что кроме значения latency, ещё важно знать, сколько времени занимает сам базовый период. В нём, как минимум, будут крутится 3 функции - gpio.read, stepgen.make-pulses и gpio.write. Процессор апельсина, который работает на частоте ~1.3 ГГц, в этом плане даже до 4-го пня (3 ГГц) не дотягивает ;)

По моим прикидкам, gpio.read и write в апельсине могут вместе занимать до 20 мкс и более. Если прибавить сюда время от stepgen.make-pulses, общая сумма станет заметно больше. К тому же, я сомневаюсь, что кто-то возьмётся переписывать эти фунции на ассемблере, чтобы хоть как-то сократить время их выполнения.

Так что, перед игрищами с latency, я бы для начала замерил базовый период, а уж потом бежал уменьшать latency :)
Доброго Вам!
Вот буду писать драйвер hal_gpio_rtdm тогда эти вопросы буду решать. Можно и на ассемблере, я начинал с него, если приспичит, то можно. Хотя "Си" не далеко ушел от ассемблера - после компиляции и есть машинные коды. Это в современных языках нужен интерпретатор, который отбирает у системы львиную долю времени.
Пока копаю путь к ядру.
При запуске Linuxcnc открывает 3 потока, latency-test - 4 потока с Cobalt.
Подскажите, как сие цифры интерпретировать?
Вложения
Screenshot from 2020-03-14 20-35-14.png (4943 просмотра) <a class='original' href='./download/file.php?id=178292&sid=bca634fa10b6883b54828bdaac38a11c&mode=view' target=_blank>Загрузить оригинал (225.44 КБ)</a>
Последний раз редактировалось DmitriiNT 14 мар 2020, 19:15, всего редактировалось 1 раз.
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

going писал(а):В текущей версии LinuxCNC использует xenomai только, как вариант RTPREEMPT, т.е. работает в пространстве пользователя.
Тот факт, что тебе удалось это преодолеть, уже большой прогресс.
Что LinuxCNC хочет, смотри "linuxcnc/src/rtapi/rtapi*.h
Что предоставляет ядро xenomai соответственно в "xenomai/include/cobalt/*.h"
Есть у меня некоторые соображения по этой теме.
Набрел я тут недавно на вот такое чудо:
https://github.com/mark-v-d/linuxcnc/tree/xenomai-3
Как есть не компилируется - не видит исходники xenomai_dev. И я не нашел, где указывается компилятору путь к исходникам xenomai_dev.
В общем он говорит, что у него полностью переработан модуль xenomai и работает в пространстве ядра.
Надо проверить.
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):Есть у меня некоторые соображения по этой теме.
Набрел я тут недавно на вот такое чудо:
Посмотрю завтра.

P.S. если честно то я отошёл от xenomai и пытаюсь собирать EVL ядро.
Для меня это немного вернуться вниз.
Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):Подскажите, как сие цифры интерпретировать?
А собственно трудится rtapi_app как рт задача. Вроде всё хорошо.
Платы: BPI-M3, BPI-A64, OPI-PC2
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

going писал(а):
DmitriiNT писал(а):Есть у меня некоторые соображения по этой теме.
Набрел я тут недавно на вот такое чудо:
Посмотрю завтра.

P.S. если честно то я отошёл от xenomai и пытаюсь собирать EVL ядро.
Для меня это немного вернуться вниз.
Значить нормально все, можно драйвер hal_gpio_rtdm начинать писать. Мне еще интерфейс понадобится собственный. Какую-нибудь среду разработки порекомендуете? По форумам - рекомендуют Qt creator или Kdevelop. Ух, давненько не брал я в руки шашек... :D
А EVL ядро какое-то преимущество дает?
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

going писал(а):
DmitriiNT писал(а):Есть у меня некоторые соображения по этой теме.
Набрел я тут недавно на вот такое чудо:
Посмотрю завтра.

P.S. если честно то я отошёл от xenomai и пытаюсь собирать EVL ядро.
Для меня это немного вернуться вниз.
Я скопировал его исходный код, касающийся работы xenomai, в свой проект..., - так удалось скомпилировать linuxcnc.
Запускаю..., в принципе, внешне, ни каких изменений и джиттер и базовый период те же от 12 до 25 скачет - это если без нагрузок.
Увидел два предупреждения в терминале:

Код: Выделить всё

cnc@orangepipc2:~$ latency-test
   0"006.341| WARNING: [main] duplicate call from main program to xenomai_init() ignored
   0"006.460| WARNING: [main] (xeno-config --no-auto-init disables implicit call)
Note: Using XENOMAI (posix-skin) realtime
Двойной вызов инициализации xenomai.
И ядро xenomai сконфигурировано без разрешения для не явных вызовов. Как можно поменять без пересборки xenomai?

Поискал, откуда вызывается инициализация вижу два места:

Код: Выделить всё

cnc@orangepipc2:~$ grep -r "xenomai_init" /home/cnc/emc/
Binary file /home/cnc/emc/bin/rtapi_app matches
Binary file /home/cnc/emc/lib/libuspace-xenomai.so.0 matches
cnc@orangepipc2:~$ 
rtapi_app -> исходный код uspace_rtapi_app.cc
libuspace-xenomai.so.0 -> исходный код uspace_xenomai.cc
Причем библиотека libuspace-xenomai.so.0 явно вызывается из rtapi_app.
Вот кусок кода:

Код: Выделить всё

static RtapiApp *makeApp()
{
    std::unique_ptr<WithRoot> with_root;

    void *dll = nullptr;
    if(detect_xenomai()) {
        dll = dlopen(EMC2_HOME "/lib/libuspace-xenomai.so.0", RTLD_NOW);
        if(!dll) fprintf(stderr, "dlopen: %s\n", dlerror());
    }

    if(!dll && (euid != 0 || harden_rt() < 0))
    {
        rtapi_print_msg(RTAPI_MSG_ERR, "Note: Using POSIX non-realtime\n");
        return new Posix(SCHED_OTHER);
    }

    if(detect_rtai()) {
	with_root=std::make_unique<WithRoot>();
        dll = dlopen(EMC2_HOME "/lib/libuspace-rtai.so.0", RTLD_NOW);
        if(!dll) fprintf(stderr, "dlopen: %s\n", dlerror());
    }
    if(dll)
    {
        auto fn = reinterpret_cast<RtapiApp*(*)()>(dlsym(dll, "make"));
        if(!fn) fprintf(stderr, "dlopen: %s\n", dlerror());
        auto result = fn ? fn() : nullptr;
        if(result) {
            return result;
        }
    }
    rtapi_print_msg(RTAPI_MSG_ERR, "Note: Using POSIX realtime\n");
    return new Posix(SCHED_FIFO);
}
А где второй, не явный вызов xenomai_init() не нашел.
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

Еще есть упоминание о libuspace-rtai.so.0 в файле Submakefile:

Код: Выделить всё

ifeq ($(CONFIG_USPACE_XENOMAI),y)
USPACE_XENOMAI_SRCS := rtapi/uspace_xenomai.cc
USERSRCS += $(USPACE_XENOMAI_SRCS)
$(call TOOBJSDEPS, $(USPACE_XENOMAI_SRCS)): EXTRAFLAGS += -fPIC $(XENOMAI_CFLAGS)
../lib/libuspace-xenomai.so.0: $(call TOOBJS, $(USPACE_XENOMAI_SRCS))
	$(ECHO) Linking $(notdir $@)
	$(Q)$(CXX) -shared $(LDFLAGS) -o $@ $^ $(XENOMAI_LDFLAGS) -Wl,-soname,$(notdir $@)
TARGETS += ../lib/libuspace-xenomai.so.0
TARGETS += ../lib/libuspace-xenomai.so
endif
Какова тут роль Submakefile?
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

И еще, в rtapi_app есть место, где при старте, подгружаются разные модули для rtapi_app:

Код: Выделить всё

static int do_load_cmd(string name, vector<string> args) {
    void *w = modules[name];
    if(w == NULL) {
        char what[LINELEN+1];
        snprintf(what, LINELEN, "%s/%s.so", EMC2_RTLIB_DIR, name.c_str());
        void *module = modules[name] = dlopen(what, RTLD_GLOBAL | RTLD_NOW);
        if(!module) {
            rtapi_print_msg(RTAPI_MSG_ERR, "%s: dlopen: %s\n", name.c_str(), dlerror());
            modules.erase(name);
            return -1;
        }
	/// XXX handle arguments
        int (*start)(void) = DLSYM<int(*)(void)>(module, "rtapi_app_main");
        if(!start) {
            rtapi_print_msg(RTAPI_MSG_ERR, "%s: dlsym: %s\n", name.c_str(), dlerror());
            dlclose(module);
            modules.erase(name);
            return -1;
        }
        int result;

        result = do_comp_args(module, args);
        if(result < 0) {
            dlclose(module);
            modules.erase(name);
            return -1;
        }

        if ((result=start()) < 0) {
            rtapi_print_msg(RTAPI_MSG_ERR, "%s: rtapi_app_main: %s (%d)\n",
                name.c_str(), strerror(-result), result);
            dlclose(module);
            modules.erase(name);
	    return result;
        } else {
            instance_count ++;
	    return 0;
        }
    } else {
        rtapi_print_msg(RTAPI_MSG_ERR, "%s: already exists\n", name.c_str());
        return -1;
    }
}
Возможно тут второй раз пытается загрузиться libuspace-xenomai.so.0 ????
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):По форумам - рекомендуют Qt creator или Kdevelop
Здесь просто сила привычки. Что привычнее и кажется удобнее, то и надо использовать.
DmitriiNT писал(а):А EVL ядро какое-то преимущество дает?
1-Очень подробная документация.
2- Проект всегда на вершине разработки ядра Linux. (xenomai тормознула на ядре 4.19)
3- Драйвер gpio умеет работать в РТ режиме.
DmitriiNT писал(а):Я скопировал его исходный код, касающийся работы xenomai, в свой проект..., - так удалось скомпилировать linuxcnc.
Дмитрий, как у тебя происходит процесс сборки?
Я всё собирал в armbian, а там начиная с ядра (кросскомпиляция) затем в chroot окружение
сборка библиотек и linuxcnc всё это идёт друг за другом.
Платы: BPI-M3, BPI-A64, OPI-PC2
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):Еще есть упоминание о libuspace-rtai.so.0
Это вроде имеет отношение к ядру rtai.
Для него действительно собираются модули ядра Linux и они должны подгружаться при старте LinuxCNC.
Платы: BPI-M3, BPI-A64, OPI-PC2
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

DmitriiNT писал(а):libuspace-xenomai.so.0
конечно же libuspace-xenomai.so.0
DmitriiNT
Кандидат
Сообщения: 56
Зарегистрирован: 11 дек 2019, 20:17
Репутация: 6
Настоящее имя: Дмитрий
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение DmitriiNT »

going писал(а):Дмитрий, как у тебя происходит процесс сборки?
Я всё собирал в armbian, а там начиная с ядра (кросскомпиляция) затем в chroot окружение
сборка библиотек и linuxcnc всё это идёт друг за другом.
У меня есть твой образ с ядром xenomai.
Дальше просто прямо на плате.
Просто.
git clone https://github.com/mark-v-d/linuxcnc.git emc-xenomai // тут из стандартного git://github.com/linuxcnc/linuxcnc.git - все четко устанавливается
cd emc-xenomai
git checkout xenomai-3 // Ну или любую другую ветку.
......
Если нужно сейчас можно пропатчить и внести изменения в исходный код.
.....
debian/configure uspace
dpkg-checkbuilddeps
debuild -uc -us
....
....Жду 30-40 минут....
....
Потом устанавливаю пакеты:
я устанавливаю с помощью gdebi
запускаю из меню или терминала - радуюсь или огорчаюсь :D
Вот как-то так.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение Serg »

подробно не отвечу - не готов погружаться в эту тему...
DmitriiNT писал(а):Двойной вызов инициализации xenomai.
Забить, хотя бы до этапа наведения марафета в исходниках. Оно само пишет "ignored" - значит внутри есть контроль подобных ситуаций, а значит и коректная их обработка.
DmitriiNT писал(а):Поискал, откуда вызывается инициализация вижу два места:
искать надо в исходниках. В бинарниках можно найти как ссылку на функцию, так и саму функцию.
DmitriiNT писал(а):Причем библиотека libuspace-xenomai.so.0 явно вызывается из rtapi_app.
DmitriiNT писал(а):Возможно тут второй раз пытается загрузиться libuspace-xenomai.so.0 ????
Быблиотека не вызывается, она загружается в память системы при первом-же обращении к любой её функции. Причём загружается только один раз и этот единственный экземпляр используется всеми приложениями, ибо библиотека разделяемая (shared).
DmitriiNT писал(а):И ядро xenomai сконфигурировано без разрешения для не явных вызовов. Как можно поменять без пересборки xenomai?
Для начала стоит выяснить что это такое и с чем едят. Иначе можно будет как-нибудь обнаружить, что и кашу маслом можно испортить... :)
DmitriiNT писал(а):Какова тут роль Submakefile?
Часть Makefile, используемая только в это месте.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
going
Мастер
Сообщения: 516
Зарегистрирован: 29 сен 2013, 20:55
Репутация: 129
Настоящее имя: Леонид
Откуда: г.Киров
Контактная информация:

Re: Xenomai + LinuxCNC, EVL + LinuxCNC из исходников

Сообщение going »

DmitriiNT писал(а):У меня есть твой образ с ядром xenomai.
Дальше просто прямо на плате.
Работать на плате немного грустно.
Базовый комп с Linux на борту, где можно систему сборки разместить имеется?
Если да, тогда можно настроить сборку от ядра и библиотеки xenomai до LinuxCNC.
Будешь всегда на вершине разработки.
Платы: BPI-M3, BPI-A64, OPI-PC2
Ответить

Вернуться в «Прочие вопросы Linux»