Jump to content
Форум по продукции MOXA

lysenkov

Пользователи
  • Posts

    44
  • Joined

  • Last visited

Posts posted by lysenkov

  1. Пришлите, пожалуйста, программу на которой проявляется проблема и текст сообщения об ошибке.

    #include <time.h>
    #include <errno.h>
    #include <stdio.h>
    #include <string.h>
    #define CLOCK_MONOTONIC 1
    int main()
    {
    struct timespec t1;
    if(clock_gettime(CLOCK_MONOTONIC, &t1) < 0)
     printf("clock_gettime() error: %s\n", strerror(errno));
    else
     printf("clock_gettime() ok\n");
    return 0;
    }
    

    Результат выполнения - clock_gettime() error: Invalid argument

     

    Библиотеки стоковой прошивки собраны без определения CLOCK_MONOTONIC.

    Если мы его определяем сами, то в библиотеках поддержка не появляется.

     

    Резюмирую:

    I. в стоковой прошивке существует 2 проблемы: 1) компилятор неверно формирует команды сопроцессора из-за чего портится стек. Проблему можно обойти использованием эмулятора сопроцессора (soft-float). 2) библиотеки и, возможно, ядро собраны без определения CLOCK_MONOTONIC, из-за чего невозможно (или я не знаю как) измерять интервалы времени с высокой разрешающей способностью;

    II. в прошивке 1.2.10 обе эти проблемы решены, но появилась другая - ужасно медленно работают операции с плавающей точкой, выполняет их "железный" сопроцессор. Проблему можно было бы обойти, используя soft-float, но в прошивке 1.2.10 и в соответствующем тулчейне библиотеки soft-float напрочь отсутствуют.

     

    Я вижу два пути обхода/решения проблем:

    I. обход: сделать прошивку на основе 1.2.10, но включить в нее и в соотв. тулчейн библиотеки soft-float и даже собрать тулчейн, чтобы он использовал soft-float по умолчанию;

    II. решение: заставить таки работать железный математический сопроцессор с нормальной производительностью. Зачем-то он встроен в W406? Может (должен) он умеет работать быстрее эмуляции, а не 10 раз медленнее, как сейчас.

     

    P.S. Готов ответить на Ваши дополнительные вопросы, если они будут.

    P.P.S. тут лежит компилятор http://arm.cirrus.com/files/tools/arm-linux-gcc-4.1.1-920t.tar.bz2, который использует математический сопроцессор, не имеет ошибки, приводящей к порче стека при использовании сопроцессора и в котором есть CLOCK_MONOTONIC :) Только библиотеки его приходится подпихивать. Тестовая программа из первого сообщения выполняется за 4.04 сек.

  2. Здравствуйте!

     

    Разработчики пишут следующее:

     

    1. Нужно использовать тулчейн с сайта.

    2. Библиотеки с поддержкой плавающей запятой будут находиться в директории

    /usr/local/arm-linux/lib/gcc/arm-linux/4.2.1/soft-float/

     

    3. main.c нужно собрать со следующими параметрами:

    arm-linux-gcc ./main.c -o main -lrt -msoft-float

     

    4. Т.к. glibc на контроллере старая, и там остутствует определение CLOCK_MONOTONIC, то необходимо добавить его в main.c:

     

    /*

    * The IDs of the various system clocks (for POSIX.1b interval timers):

    */

    #define CLOCK_REALTIME 0

    #define CLOCK_MONOTONIC 1

    #define CLOCK_PROCESS_CPUTIME_ID 2

    #define CLOCK_THREAD_CPUTIME_ID 3

     

    После этого, программа должна выполняться быстрее, примерно за 5.1 с.

     

    Здравствуйте!

    Я уже почти согласен использовать soft-float, т. к. он действительно в разы быстрее работает, но в стоковой прошивке

    отсутствует поддержка CLOCK_MONOTONIC и определение его "вручную" никак не добавляет его поддержки в библиотеках - при его использовании функция clock_gettime() возвращает ошибку. К сожалению, для измерения интервалов времени в высокой разрешающей способностью я замены найти не смог.

    Прошивка на ftp есть уже 1.2.12, только что в ней изменилось - неизвестно...

  3. Опять возвращаемся к истокам, т.е. использованию стоковой прошивки и неиспользованию арифметического сопроцессора для обхода этой проблемы:

    http://old.moxa.ru/f...mentation-fault ?

     

    А хотелось заставить работать сопроцессор быстро и без глюков...

  4. Спасибо!

     

    Есть мысль: у компилятора есть всякие разные ключи :-)

    Компилятор понимает -mcpu=ep9312 -mfpu=maverick

    Эти опции, по идее, должны заставить компилятор сгенерить код, максимально подходящий под процессор и сопроцессор W406.

    Проблема в том, что все библиотеки скомпилированы без этих ключей и линкер, естественно, отказывается это собирать...

  5. Выяснил, что виной падения производительности являются операции с плавающей точкой.

    Если оставить только целочисленные вычисления, то процессоры идут "ноздря в ноздрю" :)

    Возникает следующий вопрос: почему soft-float сильно обгоняет "железный" математический сопроцессор?

    Прошивка не стоковая

    root@Moxa:~# kversion

    W406-LX version 1.2.10

    В стоковой проблема: http://www.moxa.ru/f...entation-fault/

  6. Здравствуйте!

     

    Попал мне в руки другой пром. контроллер, похожий по аппаратным возможностям на W406-LX.

    Вот его процессор:

    /mnt/ufs/root # cat /proc/cpuinfo

    Processor : ARM920T rev 0 (v4l)

    BogoMIPS : 89.79

    Features : swp half

    CPU implementer : 0x41

    CPU architecture: 4T

    CPU variant : 0x1

    CPU part : 0x920

    CPU revision : 0

     

    А вот процессор MOXA W406:

     

    root@Moxa:~# cat /proc/cpuinfo

    Processor: ARM920T rev 0 (v4l)

    BogoMIPS : 98.56

    Features : swp half thumb crunch

    CPU implementer : 0x41

    CPU architecture: 4T

    CPU variant : 0x1

    CPU part : 0x920

    CPU revision : 0

    Cache type : write-back

    Cache clean : cp15 c7 ops

    Cache lockdown : format A

    Cache format : Harvard

    I size : 16384

    I assoc : 64

    I line length : 32

    I sets : 8

    D size : 16384

    D assoc : 64

    D line length : 32

    D sets : 8

     

    Как видно, процессоры очень похожи, как минимум у них одинаковое ядро. Тактовые частоты тоже одинаковые. Более того, у другого контроллера нет арифметического сопроцессора и медленнее память.

    Берем простую программу (можно сильно не изучать - простейшая числодробилка):

    #include <stdio.h>
    #include <time.h>
    #include <malloc.h>
    #include <string.h>
    
    int func(double* k)
    {
      *k -= 11234.32;
      return *k;
    }
    
    int main()
    {
      int i, j, n, m, z=0;
      long long l1, l2;
      double dt;
      struct timespec t1, t2;
      clock_gettime(CLOCK_MONOTONIC, &t1);
      for(i=0; i<1000; i++)
      for(j=0; j<1000; j++) {
         l1 = i*j;
         l2 = l1%(i+1);
         dt = l2+j;
         n = dt+i*(l2-123);
         m = n/12;
         l1 = func(&dt);
         z += l1-m;
      }
      clock_gettime(CLOCK_MONOTONIC, &t2);
      l1 = ((long long)t1.tv_sec)*1000+t1.tv_nsec/1000000;
      l2 = ((long long)t2.tv_sec)*1000+t2.tv_nsec/1000000;
      dt = l2-l1;
      printf("dt=%.3f sec, z=%d\n", dt/1000, z);
      return 0;
    }

    компилируем и запускаем.

     

    на W406-LX время выполнения ~30 секунд. На другом контроллере ~5,4 секунд.

    Различные ключи оптимизации у компилятора пробовал, разница все равно огромная. Версия gcc для W406 - 4.4.2, для другого контроллера - 4.3.2

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

     

    Вопрос: почему такая огромная разница в производительности?

  7. Прошу прощения за задержку с ответом. Сейчас обсуждаем с разработчиками Вашу проблему. Приведите, пожалуйста, схему подключения и параметры реле.

    Здравствуйте!

     

    Тоже простите за столь долгое раздумье...

    Реле используется ABB модель CR-P024DC2, сопротивление обмотки постоянному току 1400 Ом, параллельно обмотке включен модуль CR-P/M-42V, который представляет из себя защитный диод, включенный обратной полярностью параллельно обмотке реле и цепочку из токоограничительного резистора и индикаторного светодиода в прямой полярности.

    Схема включения стандартная по документации: контакт GND MOXA на колодке входов/выходов подключен к "-" источника питания, DO0 - к обмотке реле, "+" питания к другому выводу обмотки реле.

    Алгоритм лишнего включения реле все-таки немного другой. При выключенном реле и перезагрузке W406 реле включается на несколько секунд, затем выключатся.

    Я эту проблему "обошел" другими путями, поэтому на данный момент она не сильно актуальна, но в будущем хотелось бы какого-то ее решения...

  8. Суда по всему внутренняя флеш болеет?

    А какова статистика отказов встраиваемых компьютеров? Мне особенно интересно по малышам, вроде W315, UC-7xxx на risc-процах.

    Например, в смартфонах бэд блоки во встроенной флеши - ситуация абсолютно рядовая.

  9. Последовательность определенная. От программ никак не зависит.

    На выход DO0 подключено реле - обмотка запитана от того же источника питания, что и W406. Параллельно обмотке реле включен защитный диод и индикаторный светодиод для визуального контроля, поэтому наблюдать удобно.

    При подаче питания, ровно как и при перезагрузке случается следующая последовательность: 1. Реле включается на 2-3 сек. 2. Реле выключается на 8-10 секунд.3. Реле включается.

    Временные интервалы приблизительные, с секундомером не стоял. Реле остается включенным - это такой логический ноль у MOXA :)

    Далее программой выход управляется абсолютно нормально в т.ч. может быть восстановлен в предыдущее состояние. Но после снятия/подачи питания или при перезагрузке вне зависимости от текущего состояния выхода повторяется алгоритм 1. 2. 3.

    В идеале, перезагрузка не должна влиять на текущее состояние выхода - вдруг перезагрузка случилась по wathdog'у или просто пора операционку презагрузить? (Ибо uptime встроенного линукса по любому меньше MTBF :) и прикладухи обычно грешны) ) Переподача питания - пусть встанет в определенное состояние и не дергается, а в идеале возвращать предыдущее состояние.

    Моя ситуация - реле управляет запуском дизель-генератора. ,Он, собака, стартует за 1-2 секунды, а потом 5 минут минимум работает (турбо-таймер).

    Пропадание питания на W406 в моем случае почти не реально, а вот перезагрузка...

     

    Простите за много букв.

  10. Здравствуйте!

     

    При перезагрузке W406-LX несколько раз передергиваются дискретные выходы.

    Если они используются для управления чем-либо - понятно, что происходит.

    Как устранить этот эффект?

    Firmware 1.2.10

  11. Здравствуйте!

     

    Гонять копеечные объёмы информации по отдельным волокнам - не слишком ли расточительно? Да еще и по двум волокнам?!

    Если там все равно будет "и интернет и т.д. и т.п.", может загнать трафик сигнализации в vlan? Ведь "и т.д. и т.п." наверняка придется разделять. А преобразователь ethernet<->rs-485 купить для меди. Как раз на разницу в цене преобразователя можно коммутатор с поддержкой vlan купить с гигабитной оптикой наверх. А сэкономленные деньги заработать :-)

  12. Спасибо, я примерно так и поступил. Думаю что это относится и к другим контроллерам MOXA, где используется подобный Toolchain.

     

    Именно так, поскольку кроме W406-LX я пока ничего не "трогал". И на нем аналогичная особенность. Интересно, а под windows CE будет аналогично?

  13. Проблема с выравниванием.

    Там, где неверный результат, адрес ptr32 не кратен четырем.

    Обходится по разному. Например, можно копировать из нужного адреса в переменную

    нужного типа через memcpy:

    memcpy(&uint32_var, &ar, sizeof(uint32_var));

    memcpy(&double_var, &ar, sizeof(double_var));

     

    или извращаться с union'ами.

    Не так элегантно, не так эффективно, зато 100% работает.

    Я пока не понял происхождение этого эффекта - это особенность arm процессора или компилятора.

  14. Проблемы с библиотеками из стандартной поставки или сторонними?

    Из стандартной поставки.

    Вроде разобрался. Нужно не использовать опцию -msoft-float, а использовать другое имя компилятора: armsf-linux-gcc. Тогда и генерируется программный код для оперций с плавающей точкой. Но с этим тоже проблемы при проверке. Например X*Y не равно Y*X или sqrt(X*X) не равно X. И зачем такое счастье? Пока заменил операцию, вызывающую проблемы на "полусофтверное" решение. Других проблем пока не выявлено. Посмотрю, что будет дальше...

     

    Доработка, скорее всего, возможна, т.к. патчи от сторонних разработчиков в интернете есть. Ждём, что нам ответит производитель устройства.

    Очень хочется положительного решения...

     

    P.S. что-то с часами на форуме - отправляю письмо в 16:50, на форуме написано 17:10 (грубо).

×
×
  • Create New...