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

 
 
> Bootloader. Подскажите., Проблема наверно в языке...
vitek101
сообщение Nov 11 2009, 08:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



Написал загрузчик для XMega128, IAR5.20. Переделал его из примера Атмела 1605.
Загрузчик расположен в одном проекте с основным приложением в секции #ifdef. По сбросу стартует загрузчик и проверяет наличие программы в FRAM, если есть заливает ее во флеш.
Определил сегмент в XCL:

-D_..X_FLASH_HUGE_END=21FFF
-D_..X_BOOTSEC_SIZE=2000
-Z(CODE)BOOT_SEGMENT=(_..X_FLASH_HUGE_END-_..X_BOOTSEC_SIZE+1)-_..X_FLASH_HUGE_END

Сам загрузчик:
Код
#pragma segment = "BOOT_SEGMENT"
#pragma location="BOOT_SEGMENT"

#include <eeprom_driver.h>
#include <sp_driver.h>
#include <defines.h>

#define BOOT_F_CPU             2000000UL

........ // определение типов и констант для I2C

boot_TWI_Master_t  twiMaster;   // структура для работы с I2C
uint8_t boot_sBuf[32];

// объявление функций для I2C
__root bool boot_TWI_MasterWriteRead(boot_TWI_Master_t *twi,
                         uint8_t address,
                         uint8_t *writeData,
                         uint8_t bytesToWrite,
                         uint8_t bytesToRead) @ "BOOT_SEGMENT";
__root void boot_TWI_MasterInterruptHandler(boot_TWI_Master_t *twi) @ "BOOT_SEGMENT";

.........


__root void boot(void) @ "BOOT_SEGMENT"; // тело загрузчика
__root void GoToApplication(void) @ "BOOT_SEGMENT"; // переход в приложение

__root void boot(void) @ "BOOT_SEGMENT"
{
  boot_TWI_MasterInit(&twiMaster,                   // инициализирую I2C
                 &TWIF,
                 TWI_MASTER_INTLVL_HI_gc,
                 BOOT_TWI_BAUDSETTING);
  
  PMIC.CTRL |= PMIC_HILVLEN_bm;
  
  boot_sBuf[0] = 0x00;                                   // читаю из FRAM 6 байтов
  boot_sBuf[1] = 0x40;
  boot_TWI_MasterWriteRead(&twiMaster,
                      0xA0,
                      &boot_sBuf[0],
                      2,
                      6);

  while (twiMaster.status != boot_TWIM_STATUS_READY)      // пишу и читаю пока надо
  {
    if ((TWIF.MASTER.STATUS & 0xCC) != 0x00)
    {
      boot_TWI_MasterInterruptHandler(&twiMaster);
    }
  }
  
  // в зависимости от результата что-то делаю
  ............
  
  GoToApplication();
    
}

__root void GoToApplication(void) @ "BOOT_SEGMENT"
{
  cli();
  PMIC.CTRL = 0;
  SP_WaitForSPM();
  SP_LockSPM();
  EIND = 0x00;
  void (*funcptr)( void ) = 0x0000;         // Set up function pointer to RESET vector.
  funcptr();                                // Jump to Reset vector 0x0000 in Application Section.
}

__root bool boot_TWI_MasterWriteRead(boot_TWI_Master_t *twi,
                         uint8_t address,
                         uint8_t *writeData,
                         uint8_t bytesToWrite,
                         uint8_t bytesToRead) @ "BOOT_SEGMENT"
{
    /*Parameter sanity check. */
    if (bytesToWrite > boot_TWIM_WRITE_BUFFER_SIZE) {
        return false;
    }
    if (bytesToRead > boot_TWIM_READ_BUFFER_SIZE) {
        return false;
    }

            ..........................
}


Загрузчик стартует как надо, переход в тело работает.
Теперь собственно в чем проблема:
Инициализация I2C проходит нормально, регистры принимают нужное значение.
При вызове boot_TWI_MasterWriteRead(...) смотрю в отладчике, а там параметр bytesToRead всегда равен 0. Пробовал убрать параметр address, тогда bytesToRead передается как надо. Т.е получается не может передать большое количество параметров. Но дальше все равно не работает чтение из FRAM. Пробовал вставлять этот кусок в основное тело приложения, там все работает хорошо.
Мне кажется или что-то со стеком при работе в области загрузчика или не знаю.

Помогите пожалуйста help.gif


И еще: может проблема быть связана с __root, #pragma и т.д.? Может чего-то не хватает? Просто я в них не особо шарю... laughing.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vitek101
сообщение Nov 11 2009, 13:51
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



А можно заменить
Код
          lda   Z, SFB(NEAR_Z)

на
Код
          LD[b]A[/b]   ZL,LOW(SF[b]B[/b](NEAR_Z)-1)
          LD[b]A[/b]   ZH,HIGH(SF[b]B[/b](NEAR_Z)-1)

?
illegal effective address убрались smile.gif

Спросил, а потом увидел ответ smile.gif

Вроде собрал, правда только первую часть (без инициализации переменных. Там ругается invalid syntax на строки с макросом).
Только он теперь говорит undefined external "boot" referred in cstatup wacko.gif



Все, запустил. Но в отладчике нашего стартапа не видно и все не работает по-старому...
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 11 2009, 14:24
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(vitek101 @ Nov 11 2009, 16:51) *
Все, запустил. Но в отладчике нашего стартапа не видно и все не работает по-старому...

Это значит startup взялся стандартный из библиотеки!
Для начала можно вообще библиотеку отключить! (она тут скорее всего не нужна)

А откуда стартует проц? (под отладчиком)
По исходнику
Код
    RSEG   BOOT_ENTRY:CODE:ROOT(1)

          LDI   R17,LOW(SFE(RSTACK)-1)

т.е. по адресу начала BOOT_ENTRY должны быть эти данные!


что бы отключить стандартный стартап из библиотеки, надо в настройках линкера поставить override default program entry и вписать метку __program_start
а код модифицировать
Код
    RSEG   BOOT_ENTRY:CODE:ROOT(1)
PUBLIC __program_start
__program_start:
          LDI   R17,LOW(SFE(RSTACK)-1)


Но это надо проверить я в основном 3 версию иар использую. В новой были пробелмы что не хотел он стартап стандартный убирать, приходилось ручками из библиотеки моуль удалять!
Вообще надо map файл смотреть - что линкер напихал и куда!

Сообщение отредактировал KRS - Nov 11 2009, 14:24
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vitek101   Bootloader. Подскажите.   Nov 11 2009, 08:53
- - KRS   _root не надо писать у каждой функции! достато...   Nov 11 2009, 09:15
|- - V_G   Цитата(KRS @ Nov 11 2009, 19:15) А как вы...   Nov 11 2009, 09:25
|- - KRS   Цитата(V_G @ Nov 11 2009, 12:25) Ну, и на...   Nov 11 2009, 09:36
- - vitek101   А я тут и использую полинг. С прерываниями я так и...   Nov 11 2009, 10:40
- - KRS   примерно так КодEXTERN boot RSEG CSTACK:DA...   Nov 11 2009, 11:25
- - vitek101   На всякий случай прошу прощения за возможно глупый...   Nov 11 2009, 11:59
|- - KRS   Цитата(vitek101 @ Nov 11 2009, 14:59) На ...   Nov 11 2009, 12:07
- - vitek101   Сделал так: КодEXTERN boot RSEG CSTACK:DAT...   Nov 11 2009, 12:33
|- - KRS   Цитата(vitek101 @ Nov 11 2009, 15:33) Это...   Nov 11 2009, 12:43
- - vitek101   Да, правильно Но illegal effective address и ba...   Nov 11 2009, 12:48
- - KRS   А да про макрос забыл Код//**********************...   Nov 11 2009, 13:00
- - V_G   А фьюзы на запуск с bootloadera поставили? И на то...   Nov 11 2009, 19:59
- - vitek101   Поставил. Стартует он откуда надо. У XMega только ...   Nov 12 2009, 06:47
- - KRS   Так у вас просто мешанина получилась, часть старта...   Nov 12 2009, 10:42
- - vitek101   Разобраться конечно неплохо бы   Nov 12 2009, 10:54
- - KRS   А что за ошибки то возникают если библиотеку отклю...   Nov 12 2009, 12:54
- - vitek101   В том то и дело, что я не могу ее отключить. В сво...   Nov 12 2009, 14:16
|- - KRS   Цитата(vitek101 @ Nov 12 2009, 17:16) В т...   Nov 12 2009, 15:22
|- - vitek101   Цитата(KRS @ Nov 12 2009, 18:22) Так это ...   Nov 13 2009, 05:10
- - MDD   Не совсем в тему, но может будет полезно. Недавно ...   Nov 12 2009, 16:04
- - D1ma   Здравствуйте Впервые пишу будлоадер. (не судите ст...   Nov 13 2009, 16:27
|- - KRS   Цитата(D1ma @ Nov 13 2009, 19:27) Тоесть,...   Nov 13 2009, 22:12
|- - Сергей Борщ   Цитата(D1ma @ Nov 13 2009, 18:27) Тоесть,...   Nov 13 2009, 22:23
- - D1ma   как написать свой стартап и ловлевелинит? щас у ме...   Nov 14 2009, 10:05
|- - KRS   Цитата(D1ma @ Nov 14 2009, 13:05) как нап...   Nov 14 2009, 11:40
|- - Сергей Борщ   Цитата(D1ma @ Nov 14 2009, 12:05) как нап...   Nov 14 2009, 13:41
- - vitek101   Почему может постоянно забиваться CSTACK? Читаю за...   Nov 17 2009, 13:41


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:38
Рейтинг@Mail.ru


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