[IAR] как я могу распечатать начало раздела конечного адреса? - PullRequest
0 голосов
/ 24 февраля 2020

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. Я кодирую тестовый тест. 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);
}
результат ответа
test section start = 0
test section end = 0
ожидаемый результат: начало секции 0x10080000? конец секции 0x100DFFFF?

1 Ответ

0 голосов
/ 24 февраля 2020

__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};
...