Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: KEIL ARM MDK 4.х и взаимодействие Assembler и С.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
KnightIgor
Привет коллегам.

Имеется ARM MDK 4.х от KEIL. В различных ассемблерных файлах одного проекта происходит вызов макро, которое размещает в предопределенной секции кода некоторое слово (адрес процедуры):

MACRO
DEFINE_MAIN_ENTRY $USER_MAIN

AREA DSP_MAIN_TABLE ; "open" section

EXTERN $USER_MAIN
DCD $USER_MAIN ; allocate a word

MEND


В главном модуле идет один раз объявление:

AREA DSP_MAIN_TABLE, DATA, READONLY
EXPORT DSP_MAIN_TABLE

А по проекту раскиданы:

DEFINE_MAIN_ENTRY PROC1

...
DEFINE_MAIN_ENTRY PROC2

и т.д.

В итоге после компиляции и сборки появляется таблица в секции с именем DSP_MAIN_TABLE, причем количество элементов в таблице (размер) определяется количеством вызовов макро. Начальный адрес таблицы есть само имя секции DSP_MAIN_TABLE. В С коде конструкцией вроде extern void * DSP_MAIN_TABLE можно заполучить адрес таблицы в памяти. Внимание - вопрос: как в С коде узнать еще, какой размер имеет таблица, то есть, каков размер секции?
scifi
Вот тут сказано, что линкер определяет символы в том числе для размера каждой секции (mysection$$Length). Но вот можно ли до них добраться из сишного кода - вопрос.
KnightIgor
Цитата(scifi @ Aug 16 2011, 21:33) *
Вот тут сказано, что линкер определяет символы в том числе для размера каждой секции (mysection$$Length). Но вот можно ли до них добраться из сишного кода - вопрос.


Спасибо за ссылку - помогло! Правда, обнаружил интересную особенность этих самых символов: чтобы получить значение нужно использовать как бы адрес переменной. Пример:

1). Объявление (как и указано в доке):

extern unsigned int DSP_MAIN_TABLE$$Length;

2). Использование значения длины:

unsigned int len;
...
len = (unsigned int)&DSP_MAIN_TABLE$$Length;
...

То же касается и других символов как xxx$$Base и xxx$$Limit: надо рассматривать их как переменные, адрес которых в памяти (через &) и есть собственно адрес секции и адрес первого байта за ней.
scifi
Цитата(KnightIgor @ Aug 17 2011, 13:02) *
То же касается и других символов как xxx$$Base и xxx$$Limit: надо рассматривать их как переменные, адрес которых в памяти (через &) и есть собственно адрес секции и адрес первого байта за ней.

Что как бы логично, потому что Base и Limit - суть адреса. Ну а Length сделали аналогично. Тоже логично, ведь роль линкера при сборке сишного (и иного) кода - подстановка адресов.
KnightIgor
Цитата(scifi @ Aug 17 2011, 12:07) *
Что как бы логично, потому что Base и Limit - суть адреса. Ну а Length сделали аналогично. Тоже логично, ведь роль линкера при сборке сишного (и иного) кода - подстановка адресов.


Может и логично, но совершенно сбивает с толку *.MAP файл, где (для моего случая) такая запись есть:

DSP_MAIN_TABLE$$Length 0x00000008 Number 0 anon$$obj.o ABSOLUTE

Пойди догадайся, что чтобы получить эти 0x00000008 в программу на С надо написать &DSP_MAIN_TABLE$$Length! В доке и намека нет. Я долго удивлялся, что за фигня под отладчиком показывается, и лишь чисто случайно и методом тыка наткнулся на &.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.