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

 
 
 
Reply to this topicStart new topic
> Вопрос по IAR 5.20, Непонятная операция с регистром стека
grinux
сообщение Nov 25 2009, 14:27
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Всем привет.
Столкнулся с непонятной мне операцией, показанной на первом рисунке, в результате которой в регистре стека оказывалось значение, лежащее за пределами ОЗУ (LPC2368).
При включении оптимизации по размеру кода, ровно как и при увеличении стека со стандартных 0x100 до 0x200, проблема уходила ( при вкючении оптимизации инструкция SUB отсутствовала - 2 рисунок, при увеличении стека не приводила к некорректному значению).
Но что собственно произошло так и осталось не ясным, что там за данные на 0x154 байта?
cranky.gif


Прикрепленное изображение


Прикрепленное изображение


Сообщение отредактировал grinux - Nov 25 2009, 14:37
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2009, 14:43
Сообщение #2


.
******

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



Цитата(grinux @ Nov 25 2009, 20:27) *
Но что собственно произошло так и осталось не ясным, что там за данные на 0x154 байта?
cranky.gif

Видимо локальные переменные. Засветите здесь полный майн и будет понятно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
grinux
сообщение Nov 25 2009, 14:46
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(GetSmart @ Nov 25 2009, 17:43) *
Видимо локальные переменные. Засветите здесь полный майн и будет понятно.


Код
int main()
{
   tn_arm_disable_interrupts();
   InitHardware();
  
   g_tneti.tnet  = &g_tnet;
   g_tneti.ni[0] = &g_iface1;
   effective_settings_2_0=current_settings_2_0=default_settings_2_0;
   tn_start_system(); //-- Never returns

   return 1;
}


В общем то и светить нечего laughing.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2009, 14:54
Сообщение #4


.
******

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



Цитата(grinux @ Nov 25 2009, 20:46) *
В общем то и светить нечего laughing.gif

Тогда ещё листинг майна, в котором стоит SUB SP,SP,0x154. Судя по майну, локальных переменных там нет. Но если InitHardware() или tn_start_system() являются статическими, то они могут подставиться прямо в майн.


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


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(GetSmart @ Nov 25 2009, 17:54) *
Тогда ещё листинг майна, в котором стоит SUB SP,SP,0x154. Судя по майну, локальных переменных там нет. Но если InitHardware() или tn_start_system() являются статическими, то они могут подставиться прямо в майн.


Код
2475          int main()
   2476          {
   \                     main:
   \   00000000   00402DE9           PUSH     {LR}
   \   00000004   55DF4DE2           SUB      SP,SP,#+340
   2477             tn_arm_disable_interrupts();
   \   00000008   ........           BL       tn_arm_disable_interrupts
   2478             InitHardware();
   \   0000000C   ........           BL       InitHardware
   2479            
   2480             g_tneti.tnet  = &g_tnet;
   \   00000010   54009FE5           LDR      R0,??main_0    ;; g_tneti
   \   00000014   54109FE5           LDR      R1,??main_0+0x4;; g_tnet
   \   00000018   001080E5           STR      R1,[R0, #+0]
   2481             g_tneti.ni[0] = &g_iface1;
   \   0000001C   50009FE5           LDR      R0,??main_0+0x8;; g_tneti + 4
   \   00000020   50109FE5           LDR      R1,??main_0+0xC;; g_iface1
   \   00000024   001080E5           STR      R1,[R0, #+0]      
   2485             effective_settings_2_0=current_settings_2_0=default_settings_2_0;
   \   00000028   0D00B0E1           MOVS     R0,SP
   \   0000002C   48109FE5           LDR      R1,??main_0+0x10;; default_settings_2_0
   \   00000030   552FA0E3           MOV      R2,#+340
   \   00000034   ........           BL       __aeabi_memcpy4
   \   00000038   40009FE5           LDR      R0,??main_0+0x14;; current_settings_2_0
   \   0000003C   0D10B0E1           MOVS     R1,SP
   \   00000040   552FA0E3           MOV      R2,#+340
   \   00000044   ........           BL       __aeabi_memcpy4
   \   00000048   34009FE5           LDR      R0,??main_0+0x18;; effective_settings_2_0
   \   0000004C   0D10B0E1           MOVS     R1,SP
   \   00000050   552FA0E3           MOV      R2,#+340
   \   00000054   ........           BL       __aeabi_memcpy4
     2495             tn_start_system(); //-- Never returns
   \   00000058   ........           BL       tn_start_system
   2496          
   2497             return 1;
   \   0000005C   0100A0E3           MOV      R0,#+1
   \   00000060   55DF8DE2           ADD      SP,SP,#+340    ;; stack cleaning
   \   00000064   0040BDE8           POP      {LR}
   \   00000068   1EFF2FE1           BX       LR             ;; return
   \                     ??main_0:
   \   0000006C   ........           DC32     g_tneti
   \   00000070   ........           DC32     g_tnet
   \   00000074   ........           DC32     g_tneti + 4
   \   00000078   ........           DC32     g_iface1
   \   0000007C   ........           DC32     default_settings_2_0
   \   00000080   ........           DC32     current_settings_2_0
   \   00000084   ........           DC32     effective_settings_2_0
   2498          }


Вот такая оказалась штука. Надо мне было еще чуток покопать прежде, чем в форум постить.

Замена строки
Код
effective_settings_2_0=current_settings_2_0=default_settings_2_0;

на
Код
effective_settings_2_0=default_settings_2_0;
current_settings_2_0=default_settings_2_0;


решает проблему без увеличения стека и оптимизации.
Спасибо за наводящие вопросы a14.gif

Сообщение отредактировал grinux - Nov 25 2009, 15:13
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 25 2009, 15:30
Сообщение #6


.
******

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



Цитата(grinux @ Nov 25 2009, 21:10) *
Замена строки ... решает проблему без увеличения стека и оптимизации.

а переменные effective_settings_2_0 current_settings_2_0 default_settings_2_0 (любая из них) волатильные?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
grinux
сообщение Feb 20 2010, 20:46
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 2-01-09
Пользователь №: 42 891



Цитата(GetSmart @ Nov 25 2009, 18:30) *
а переменные effective_settings_2_0 current_settings_2_0 default_settings_2_0 (любая из них) волатильные?

Нет, статические, а default - константа.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2010, 23:31
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Похоже эти самые setting - структуры?
Go to the top of the page
 
+Quote Post

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

 


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


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