[IAR] как я могу распечатать начало конечного адреса раздела?

1. Создаю кастомный раздел для myTest в.icf

define symbol __ICFEDIT_region_TEST_start__ = (0x10080000);
define symbol __ICFEDIT_region_TEST_end__ = (0x100DFFFF);
define region TEST_region  = mem:[from __ICFEDIT_region_TEST_start__ to __ICFEDIT_region_TEST_end__];
place at start of TEST_region {section .test_cases_entries};

2. Я кодирую тест в test.c

#pragma section = ".test_cases_entries"
void pfm_test_cases_init(void)
{
  struct pwb_altest_desc *start,*stop;
  start = __section_begin(".test_cases_entries");
  stop = __section_end(".test_cases_entries");
  printf("test section start = %x \n\r",start);
  printf("test section end = %x \n\r",stop);
}
  1. результат ответ
test section start = 0
test section end = 0
  1. ожидаем результата: начало раздела 0x10080000? конец раздела 0x100DFFFF?

1 ответ

Решение

__section_begin(".section") а также __section_end(".section") будет 0, если нет части раздела .sectionвключен в окончательный двоичный файл. В вашем случае вы сначала должны убедиться, что раздел.test_case_entriesне пусто, т.е. какой-то модуль в вашем проекте помещает данные в этот раздел. Затем вам нужно заставить компоновщик включить эти данные в окончательный двоичный файл. Это делается либо путем ссылки на данные в каком-либо модуле (__section_begin а также __section_end не учитывается), объявите данные как __root, или используя --keep в командной строке компоновщика.

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

test.c:

#include <stdio.h>

// Make the compiler recognize .section as a section for __section_begin and
// __section_end.
#pragma section = ".section"

void main(void)
{
  // Find the start and end address of .section
  int *start = __section_begin(".section");
  int *stop = __section_end(".section");
  printf("section start = %x \n", start);
  printf("section end = %x \n", stop);
}

// Put data in .section and make the data root to ensure is is included.
// This can be in a different file.
#pragma location=".section"
__root int data[100];

Часть test.icf

define symbol TEST_start = (0x10080000);
define symbol TEST_end   = (0x100DFFFF);
define region TEST_region  = mem:[from TEST_start to TEST_end];
place at start of TEST_region {section .section};
Другие вопросы по тегам