Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EWARM 5.20 не восстанавливает контекст ((
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
overloaded
Код из конца __low_level_init:

Код
    147          *AT91C_RSTC_RMR =0xA5000000;//(RSTC) Reset Mode Register: !user_reset, !irq
   \   000001E4   F700E0E3           MVN      R0,#+247
   \   000001E8   800FC0E3           BIC      R0,R0,#0x200
   \   000001EC   A514A0E3           MOV      R1,#-1526726656
   \   000001F0   001080E5           STR      R1,[R0, #+0]
    148          
    149          //  proc_reset = (void (*)(void))(0x0000);
    150          
    151            //delay_p(1);
    152            
    153          }
   \   000001F4   1040BDE8           POP      {R4,LR}
   \   000001F8   1EFF2FE1           BX       LR              ;; return


далее код внизу - почему проверяется R0 и что и откуда в нем должно быть - неизвестно(мне).
И почему он не POP-ится если в нем параметр, в котором говорится стоит ли запускать __iar_data_init2 ?
В результате инициализация переменных (__iar_data_init2) вызывается рэндомно.. В зависимости от того что зависло в R0 =)

Код
?main:
  0000054C  E3A00001  MOV          R0, #0x1
  00000550  EBFFFEB9  BL           __low_level_init        ; 0x3C
  00000554  E3500000  CMP          R0, #0x0
  00000558  1BFFFFCD  BLNE         __iar_data_init2        ; 0x494
__iar_init$$done:
  0000055C  E3A00000  MOV          R0, #0x0
  00000560  EB00000B  BL           main                    ; 0x594
  00000564  EB00001D  BL           exit                    ; 0x5E0


Оптимизация отключена. Что бы это могло быть?
Это кстати просто урезанный кусок. В другом варианте рабочий проэкт слегка дописывается и вся память становится порченная (возможно и связано с неинициализицией переменных), но в результате совсем все плохо..
meister
Цитата(overloaded @ May 27 2009, 12:53) *
почему проверяется R0 и что и откуда в нем должно быть - неизвестно(мне).


Так посмотрите на прототип __low_level_init.

Код
extern "C" __interwork int __low_level_init(void)
{
    hw::init();
    return 1;
}
zltigo
Цитата(meister @ May 27 2009, 12:02) *
Так посмотрите на прототип __low_level_init.

Лучше просто на него самого, прежде чем что-то писать.
Код
/*
* Function description
.......

*Choose if segment initialization
  should be done or not.    
  Return: 0 to omit seg_init
    1 to run seg_init
*/
.......
overloaded
Цитата(meister @ May 27 2009, 12:02) *
Так посмотрите на прототип __low_level_init.

Код
extern "C" __interwork int __low_level_init(void)
{
    hw::init();
    return 1;
}


Спасибо )) Этот момент я как-то упустил и почему-то всегда думал что она воид. cranky.gif
Правда прототип этот я так и не нашел.. И еслиб он был подключен, компилятор сказал бы что воид и инт "немного" разные типы возврата) Но в доке таки написано что возвращать должна..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.