Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-авг-23 15:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-07 01:39 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
Здравствуйте.
Хотелось бы для себя прояснить некоторые вопросы по асм.
В стартапе есть определение макроса:

SET_HANDLER .MACRO Name
.EXTRNF16 Name .VOID(.VOID)
.DCD Name
.ENDMAC

Для каких целей он здесь создан?
Как я понимаю он создан для объявления внешней функции .EXTRNF16 Name .VOID(.VOID)

Вот описание директивы .EXTRNF :

Синтаксис:

.EXTRNF[16|32] function_name [expr1] [(expr2 [, expr3] ...)]

Директива .EXTRNF используется для объявления внешних подпрограмм/функций, написанных на ассемблере (определенных при помощи .FUNC/.ENDF в другом модуле), и внешних функций, написанных на C. Эта директива определяет имя функции function_name со следующими атрибутами(меня интересует атрибут значение):

Значение

определяется на
этапе
связывания

Этот атрибут содержит адрес самой функции которая написана например в другом месте?

Для чего нужна строка в макросе?
.DCD Name ?

Потом идет

__Vectors .LABELD
.DCD (.SFE CSTACK) + 1 ; Top of Stack
SET_HANDLER Reset_Handler ; Reset Handler

Вот описание директивы .LABELD:

Эта группа директив используется для определения типизованных меток. Имени метки назначаются атрибуты 'operand type' и 'type'. Такие метки предпочтительнее использовать для обозначения начала и конца таблиц данных. Эти директивы не меняют программный счетчик ассемблера.

Типизованным меткам назначаются следующие атрибуты :

Значение
текущее значение
программного счетчика ассемблера

Allocation
allocation текущего сегмента

Relocatability
relocatability текущего сегмента

Здесь написано что имя метки имеет атрибуты и типизованным меткам назначаются атрибуты. В чем разница между именем метки и типизованной меткой которой тоже назначены атрибуты?
Директива Operand Type Type Alignment
.LABELB BYTE unsigned char байт

Например:
Атрибут operand type (тип операнда) используется Ассемблером для проверки соответствия кода инструкции и размера и/или выравнивания операндов этой инструкции.
Какие у метки __Vectors .LABELD в данном коде существуют аперанды?
И почему выбрана именно .LABELD у которой на конце D?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-10 07:34 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
SET_HANDLER .MACRO Name
.EXTRNF16 Name .VOID(.VOID)
.DCD Name
.ENDMAC

Для каких целей он здесь создан?
Как я понимаю он создан для объявления внешней функции .EXTRNF16 Name .VOID(.VOID)

Макрос используется при создании отдельных записей в таблице векторов (см. метку __Vectors).
При этом директива
Код:
    .DCD      Name

размещает в таблице 32-битную константу, значение которой равно адресу Name.

Директива
Код:
    .EXTRNF16 Name          .VOID(.VOID)

указывает ассемблеру, что Name - это Thumb-функция типа void (void) (т.е. не имеет параметров и не возвращает значения), определенная во внешнем программном модуле.

agusha писал(а):
Директива .EXTRNF используется для объявления внешних подпрограмм/функций, написанных на ассемблере (определенных при помощи .FUNC/.ENDF в другом модуле), и внешних функций, написанных на C. Эта директива определяет имя функции function_name со следующими атрибутами(меня интересует атрибут значение):

Этот атрибут содержит адрес самой функции которая написана например в другом месте?

Да.

agusha писал(а):
Потом идет

__Vectors .LABELD
.DCD (.SFE CSTACK) + 1 ; Top of Stack
SET_HANDLER Reset_Handler ; Reset Handler

..........

Здесь написано что имя метки имеет атрибуты и типизованным меткам назначаются атрибуты. В чем разница между именем метки и типизованной меткой которой тоже назначены атрибуты?

Все имена, в том числе обычные и типизованные метки, имеют атрибуты. Типизованным меткам назначаются конкретные значения атрибутов, в зависимости от того, с помощью какой директивы они объявлены. Обычная, т.е. не типизованная метка, имеет следующие атрибуты:
Код:
Operand Type           Type
UNTYPED                nothing


agusha писал(а):
Атрибут operand type (тип операнда) используется Ассемблером для проверки соответствия кода инструкции и размера и/или выравнивания операндов этой инструкции.
Какие у метки __Vectors .LABELD в данном коде существуют аперанды?

У метки нет и не может быть операндов. Наоборот, сама метка может быть операндом инструкции.

agusha писал(а):
И почему выбрана именно .LABELD у которой на конце D?

Строка
Код:
__Vectors .LABELD

Сообщает ассемблеру, что метка __Vectors помечает 32-разрядую ячейку памяти, в данном случае массив таких ячеек - таблицу векторов. Первый элемент таблицы векторов (см. следующую строку) - начальное значение указателя стека, второй - адрес входа в программу (Reset_Handler), далее идут адреса обработчиков исключительных ситуаций и обработчиков прерываний.
Суффикс "D" выбран потому, что элементами таблицы векторов являются адреса - 32-разрядные числа без знака.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-10 10:47 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
Reset_Handler .EQU Reset_Handler?T+1
.FUNCTYPE .VOID Reset_Handler(.VOID)


Reset_Handler?T+1 это означает что где встретится Reset_Handler к метке по адресу Reset_Handler?T нужно добавить единицу ? для получения нового адреса? так?

.FUNCTYPE .VOID Reset_Handler(.VOID) что означает эта строка? .FUNCTYPE .VOID такой директивы или оператора в хэлпе нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-10 16:48 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
Reset_Handler?T+1 это означает что где встретится Reset_Handler к метке по адресу Reset_Handler?T нужно добавить единицу?
для получения нового адреса? так?

В описании директивы .EQU написано:
Синтаксис:
name .DEFINE expression
name .EQU expression

Эти директивы определяют имя и присваивают ему значение выражения expression.

Reset_Handler?T+1 и есть то самое expression!
Читайте внимательно описание.

agusha писал(а):
.FUNCTYPE .VOID Reset_Handler(.VOID) что означает эта строка? .FUNCTYPE .VOID такой директивы или оператора в хэлпе нет.

Директива .FUNCTYPE позволяет создавать аналог прототипа функции, как это принято в C.
Она не документирована т.к. применять ее в пользовательском коде не рекомендуется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-17 01:22 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
.RSEG CSTACK,data
.ALIGN 3
.ALIGN 3 Как я понимаю это выравнивание текущего счетчика по границе 8 байт.
Почему в этом сегменте стек данные выравниваются по границе 8 байт?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-17 12:06 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
Почему в этом сегменте стек данные выравниваются по границе 8 байт?

Это требование ARM-EABI для Public-интерфейсов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-18 03:25 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
поясните пожалуйста
.ASEG INTVEC,code
.ALIGN 6
.ORG __VECTORS_ADDR

в сегменте прописывается .ALIGN 6 это выравнивание по 64 байта? зачем выравнивать адрес каждого слова на 64 байта если каждое слово имеет длину 4 байта?
остальные 60 байт пустые?
.ORG __VECTORS_ADDR - заполнение сегмента INTVEC с адреса 08000000H? здесь задается смещение таблицы векторов? зачем нужно смещение таблицы да еще с таким выравниванием слов(адресов)? вродебы каждый адрес занимает всего 4 байта(слово).

.RSEG CSTACK,data
.RSEG ??DEFAULT_HANDLERS,code
.THUMB
Reset_Handler?T:
Reset_Handler .EQU Reset_Handler?T+1
.FUNCTYPE .VOID Reset_Handler(.VOID)
строка .FUNCTYPE .VOID Reset_Handler(.VOID) эквивалентна .FUNCTYPE .VOID Reset_Handler?T+1(.VOID)
Это значит что в сегменте ??DEFAULT_HANDLERS оьъявляется функция с именем Reset_Handler?T+1?
если Reset_Handler?T+1 это имя, то оно имеет адрес(по сути адрес функции)?
если это адрес имени и функции, равен ли он адресу метки Reset_Handler?T плюс единичка ?
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-18 12:20 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
поясните пожалуйста
.ASEG INTVEC,code
.ALIGN 6
.ORG __VECTORS_ADDR

в сегменте прописывается .ALIGN 6 это выравнивание по 64 байта? зачем выравнивать адрес каждого слова на 64 байта если каждое слово имеет длину 4 байта?
остальные 60 байт пустые?

Выравниваются не слова, а текущее значение программного счетчика. Т.к. директива использована один раз в начале сегмента INTVEC, то выравниваться будет начало сегмента.
agusha писал(а):
.ORG __VECTORS_ADDR - заполнение сегмента INTVEC с адреса 08000000H? здесь задается смещение таблицы векторов? зачем нужно смещение таблицы да еще с таким выравниванием слов(адресов)? вродебы каждый адрес занимает всего 4 байта(слово).

Затем, чтобы таблица разместилась по конкретному адресу - 08000000H, где она и должна быть согласно документации на контроллер. Выравнивание на 64 байта вытекает из требований к значениям регистра VTOR модуля NVIC.
agusha писал(а):
.RSEG CSTACK,data
.RSEG ??DEFAULT_HANDLERS,code
.THUMB
Reset_Handler?T:
Reset_Handler .EQU Reset_Handler?T+1
.FUNCTYPE .VOID Reset_Handler(.VOID)
строка .FUNCTYPE .VOID Reset_Handler(.VOID) эквивалентна .FUNCTYPE .VOID Reset_Handler?T+1(.VOID)
Это значит что в сегменте ??DEFAULT_HANDLERS оьъявляется функция с именем Reset_Handler?T+1?

В этом фрагменте применен трюк, позволяющий по метке Reset_Handler?T (она всегда в сегменте кода помечает четный адрес) сформировать имя функции Reset_Handler с нечетным (на 1 большим) адресом. Имя Reset_Handler используется в таблице векторов, где допустимы только нечетные адреса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-19 02:00 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
ASavit писал(а):
Выравниваются не слова, а текущее значение программного счетчика. Т.к. директива использована один раз в начале сегмента INTVEC, то выравниваться будет начало сегмента.

Тогда получается что начальный адрес сегмента INTVEC выравнивается под 64 байта, а потом относительно выравненного адреса работает директива .ORG __VECTORS_ADDR которая сносит начало таблицы векторов на 8000000Н байт. Вродебы так?
ASavit писал(а):
Затем, чтобы таблица разместилась по конкретному адресу - 08000000H, где она и должна быть согласно документации на контроллер. Выравнивание на 64 байта вытекает из требований к значениям регистра VTOR модуля NVIC.

В хелпе написано что Директива .ORG устанавливает значение программного счетчика в сегменте равным expression.
значение программного счетчика в сегменте это значение программного счетчика есть относительно адреса начала сегмента?
Тогда начальный адрес таблицы векторов не может иметь конкретный адрес 08000000H так как адрес начала сегмента скорее всего не равен 0 потому что он уже выровнен под 64 байта.
Вот пояснение из хелпа к программному счетчику: Каждый сегмент имеет собственный программный счетчик, и ассемблер использует программный счетчик текущего (активного) сегмента в качестве программного счетчика

Синтаксис:

.ORG expression
Директива .ORG устанавливает значение программного счетчика в сегменте равным expression

Если expression равно 08000000H а значение адреса сегмента не равно 0 то как
ASavit писал(а):
таблица разместилась по конкретному адресу - 08000000H
?
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-19 09:32 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
Тогда получается что начальный адрес сегмента INTVEC выравнивается под 64 байта, а потом относительно выравненного адреса работает директива .ORG __VECTORS_ADDR которая сносит начало таблицы векторов на 8000000Н байт. Вродебы так?
....
В хелпе написано что Директива .ORG устанавливает значение программного счетчика в сегменте равным expression.
значение программного счетчика в сегменте это значение программного счетчика есть относительно адреса начала сегмента?

Нет, т.к. сегмент объявлен директивой .ASEG, т.е. абсолютный. Директива .ORG устанавливает значение программного счетчика относительно начала адресного пространства, т.е. явно.

agusha писал(а):
Тогда начальный адрес таблицы векторов не может иметь конкретный адрес 08000000H так как адрес начала сегмента скорее всего не равен 0 потому что он уже выровнен под 64 байта.

При выравнивании адреса под N байт добиваются его кратности (делится без остатка, или, что то же самое, остаток = 0) числу N. Если адрес уже кратен N, то его выравнивать не нужно. Какой остаток будет при делении 0/N?

На самом деле директива .ALIGN в данном случае не работает (т.к. следующая за ней .ORG явно изменяет значение программного счетчика), а служит скорее напоминанием программисту о необходимости выравнивать начальный адрес таблицы векторов. Если .ALIGN поставить после .ORG, то она будет работать, но смысла большого в этом нет, т.к. чаще всего таблица векторов размещается либо в начале Flash, либо в начале какого-нибудь сектора Flash. Как правило сектора размещаются по адресам, уже кратным 64.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-19 12:15 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
Спасибо. Хотелось бы уточнить
ASavit писал(а):
Директива .ORG устанавливает значение программного счетчика относительно начала адресного пространства, т.е. явно.

Эта директива устанавливает значение программного счетчика относительно начала адресного пространства в любом сегменте или только в абсолютном?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-19 13:18 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
Только в абсолютном. Он потому и абсолютный, что используется абсолютная, а не относительная адресация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-21 18:19 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
Здравствуйте.

Я сделал проект из одного файла старт ап. Попробывал поменять например значение:
__VECTORS_ADDR .EQU 8000A00H

После сохранения и компиляции он все равно писал в листинге :

startup_1986BE9x.mca 39 08000000 .ORG __VECTORS_ADDR ; if vector table is located in RAM,
startup_1986BE9x.mca 40 ; change this value
startup_1986BE9x.mca 41
startup_1986BE9x.mca 42 SET_HANDLER .MACRO Name
startup_1986BE9x.mca 46
startup_1986BE9x.mca 47 08000000 __Vectors .LABELD
startup_1986BE9x.mca 48 08000000 01000000 .DCD (.SFE CSTACK) + 1 ; Top of Stack

А вот если удалить например букву R например __VECTORS_ADD и прописать везде это имя вместо __VECTORS_ADDR сохранить и скомпилировать то будет

startup_1986BE9x.mca 25 .IF .NOT .DEFINED __VECTORS_ADD
startup_1986BE9x.mca 26 8000A00H __VECTORS_ADD .EQU 8000A00H
startup_1986BE9x.mca 27 .ENDIF
startup_1986BE9x.mca 28
startup_1986BE9x.mca 29 .PUBLIC __Vectors
startup_1986BE9x.mca 30 .PUBLIC __Vectors_End
startup_1986BE9x.mca 31
startup_1986BE9x.mca 32 .EXTRN(code) ?start
startup_1986BE9x.mca 33
startup_1986BE9x.mca 34 .RSEG CSTACK,data
startup_1986BE9x.mca 35 .ALIGN 3
startup_1986BE9x.mca 36
startup_1986BE9x.mca 37 .ASEG INTVEC,code
startup_1986BE9x.mca 38 .ALIGN 2
startup_1986BE9x.mca 39 8000A00 .ORG __VECTORS_ADD ; if vector table is located in RAM,
startup_1986BE9x.mca 40 ; change this value
startup_1986BE9x.mca 41
startup_1986BE9x.mca 42 SET_HANDLER .MACRO Name
startup_1986BE9x.mca 46
startup_1986BE9x.mca 47 8000A00 __Vectors .LABELD
startup_1986BE9x.mca 48 8000A00 01000000 .DCD (.SFE CSTACK) + 1 ; Top of Stack

мне кажется это странным. Получается что __VECTORS_ADDR какое-то резервированное слово? от чего так получается ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-23 08:42 
Не в сети
Moderator

Зарегистрирован: 2010-мар-31 10:44
Сообщения: 54
Откуда: ООО "Фирма Фитон"
agusha писал(а):
.... Попробывал поменять например значение:
__VECTORS_ADDR .EQU 8000A00H
Обратите внимание, что данная строка в стартапе компилируется лишь в случае, если имя __VECTORS_ADDR до этого нигде не определено.
Код:
    .IF .NOT .DEFINED __VECTORS_ADDR
      __VECTORS_ADDR  .EQU  8000A00H
    .ENDIF
Если компиляцию запускать из под CodeMaster-ARM, то значение __VECTORS_ADDR задается настройками CodeMaster, в этом случае
Код:
__VECTORS_ADDR  .EQU  8000A00H
компилироваться не будет.
Если хотите изменить начальный адрес таблицы векторов, то изменяйте его в закладке "Настройки JEM-ARM" диалога "Опции отладки" (вызывается из меню "Отладка" | "Опции отладки...").
Определение значения __VECTORS_ADDR в стартапе используется только при компиляции из командной строки.

Также хочу заметить, что у данных микроконтроллеров после снятия RESET сперва запускается начальный загрузчик. Он предполагает, что таблица векторов программы из Flash находится по адресу 08000000H. Если Вы уберете оттуда таблицу, то старт Вашей программы произойдет некорректно и с большой вероятностью возникнет исключительная ситуация.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Макроассемблер CMA-ARM
СообщениеДобавлено: 2013-дек-23 12:39 
Не в сети

Зарегистрирован: 2013-апр-13 21:18
Сообщения: 20
Откуда: Санкт-Петербург
LDR R0, =SystemInit
BLX R0
LDR R0, =?start
BX R0
.ENDMOD

В строке:
LDR R0, =SystemInit
SystemInit это адрес функции систем инит. Перед ним ставится знак равно. Такая форма прописана в хэлпе, но её нет в дата шите.
Далее идет:
BLX R0 -переход по адресу вобщем на функцию SystemInit при этом в регистр LR прописывается адрес следующей команды: LDR R0, =?start вродебы так?
Сама функция SystemInit указывает сделать BX LR то есть перейти по адресу который в регистре LR. Это значит выполнить LDR R0, =?start
Для каких целей тогда нужна функция системинит?
?start это адрес куда попадаем после обработки ресета вродебы так? А где конкретно он прописывается?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB