|
Фича или полубага IAR 6.30 & ... 5.40 ?, __low_level_init -> PUSH {R7, LR} ... POP {R1, PC} |
|
|
|
Aug 15 2012, 11:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Заюзав в проге __low_level_init (LPC17xx) заметил, что в начале функции стоит PUSH {R7, LR}, а в конце POP {R1, PC}. Проверял на IAR ARM 6.30 и на 5.40. Может быть это и не важно, т.к. на старте эти регистры ещё не прописывались, но всё-равно непонятно это "кривизна" или нет. Больше беспокоит хитрая задумка  И ещё вопрос не в тему. Подскажите пожалуйста как в Си присвоить переменной начало или конец какого-либо сегмента? Что-то вроде tmp = __sfb("ISTACK") не работает, т.к. ругается, что сегмент не определён. Хотя в линкере он и все другие, с которыми пробовал - есть. Проц 8051.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
 |
Ответов
(1 - 6)
|
Aug 15 2012, 12:03
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(GetSmart @ Aug 15 2012, 15:52)  Может быть это и не важно, т.к. на старте эти регистры ещё не прописывались, но всё-равно непонятно это "кривизна" или нет. А откуда компилятору знать, что Вы вызываете эту функцию только один раз на старте? PS: Вы о другом, поспешил с ответом...
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Aug 15 2012, 15:26
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 16 2012, 10:55
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|