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

 
 
 
Reply to this topicStart new topic
> Фича или полубага IAR 6.30 & ... 5.40 ?, __low_level_init -> PUSH {R7, LR} ... POP {R1, PC}
GetSmart
сообщение Aug 15 2012, 11:52
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Заюзав в проге __low_level_init (LPC17xx) заметил, что в начале функции стоит PUSH {R7, LR}, а в конце POP {R1, PC}. Проверял на IAR ARM 6.30 и на 5.40. Может быть это и не важно, т.к. на старте эти регистры ещё не прописывались, но всё-равно непонятно это "кривизна" или нет. Больше беспокоит хитрая задумка sm.gif

И ещё вопрос не в тему. Подскажите пожалуйста как в Си присвоить переменной начало или конец какого-либо сегмента?

Что-то вроде tmp = __sfb("ISTACK") не работает, т.к. ругается, что сегмент не определён. Хотя в линкере он и все другие, с которыми пробовал - есть. Проц 8051.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Lotor
сообщение Aug 15 2012, 12:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(GetSmart @ Aug 15 2012, 15:52) *
Может быть это и не важно, т.к. на старте эти регистры ещё не прописывались, но всё-равно непонятно это "кривизна" или нет.

А откуда компилятору знать, что Вы вызываете эту функцию только один раз на старте?

PS: Вы о другом, поспешил с ответом...


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 15 2012, 13:02
Сообщение #3


Гуру
******

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



Цитата(GetSmart @ Aug 15 2012, 15:52) *
Больше беспокоит хитрая задумка sm.gif

Явная кривизна, так что не беспокойтесь.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 15 2012, 15:26
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(aaarrr @ Aug 15 2012, 18:02) *
Явная кривизна, так что не беспокойтесь.

А за то, что компилер генерит неправильный пролог и эпилог с виду обычной функции - тоже не беспокоиться? Какая-то задумка там должна быть. Как минимум, что компилер генерит разные прологи/эпилоги в зависимости от имени функции. А ведь он должен просто подставить адрес этой обычной функции в свои low level функции и не использовать заглушку __low_level_init. Остальную логику как компилятору удаётся сделать ошибку я не понимаю.

И вообще, если эту функцию вызвать уже из тела проги, то может произойти "падение чёрного ястреба". И вроде никакого криминала со стороны программера. Просто желание в процессе работы заново проинициализировать что-то типа портов, PLL, внешней рамы и прочего. Хотя может и не упадёт, если R7 (R3-R12) в теле не меняется, а R0-R2 вроде как допускается изменять.

Сообщение отредактировал GetSmart - Aug 15 2012, 16:14


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 16 2012, 10:55
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(GetSmart @ Aug 15 2012, 18:52) *
Что-то вроде tmp = __sfb("ISTACK") не работает, т.к. ругается, что сегмент не определён. Хотя в линкере он и все другие, с которыми пробовал - есть. Проц 8051.

С 8051 давно дела не имел, но с ARM так работает:
Код
#pragma section=".intvec"  //Есть такая секция!
  NVIC_SetVectorTable( (uint32_t)__segment_begin(".intvec"), 0);

т.е. надо сначала указать что есть секция с таким именем, и тогда можно использовать __segment_begin() и __segment_end().


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 16 2012, 11:40
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(SSerge @ Aug 16 2012, 15:55) *
т.е. надо сначала указать что есть секция с таким именем, и тогда можно использовать __segment_begin() и __segment_end().

Спасибо. Не хватало именно #pragma section.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 17 2012, 03:01
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Странно всё это.
Заметил и в других функциях без параметров и результата такой пролог PUSH {R7, LR}... POP {R0, PC}. Да и в функциях с параметрами и результатом тоже часто сохраняются 1-2 лишних регистра, которые потом восстанавливаются/копируются в диапазон R0-R2. Похоже на фирменную надпись "чёрная кошка" на стене. Только ведь напрасная трата тактов.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:31
Рейтинг@Mail.ru


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