Contiki: ошибка, если файл ELF содержит расчет с несколькими неподписанными целыми числами.

Я столкнулся с некоторыми проблемами при работе с ELF-загрузчиком contiki и надеюсь, что кто-то будет так любезен, чтобы дать мне больше информации или несколько советов по решению этих проблем. Далее я постараюсь сделать описание проблемы кратким.

Моя цель:

  • Запустите файл ELF на T-Mote-Sky.

  • Этот файл ELF содержит процесс contiki с вычислением (линейная регрессия выборок данных во времени).

  • Использование «cooja» для моделирования

Информация о коде:

  • Размер файла ELF около 2000 байт.

  • довольно большое вычисление нескольких чисел unsigned-int-16:


    for (i = 0; i < 10; i++) {
    sum_x += records[i].index;
    sum_y += records[i].energy;
    sum_xx += ((uint16_t) records[i].index) * ((uint16_t) records[i].index);
    sum_xy += ((uint16_t) records[i].index) * ((uint16_t) records[i].energy);
    }
    slope = ((size * sum_xy) - (sum_x * sum_y)) / ((size * sum_xx) - (sum_x * sum_x));

  • «записи» инициализируются и определяются в основном процессе, который вызывает elfloader, и доступ к ним осуществляется через внешнее определение.

  • это работает, если я использую константы для вычисления

Проблемы:

  • если я попытаюсь использовать умножение с "*", это приведет к сообщению об ошибке: Symbol not found: __MPY

  • если я попытаюсь использовать деление с "/", это приведет к аналогичному сообщению об ошибке

    • so my workaround is that the multiplications and divisions are based upon additions, and it works (in most cases)
  • Тем не менее, я получаю сообщение об ошибке: «Сегмент не найден:», как только я пытаюсь вычислить наклон.

    • I deduce its an issue with the memory size or trying to get data from the main process via extern, because calculating the slope works if I use constants only.

Заранее большое спасибо за помощь и с наилучшими пожеланиями,

Ка Вэй Ле


person Ca Way Le    schedule 07.10.2014    source источник


Ответы (1)


У меня была аналогичная проблема (символ не найден) при попытке загрузить файл elf, содержащий вычисления с числами с плавающей запятой, поэтому я использовал обходной путь, если кому-то интересно

  • Скомпилируйте файл эльфа

    make elfname.ce SMALL=0
    
  • Откройте файл elf с помощью шестнадцатеричной программы просмотра и найдите часть, в которой хранятся символы. Это ближе к концу файла.

  • Предположим, что там хранятся следующие символы: timer_set __addsf3 __subsf3, printf puts autostart_processes. (Имя загружаемого процесса также находится среди этих значений, но игнорируйте его)
  • Создайте новый файл mysymbols.c в каталоге проекта со следующим содержимым.

    #include "loader/symbols.h"
    
    extern int __addsf3();
    extern int __subsf3();
    extern int etimer_set();
    int printf(const char *, ...);
    extern int puts();
    
    const int symbols_nelts = 7;
    const struct symbols symbols[7] = {
    { "__addsf3", (void *)&__addsf3 },
    { "__subsf3", (void *)&__subsf3 },
    { "autostart_processes", (void *)&autostart_processes },
    { "etimer_set", (void *)&etimer_set },
    { "printf", (void *)&printf },
    { "puts", (void *)&puts },
    { (const char *)0, (void *)0} };
    

    (обратите внимание, что символы должны быть отсортированы)

  • Добавьте следующий код в make-файл

    ifdef CORE
    .PHONY: symbols.c symbols.h
    symbols.c:
         $(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c
    else
         symbols.c symbols.h:
         cp mysymbols.c symbols.c
         cp ${CONTIKI}/tools/empty-symbols.h symbols.h
    endif
    
  • Теперь скомпилируйте файл, содержащий основной процесс.

    make TARGET=sky clean CLEAN=symbols.?
    make your-file.sky TARGET=sky SMALL=0
    
  • Загрузите файл elf на моут, на котором запущен основной процесс, и посмотрите, что произойдет, когда elfloader загрузит elf.

Это сработало для меня в случае ошибки symbol not found.

person finmor    schedule 12.01.2015