Добрый день, уважаемые знатоки!
Тема такая:
Необходимо часть функций (т.н. метрологически значимые) разместить в отдельной секции, чтобы сформировать по ним отдельную контрольную сумму.
Компилятор - 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) распознаются без проблем.
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)