MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Добрый день, уважаемые знатоки! Тема такая: Необходимо часть функций (т.н. метрологически значимые) разместить в отдельной секции, чтобы сформировать по ним отдельную контрольную сумму. Компилятор - 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) распознаются без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба предлагаю сделать чуток иначе. объявляете в скрипте линкера секцию 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 с метками границ секции, они становятся доступны при линковке, пример сверху эту очевидность прикручиваетк Вашей секции. Вам тупо нада разобратся как работает линкер и поковырятся в скрипте. если неполучится сообщайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 23 мая, 2011 Опубликовано 23 мая, 2011 (изменено) · Жалоба Попробуйте так: unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology)) Изменено 23 мая, 2011 пользователем IgorKossak Тэг [code] для короткого кода! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба предлагаю сделать чуток иначе. объявляете в скрипте линкера секцию... Это понятно, но идеологически неправильно. Да и размер заранее (как бы) неизвестен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Попробуйте так: unsigned short *addr_start = (unsigned short *)((unsigned short)(&_start_metrology)) мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology Это понятно, но идеологически неправильно. Да и размер заранее (как бы) неизвестен вы же не сказали деталей ... тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно мне не совсем понятно зачем ее по фиксированному адресу размещать это раз размер заранее известен - верхний край флеша! это два Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology Интересный тогда вопрос - а кто размещает секции, разве не он? Ведь функции размещены где надо, с адреса B000. Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Интересный тогда вопрос - а кто размещает секции, разве не он? Ведь функции размещены где надо, с адреса B000. Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет? линкер не размещает - он кладет туда куда Вы разместили их в скрипте линкера ну ж написал - _start_metrology не объявлена в скрипте линкера! он ниоткуда не выдумывается линкером. иначе я бы мог сказать '' а почему при обращении к _super_puper_mega_start__metrology тоже проблемы какието ". это ВЫ!!! должны _start_metrology определить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Интересный тогда вопрос - а кто размещает секции, разве не он? Ведь функции размещены где надо, с адреса B000. Почему при размещении функций адрес известен, а при обращении к _start_metrology - нет? может быть дело в количестве подчеркиваний перед start и stop ? В первом сообщении у вас их было два. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба мысль глубокая и интересная но вопрос остется открытым - а где линкеру брать адрес _start_metrology Без проблем находит... С Crossworks'ом я такое часто пользую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба тогда смело вносите свою секцию как подсекцию .text и тогда все будет идеологически правильно Как это сделать? может быть дело в количестве подчеркиваний перед start и stop ? В первом сообщении у вас их было два. Нет, уже пробовали. :) Как и различные приведения типов. Таки придётся линкер изучать :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Без проблем находит... С Crossworks'ом я такое часто пользую. ну если у вас оно само работает то я значит ничего не понимаю. :( 2_MrYuran добавте в описание вотэто; .text { .......... .metrology { __start_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */ *(.metrology) /* сюда линкер сложит код с атрибутом секции metrology */ *(.metrology*) /* сюда линкер сложит код с атрибутом секции metrology */ __stop_metrology = . /* объявление символа адрес которого будет при линковке доступен по имени */ .......... } должно работать. тока теперь адрес начала не фиксированнный . хотя в принципе можно попробываить уговорить сделать дыру в прошивке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Ладно, начинаем по порядку. LDFLAGS += -Wl,--section-start LDFLAGS += -Wl,.metrology=0xB000 Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу. Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба Ладно, начинаем по порядку. LDFLAGS += -Wl,--section-start LDFLAGS += -Wl,.metrology=0xB000 Объявляем линкеру собственную секцию и привязываем её к фиксированному адресу. Собственно, с этого момента у него вся инфа есть. (ну разве что конец подсчитать после размещения всех функций). я с командной строки ничего так незасовывал линкеру - все чеерз скрипт - теже яйца но документально оформленные в виде файла, по идее должно работать но мне не очевидно как указать какой секции соответствует --section-start... я их могу в командной строке передать милион и секций и символов - где соответствие, потом я не вижу объявление символа конца секции... советую не морочить себе голову сделать через скрипт а когда появится свободное время разобратся в косяках Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 23 мая, 2011 Опубликовано 23 мая, 2011 (изменено) · Жалоба Работающий код: 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)) Собирается без проблем. Изменено 23 мая, 2011 пользователем IgorKossak Тэг [code] для короткого кода! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 29 23 мая, 2011 Опубликовано 23 мая, 2011 · Жалоба советую не морочить себе голову сделать через скрипт а когда появится свободное время разобратся в косяках Посоветуйте ещё, где по скриптам линкера толковая инфа. Желательно прямой ссылкой. Thnks. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться