Перейти к содержанию
    

Размещение части функций в отдельной секции

Добрый день, уважаемые знатоки!

Тема такая:

Необходимо часть функций (т.н. метрологически значимые) разместить в отдельной секции, чтобы сформировать по ним отдельную контрольную сумму.

Компилятор - MSPGCC.

Делаем так:

 

объявляем секцию в makefile

LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000

 

Размещаем в этой секции необходимые функции:

void ShowMiddleTemp(struct IND_PARAMS_Channel *stParams, unsigned char ucCol, unsigned char ucPage) __attribute__ (( section(".metrology") ));

 

Вызываем функцию, использующую адреса границ нашей секции:

extern unsigned short __start_metrology;
            extern unsigned short __stop_metrology; 

unsigned short  *addr_start = &__start_metrology;
unsigned short  *addr_stop = &__stop_metrology;


MyCRC32 = Crc32(addr_start, (addr_stop - addr_start));

 

========================================

 

Результат: undefined reference to `__start_metrology'

 

Выдержки из .map и .lst и .elf:

 

 .metrology      0x0000b000      0x57a

__start_metrology                                 ./Obj/ххх.o
__stop_metrology                                  ./Obj/ххх.o

Address of section .metrology set to 0xb000

SYMBOL TABLE:
0000b000 l    d  .metrology00000000 .metrology

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .metrology        PROGBITS        0000b000 0097d8 00057a 00  AX  0   0  2

 

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

Но при этом ссылки на её границы не определены.

 

Какие будут мысли?

 

PS; что характерно, идентификаторы встроенных секций (например, _vectors_end) распознаются без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

предлагаю сделать чуток иначе.

 

объявляете в скрипте линкера секцию

MEMORY
{
  flash   (rx)  : ORIGIN = ....., LENGTH = ....
  metrology (rx) : ORIGIN = 0xB000, LENGTH=.....
  ram    (rwx)  : ORIGIN =.....,   LENGTH = ....
  ..............

  ..............
}

SECTIONS 
{
    . = 0;    
                                
    .text :
       {
        ..........................
       } >flash
        .metrology 
      {
          __start_metrology = .
          *(.metrology)
      *(.metrology*)
         __stop_metrology = .
      } >flash

 

 

PS; что характерно, идентификаторы встроенных секций (например, _vectors_end) распознаются без проблем.

эта характерность станет очевидной если вы взглянене в скрипт линкера - я телепатически уверен что там описана секция vectors с метками границ секции, они становятся доступны при линковке, пример сверху эту очевидность прикручиваетк Вашей секции.

 

Вам тупо нада разобратся как работает линкер и поковырятся в скрипте. если неполучится сообщайте.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте так:

unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))

Изменено пользователем IgorKossak
Тэг [code] для короткого кода!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

предлагаю сделать чуток иначе.

 

объявляете в скрипте линкера секцию...

Это понятно, но идеологически неправильно.

Да и размер заранее (как бы) неизвестен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте так:

unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology))

мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology

 

Это понятно, но идеологически неправильно.

Да и размер заранее (как бы) неизвестен

вы же не сказали деталей ...

тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно

мне не совсем понятно зачем ее по фиксированному адресу размещать это раз

размер заранее известен - верхний край флеша! это два

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology

Интересный тогда вопрос - а кто размещает секции, разве не он?

Ведь функции размещены где надо, с адреса B000.

Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересный тогда вопрос - а кто размещает секции, разве не он?

Ведь функции размещены где надо, с адреса B000.

Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?

линкер не размещает - он кладет туда куда Вы разместили их в скрипте линкера

 

ну ж написал - _start_metrology не объявлена в скрипте линкера! он ниоткуда не выдумывается линкером. иначе я бы мог сказать '' а почему при обращении к _super_puper_mega_start__metrology тоже проблемы какието ". это ВЫ!!! должны _start_metrology определить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересный тогда вопрос - а кто размещает секции, разве не он?

Ведь функции размещены где надо, с адреса B000.

Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет?

 

может быть дело в количестве подчеркиваний перед start и stop ?

В первом сообщении у вас их было два.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology

 

Без проблем находит... С Crossworks'ом я такое часто пользую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно

Как это сделать?

 

 

может быть дело в количестве подчеркиваний перед start и stop ?

В первом сообщении у вас их было два.

Нет, уже пробовали. :)

Как и различные приведения типов.

 

Таки придётся линкер изучать :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Без проблем находит... С Crossworks'ом я такое часто пользую.

ну если у вас оно само работает то я значит ничего не понимаю. :(

 

 

2_MrYuran

добавте в описание вотэто;

 

.text

{

..........

.metrology

{

__start_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */

*(.metrology) /* сюда линкер сложит код с атрибутом секции metrology */

*(.metrology*) /* сюда линкер сложит код с атрибутом секции metrology */

__stop_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */

..........

}

 

должно работать. тока теперь адрес начала не фиксированнный . хотя в принципе можно попробываить уговорить сделать дыру в прошивке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, начинаем по порядку.

LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000

 

Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу.

Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ладно, начинаем по порядку.

LDFLAGS += -Wl,--section-start
LDFLAGS += -Wl,.metrology=0xB000

 

Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу.

Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций).

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работающий код:

gAppParamPage = ((u32)&__FLASH_segment_used_end__ + FLASH_PAGE_SIZE) & ~(FLASH_PAGE_SIZE - 1);

 

В .map:

__FLASH_segment_used_end__ = (ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + SIZEOF (.data))

 

Собирается без проблем.

Изменено пользователем IgorKossak
Тэг [code] для короткого кода!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

советую не морочить себе голову сделать через скрипт а когда появится свободное время разобратся в косяках

Посоветуйте ещё, где по скриптам линкера толковая инфа.

Желательно прямой ссылкой.

Thnks.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...