Перейти к содержанию
    

Непонятки с BootLoaderom

Облазил весь форум, нашел темы про BootLoaderы, почитал, но неясности остались:

- есть рабочий проект для XMega128

- есть вроде рабочий проект загрузчика (переделанный из примера AVR1605)

- логика работы, размещение прерываний, переходы в приложение и обратно вроде продуманы

Теперь возник вопрос как мне их засунуть в один контроллер?

1. Собирать два проекта в одном Workspace? Как тогда сделать, чтоб приложение зашивалось по 0 адресу, а загрузчик по границе области BootLoaderа?

2. Зашивать каждый проект отдельно? Тогда получается 2 hex-файла. Как и чем их потом прошивать при серийном производстве? Можно ли какой-нибудь утилитой прошивать hex по конкретному адресу?

3. Делать все в одном проекте? Мне этот вариант нравится больше всего, но не пойму как определить сегмент для загрузчика.

 

Посоветуйте кто-нибудь...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Собирать два проекта в одном Workspace? Как тогда сделать, чтоб приложение зашивалось по 0 адресу, а загрузчик по границе области BootLoaderа?

2. Зашивать каждый проект отдельно? Тогда получается 2 hex-файла. Как и чем их потом прошивать при серийном производстве? Можно ли какой-нибудь утилитой прошивать hex по конкретному адресу?

3. Делать все в одном проекте? Мне этот вариант нравится больше всего, но не пойму как определить сегмент для загрузчика.

Посоветуйте кто-нибудь...

 

По П.1 и П.3 нужно копаться в настройках линкера. Там сможете прописать сегмент в котором будет располагаться бутлоадер и определить его начальный адрес. Как это сделать много раз обсуждалось на форуме.

 

По П.2 - назначение бутлоадера состоит в том чтобы иметь возможность прошивать флеш контроллера. Если у вас он используется для апгрейда программы в процессе работы но при этом у вас есть рабочий вариант основной прошивки то вам стоит объеденить два hex-файла в один и первый раз прошивать основную программу+бутлоадер. Также можно прошить бутлоадер а потом с помощью него залить основную программу. Hex-файл содержит достаточно информации чтобы программатор распознал по каким адресам прошивать программу (поишите расшифровку hex-строки). Используйте avr-studio и фирменный программатор от атмел поддерживающий ваш мк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Собирать два проекта в одном Workspace? Как тогда сделать, чтоб приложение зашивалось по 0 адресу, а загрузчик по границе области BootLoaderа?
Да, именно два отдельных независимых проекта. За размещение отвечает линкер. Изучайте формат его скрипта.
2. Зашивать каждый проект отдельно? Тогда получается 2 hex-файла. Как и чем их потом прошивать при серийном производстве? Можно ли какой-нибудь утилитой прошивать hex по конкретному адресу?
Перед передачей на производство файлы "склеить" в один или текстовым редактором или утилитой вроде SRecord. Адрес, по которому заливать, зашит в сам HEX-файл - не нужно ничего указывать дополнительно. Заливать конечно AVRealом - ничего лучше для производства не придумано. Добавлено: ой, AVReal Хмеги еще не умеет. Тогда не знаю.
3. Делать все в одном проекте? Мне этот вариант нравится больше всего, но не пойму как определить сегмент для загрузчика.
Сегмент определяется в скрипте линкера. Но это неудачное решение. Начиная с того, как вы будете "выкусывать" приложение из новых прошивок для апгрейда уже выпущенных приборов и заканчивая тем, что дрожащей рукой в процессе развития проекта вы можете ненароком изменить загрузчик и сделать загрузчик новых устройств и их боевую программу несовместимыми с загрузчиком в уже выпущенных устройствах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Так что для основной программы ставьте .ORG 0 (хотя 0 - и так по умолчанию), а для бутлоадера указывайте начальный адрес бутлоадера (для 128 он может размещаться в 4 местах, по-моему, в зависимости от объема бутлоадера). У меня для бутлоадера отводится 512 слов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ассемблере есть псевдодиректива .ORG, указывающая, с какого адреса размещать дальнейший код.
У кого - как. У IAR и в gnu binutils она указывает смещение относительно начала текущего сегмента. В частном случае - IAR и абсолютный сегмент (включен по умолчанию в начале единицы ассемблирования) смещение совпадает с абсолютным адресом.

vitek101: Вставляется она в том случае, если ваш проект на ассемблере в одном файле одним большим куском. В противном случае без линкера и его скриптов не обойтись. Описание директивы org надо искать в документации на ваш ассемблер. Поскольку вы не назвали его - точнее ответить невозможно (впрочем, даже если назовете, пересказывать документацию навряд ли кто-то захочет).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

avr-gcc, bootloader.makefile

LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDR)

Override значения в скрипте линкера. Секция .text (Программа) располагается начиная с заданного адреса.

 

Дальше, как вариант, main.hex и bootloader.hex склеиваются утилитой Srecord в main_and_bootloader.hex.

Изменено пользователем Злодей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Боже, как у Сишников все сложно и все запущено!

Пример на avrstudio для xmegи:

.CSEG

JMP begin ;Reset Handle

;*********** вектора прерываний

.org DMA_CH0_vect ;прерывание от SPI DMA

JMP SPI_DMA_int

.org DMA_CH2_vect

JMP msgReceived

.org TCC0_OVF_vect

JMP TimeOuts ;прерывание таймера 0 (таймаутs)

.org USARTC1_RXC_vect

JMP receive0 ;прерывание приемника USB

.org PORTB_INT0_vect

JMP StatusPinChanged ;прерывание от статусных входов порта B

.org USARTD0_RXC_vect ; Reception Complete Interrupt

reti

.org USARTD1_RXC_vect ; Reception Complete Interrupt

reti

.org USARTD1_DRE_vect

JMP DummySPI_int

begin:

;**************** далее текст основной программы

 

;**************** текст бутлоадера (можно в отдельном файле)

.CSEG

.ORG BOOTSTART

 

Никаких склеек и управлений линкером, нажимаем кнопучку Compile и получаем hex-файл прошивки, заполненный только в нужных адресах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Боже, как у Сишников все сложно и все запущено!
Можете не продолжать о том, как легко и просто быть asm кодером...:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, вроде получилось. Впихнул все в один проект, поставил #ifdef и в него код бутлоадера. В xcl создал сегмент. Прошил, и вылез косяк непонятный. Создал новую тему для него :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Впихнул все в один проект

Зачем два проекта включать в один?

 

Проще и правильней собрать отдельно апликейшн и отдельно бутлоадер.

Залить бутлоадер в МК программатором.

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

 

Тем самым протестировать что все ОК.

 

Затем если надо тиражировать - прочитать всю флеш этого МК, полученный образ бутлоадера с аппликейшином шить в остальные МК.

 

К тому же в подавляющейм большинстве случаев бутлоадер один, а аппликейшинов разных много. Будете лепить и компилить бутлоадер для каждого аппликешина?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

×
×
  • Создать...