реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Cortex - M Ассемблер, Уточнение некоторых моментов...
Golikov A.
сообщение Apr 21 2015, 08:45
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет.

Как-то, зачем-то полез посмотреть кейловский стартап файл для какого-то STM проца. При детальном просмотре увидел некоторые детали, смысл которых мне не на 100% понятен..

вот стандартная реакция на прерывания

Код
NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP

HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP


WEAK - это обозначение что данный обработчик самый последний, если в тексте программы не найдется получше.
"B ." - это переход по кругу, на тот же адрес на котором этот бранчь

Вот тут первая задачка, я вдруг понял что не знаю документа где "B (точка)" значит переход по этому же адресу. Это чисто кейловская фича? Где описание команды в таком синтаксисе?

Вторая загадка почему NMI_Handler, а HardFault_Handler\, что авторы хотели показать этим последним обратным слешем?

не то чтобы без ответов жить не могу, просто интересно стало...

И последняя полу-загадка, кусок кода в конце стартапе

Код
IMPORT  __use_two_region_memory
....


импортим и никак не используем, правильно я понимаю что если __use_two_region_memory не будет объявлено во внешних ресурсах, то еще на этапе компиляции я получу ошибку. То есть это как бы такая защита?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 21 2015, 09:05
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Apr 21 2015, 11:45) *
Вот тут первая задачка, я вдруг понял что не знаю документа где "B (точка)" значит переход по этому же адресу. Это чисто кейловская фича? Где описание команды в таком синтаксисе?

Я так понимаю, это общепринятая фича. Описание тут.

Цитата(Golikov A. @ Apr 21 2015, 11:45) *
Вторая загадка почему NMI_Handler, а HardFault_Handler\, что авторы хотели показать этим последним обратным слешем?

Это склеивание строк, прямо как в Си. Написано тут.

Цитата(Golikov A. @ Apr 21 2015, 11:45) *
импортим и никак не используем, правильно я понимаю что если __use_two_region_memory не будет объявлено во внешних ресурсах, то еще на этапе компиляции я получу ошибку. То есть это как бы такая защита?

Получается, что так. Написано тут.

Если нужно будет ещё книжки почитать - обращайтесь, почитаю для вас вслух.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2015, 09:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Вот спасибо,теперь почти все встало на свои места.

1. Да действительно встроенные константы, по такому ключевому слову находятся и на сайте арма, спасибо.

2. Склеивание строк - это я тоже нашел, не понимал что автор хотел сказать, почему до этого было без склеивания строк, а в этом месте со склеиванием. Теперь понял
HardFault_Handler - длинное название, и чтобы следующее за ним слово PROC было выровнено по вертикали со всеми остальными блоками, его перенесли на следующую строку, как-то не бросалось в глаза...

3. В "там" не написано зачем импортить и не использовать, в "там" даже не написано что будет если импортнуть и не использовать не существующую константу. По ключевому слову __use_two_region_memory, на АРМ находиться http://infocenter.arm.com/help/index.jsp?t...b/CHDEGGBA.html
и там написано
Цитата
You also need to add either IMPORT __use_two_region_memoryfrom assembly language or #pragma import(__use_two_region_memory) from C. This specifies that you want to use the two region model and not the (default) one region model.

Но опять же не объяснен механизм работы объявления желания использования 2 регионой модели.


Цитата
Если нужно будет ещё книжки почитать - обращайтесь, почитаю для вас вслух.

Да, спасибо, конечно нужно. Я попозже список составлю что почитать, хорошо?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 21 2015, 11:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 21 2015, 12:51) *
Но опять же не объяснен механизм работы объявления желания использования 2 регионой модели.

А что непонятного в механизме? Это просто способ передать линкеру информацию непосредственно из кода.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2015, 12:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Код
               IF      :DEF:__MICROLIB

                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit

                 ELSE

                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap

__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END


собственно говорят снаружи типа есть __use_two_region_memory, но никак не используют, и на arm.com тоже написано что импортить надо... я это могу объяснить только тем что если его нет, получиться отлуп на этапе компиляции как защита. Но вдруг я не прав в этой идее?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 21 2015, 12:36
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 21 2015, 15:33) *
собственно говорят снаружи типа есть __use_two_region_memory, но никак не используют, и на arm.com тоже написано что импортить надо... я это могу объяснить только тем что если его нет, получиться отлуп на этапе компиляции как защита. Но вдруг я не прав в этой идее?

Не правы. Это просто своего рода флаг для линкера, никакой ошибки не будет.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2015, 16:56
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



то есть если мы делаем импорт, то у линкера отмечается что где-то такая переменная есть.
Так как мы ее не используем он ее не ищет чтобы подставить. Но просто знания о наличии такой специфической переменной ему душу греют и он все делает как надо?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 21 2015, 17:23
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Golikov A. @ Apr 21 2015, 19:56) *
Но просто знания о наличии такой специфической переменной ему душу греют и он все делает как надо?

Да, это дает ему информацию, какие библиотеки следует подключать.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2015, 17:43
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Понятно, спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 21:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016