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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> загрузчик по USB для at91sam7s256
romez777
сообщение Apr 6 2008, 08:30
Сообщение #16


Местный
***

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



Цитата(aaarrr @ Apr 5 2008, 16:17) *
Да.

Вероятностью улететь из приложения в неизвестном направлении.


Вероятно, с этим связано моя проблема, описанная здесь:
http://electronix.ru/forum/index.php?showt...pid=392203&
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 7 2008, 01:12
Сообщение #17


Местный
***

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



Здравствуйте,

Цитата(aaarrr @ Apr 5 2008, 15:38) *
С таблицей векторов в случае SAM7 все достаточно прозрачно - можно сделать remap и расположить её в RAM, или использовать ту же таблицу, что и bootloader.

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


наверное я что-то делаю неправильно smile.gif потому как не работает должным образом.

Вот так отключаю прерывания и сбрасываю процессор и периферию в бутлоадере ПЕРЕД передачей управления (пропустил инклюды и пр. для экономии места):
Код
typedef void (*funct)(void);

//* external functions
extern unsigned disableIRQ();

...

int main(void)
{
    AT91F_DBGU_Init();
    AT91F_DBGU_Printk("before jump\n\r");

    //Run the application
    ((funct)0x10058c)();

    disableIRQ();
    *AT91C_RSTC_RCR = 0xa500000d;    //Reset device
}


А вот здесь я получаю управление и включаю прерывания:
Код
//* external functions
extern unsigned enableIRQ();
...

int main(void)
{
   enableIRQ();

   AT91F_DBGU_Init();
   AT91F_DBGU_Printk("after jump\n\r");

   while (1)
   {
   }
}


Вот функции disableIRQ и enableIRQ:
Код
#define IRQ_MASK 0x00000080

static inline unsigned __get_cpsr(void)
{
    unsigned long retval;
    asm volatile (" mrs  %0, cpsr" : "=r" (retval) : /* no inputs */  );
    return retval;
}

static inline void __set_cpsr(unsigned val)
{
    asm volatile (" msr  cpsr, %0" : /* no outputs */ : "r" (val)  );
}

unsigned disableIRQ(void)
{
    unsigned _cpsr;
    _cpsr = __get_cpsr();
    __set_cpsr(_cpsr | IRQ_MASK);
    return _cpsr;
}

unsigned enableIRQ(void)
{
    unsigned _cpsr;

    _cpsr = __get_cpsr();
    __set_cpsr(_cpsr & ~IRQ_MASK);
    return _cpsr;
}


Все компилируется успешно, загружаю в флеш. На всякий случай проверяю SAM-BA, что образы находятся по нужным адресам (все корректно), запускаю: работает нестабильно, иногда печатается before jump, потом after jump (то есть переход происходит), а иногда в момент перехода на второей образ сыпется мусор. После пересброса платы все повторяется.

Что я делаю не так?

Благодарю за помощь!

PS. на всякий случай прикрепляю ld-скрипты.

Первое приложение, размер 1420 байт (0x58c):
Код
/* Memory Definitions */
MEMORY
{
  CODE (rx) : ORIGIN = 0x00100000, LENGTH = 0x00040000
  DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
  STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}
...


Второе приложение (на которое передается управление):
Код
/* Memory Definitions */
MEMORY
{
  CODE (rx) : ORIGIN = 0x0010058c, LENGTH = 0x00040000
  DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00010000
  STACK (rw) : ORIGIN = 0x00204000,LENGTH = 0x00000000
}

...
// все остальное по умолчанию
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 7 2008, 05:18
Сообщение #18


Гуру
******

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



Цитата(romez777 @ Apr 7 2008, 05:12) *
...
Вот так отключаю прерывания и сбрасываю процессор и периферию в бутлоадере ПЕРЕД передачей управления (пропустил инклюды и пр. для экономии места):
Код
typedef void (*funct)(void);

//* external functions
extern unsigned disableIRQ();

...

int main(void)
{
    AT91F_DBGU_Init();
    AT91F_DBGU_Printk("before jump\n\r");

    //Run the application
    ((funct)0x10058c)();

    disableIRQ();
    *AT91C_RSTC_RCR = 0xa500000d;    //Reset device
}

А в исходнике они отключаются ПОСЛЕ.
Это -
Код
*AT91C_RSTC_RCR = 0xa500000d;    //Reset device

- сбросит вообще все, а не только периферию.

Симулятором пройдитесь - может что прояснится.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 7 2008, 06:09
Сообщение #19


Местный
***

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



Цитата(aaarrr @ Apr 7 2008, 08:18) *
А в исходнике они отключаются ПОСЛЕ.
Это -
Код
*AT91C_RSTC_RCR = 0xa500000d;    //Reset device

- сбросит вообще все, а не только периферию.


Переделал:
Код
disableIRQ();
*AT91C_RSTC_RCR = 0xa5000004;  // reset only peripherals

((funct)0x10058c)();


Не помогает, такое впечатление, что вообще не передает управление.

Цитата
Симулятором пройдитесь - может что прояснится.

О каком симуляторе речь? У меня Gnu-ARM тулчейн, в комплекте ничего похожего на симулятор нет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 7 2008, 06:36
Сообщение #20


Гуру
******

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



Цитата(romez777 @ Apr 7 2008, 10:09) *
О каком симуляторе речь? У меня Gnu-ARM тулчейн, в комплекте ничего похожего на симулятор нет.

Печально. Ну, подсуньте бинарник симулятору из какого-нибудь другого пакета.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 7 2008, 07:57
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(romez777 @ Apr 5 2008, 16:10) *
А с чем связана необходимость отключать прерывания на момент передачи управления?

Ну на момент передачи управления может и не надо, а вот на момент записи во флеш точно необходимо.
Go to the top of the page
 
+Quote Post
romez777
сообщение Apr 7 2008, 23:25
Сообщение #22


Местный
***

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



Цитата(KAlex @ Apr 7 2008, 10:57) *
Ну на момент передачи управления может и не надо, а вот на момент записи во флеш точно необходимо.


Гм.. интересно, почему в атмеловской библиотеке по работе с флешем, отключения прерываний нет?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 8 2008, 07:56
Сообщение #23


Гуру
******

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



Цитата(KAlex @ Apr 7 2008, 11:57) *
Ну на момент передачи управления может и не надо, а вот на момент записи во флеш точно необходимо.

Точно необходимо только если может случиться чтение из flash в момент записи. Если программа и вектора прерываний находятся в RAM, то прерывания можно не запрещать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 15:41
Рейтинг@Mail.ru


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