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

 
 
 
Reply to this topicStart new topic
> Непонятки с BootLoaderom, Вроде все есть, но как-то непонятно...
vitek101
сообщение Nov 5 2009, 11:43
Сообщение #1


Участник
*

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



Облазил весь форум, нашел темы про BootLoaderы, почитал, но неясности остались:
- есть рабочий проект для XMega128
- есть вроде рабочий проект загрузчика (переделанный из примера AVR1605)
- логика работы, размещение прерываний, переходы в приложение и обратно вроде продуманы
Теперь возник вопрос как мне их засунуть в один контроллер?
1. Собирать два проекта в одном Workspace? Как тогда сделать, чтоб приложение зашивалось по 0 адресу, а загрузчик по границе области BootLoaderа?
2. Зашивать каждый проект отдельно? Тогда получается 2 hex-файла. Как и чем их потом прошивать при серийном производстве? Можно ли какой-нибудь утилитой прошивать hex по конкретному адресу?
3. Делать все в одном проекте? Мне этот вариант нравится больше всего, но не пойму как определить сегмент для загрузчика.

Посоветуйте кто-нибудь...
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 5 2009, 12:05
Сообщение #2


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(vitek101 @ Nov 5 2009, 15:43) *
1. Собирать два проекта в одном Workspace? Как тогда сделать, чтоб приложение зашивалось по 0 адресу, а загрузчик по границе области BootLoaderа?
2. Зашивать каждый проект отдельно? Тогда получается 2 hex-файла. Как и чем их потом прошивать при серийном производстве? Можно ли какой-нибудь утилитой прошивать hex по конкретному адресу?
3. Делать все в одном проекте? Мне этот вариант нравится больше всего, но не пойму как определить сегмент для загрузчика.
Посоветуйте кто-нибудь...


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

По П.2 - назначение бутлоадера состоит в том чтобы иметь возможность прошивать флеш контроллера. Если у вас он используется для апгрейда программы в процессе работы но при этом у вас есть рабочий вариант основной прошивки то вам стоит объеденить два hex-файла в один и первый раз прошивать основную программу+бутлоадер. Также можно прошить бутлоадер а потом с помощью него залить основную программу. Hex-файл содержит достаточно информации чтобы программатор распознал по каким адресам прошивать программу (поишите расшифровку hex-строки). Используйте avr-studio и фирменный программатор от атмел поддерживающий ваш мк.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 5 2009, 12:47
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vitek101
сообщение Nov 5 2009, 12:55
Сообщение #4


Участник
*

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



Спасибо. Буду копать...
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 5 2009, 14:20
Сообщение #5


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



В ассемблере есть псевдодиректива .ORG, указывающая, с какого адреса размещать дальнейший код.
Так что для основной программы ставьте .ORG 0 (хотя 0 - и так по умолчанию), а для бутлоадера указывайте начальный адрес бутлоадера (для 128 он может размещаться в 4 местах, по-моему, в зависимости от объема бутлоадера). У меня для бутлоадера отводится 512 слов
Go to the top of the page
 
+Quote Post
vitek101
сообщение Nov 5 2009, 14:31
Сообщение #6


Участник
*

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



А в каком виде эта директива вставляется?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 5 2009, 14:36
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(V_G @ Nov 5 2009, 16:20) *
В ассемблере есть псевдодиректива .ORG, указывающая, с какого адреса размещать дальнейший код.
У кого - как. У IAR и в gnu binutils она указывает смещение относительно начала текущего сегмента. В частном случае - IAR и абсолютный сегмент (включен по умолчанию в начале единицы ассемблирования) смещение совпадает с абсолютным адресом.
vitek101: Вставляется она в том случае, если ваш проект на ассемблере в одном файле одним большим куском. В противном случае без линкера и его скриптов не обойтись. Описание директивы org надо искать в документации на ваш ассемблер. Поскольку вы не назвали его - точнее ответить невозможно (впрочем, даже если назовете, пересказывать документацию навряд ли кто-то захочет).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Злодей
сообщение Nov 5 2009, 20:51
Сообщение #8


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

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



avr-gcc, bootloader.makefile
Цитата(Сергей Борщ)
LDFLAGS += -Wl,--section-start=.text=$(BOOTLOADER_ADDR)

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

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

Сообщение отредактировал Злодей - Nov 5 2009, 20:52
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 6 2009, 08:20
Сообщение #9


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

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Боже, как у Сишников все сложно и все запущено!
Пример на 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-файл прошивки, заполненный только в нужных адресах
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2009, 10:00
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(V_G @ Nov 6 2009, 11:20) *
Боже, как у Сишников все сложно и все запущено!
Можете не продолжать о том, как легко и просто быть asm кодером...smile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
vitek101
сообщение Nov 6 2009, 10:10
Сообщение #11


Участник
*

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



Все, вроде получилось. Впихнул все в один проект, поставил #ifdef и в него код бутлоадера. В xcl создал сегмент. Прошил, и вылез косяк непонятный. Создал новую тему для него smile.gif
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 6 2009, 14:31
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

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

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

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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:24
Рейтинг@Mail.ru


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