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

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

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

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

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

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

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

И вообще, если эту функцию вызвать уже из тела проги, то может произойти "падение чёрного ястреба". И вроде никакого криминала со стороны программера. Просто желание в процессе работы заново проинициализировать что-то типа портов, PLL, внешней рамы и прочего. Хотя может и не упадёт, если R7 (R3-R12) в теле не меняется, а R0-R2 вроде как допускается изменять.
SSerge
Цитата(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().
GetSmart
Цитата(SSerge @ Aug 16 2012, 15:55) *
т.е. надо сначала указать что есть секция с таким именем, и тогда можно использовать __segment_begin() и __segment_end().

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