AVR, как прыгнуть на bootloader из программы?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Murav писал(а): Здесь предлагалось найти адрес функции в map-файле, а не задавать его .org .
Я так думаю, что проскольку бутлодер может работать только в строго определенной секции флеш-памяти, загнать его именно туда без .org вряд ли получится.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

ARV писал(а):вывод о том, что загрузчик и основная программа друг о друге не знают, я сделал из такого простого факта: предположим, мы собрали программу вместе с загрузчиком - это, так сказать, исходная версия прошивки. все пучком, адреса всех функций известны и нет проблем. но потом мы скармливаем загрузчику обновление - оно ведь уже не содержит самого кода загрузчика, он ведь не перезаписывается! и в этом случае приходится исходить из принципа, что в коде обновления об адресах функций загрузчика компилятору ничего не известно...
Продолжу... и конечный вывод, как аксиома: Бутлоадер постоянен. И адрес входа в него останется таким же. Бутлоадер сам себя изменить не сможет. Не мне вам рассказывать про предусловную компиляцию ) , когда требуется убрать из сборки загрузчик.

Показалось, что тема топика интереснее. Ан нет. Ошибся.

Насколько я понял, тема пошла по пути, что есть два отдельно откомпилированного бинарного кода, который требуется вместе слинковать. Ни первый не знает о втором, не второй о первом... Ищем адрес входа из одного в другой. :shock:
Похоже на измерение зазора свечей через выхлопную трубу в дизельном двигателе. Тыкаем и ищем место, куда щуп вставлять. )

Ушёл пить квас…
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Ну и махнув кваску, с содержанием 1,2% спирта, в порядке бреда предложу идею:

В секции бутлоадера, перед входом в него нужно разместить ASCII строку, типа bootloaler here. Из секции программы поиском найти эту строку. Начало строки + длина её + 1 даст нужный адрес входа. :)))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вместо пустых слов, космический вы наш гость, лучше бы конкретно рассказали, как программа, собираемая без функций загрузчика, сможет обратиться к ним? если map-файл не выдает сведений об адресах этих функций? точка входа известна, это как бы main() загрузчика, а все прочие функции? например, ввод-вывод по UART или еще како-либо сервис? как найти входы в эти функции?

кстати, чтоб вы знали: строки компилятор тасует по памяти, как захочет, и конец-начало строки никак с началом кода функции не связан в общем случае. :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 136
Зарегистрирован: Сб авг 15, 2009 21:26:50
Откуда: Пенза

Сообщение andrey_artemov »

В качестве дурацкого предложения...
Если функцию начать 3 NOP-ами (ассемблерными вставками) и искать три подряд кода NOP
Это как раз будет адрес начала функции...
В былые времена MS-DOS? таким образом резидентные функции отлаживал через отладчик....
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Если есть свободные ноги контроллера, то киньте одну на ресет.
и ещё хотел глупость сморозить но одумался :)
Каким интерфейсом мк связан с пк? COM - есть специальные сигнальные линии которыми можно сбросить мк.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 219
Зарегистрирован: Вт сен 18, 2007 16:41:16
Откуда: Украина, г. Запорожье

Сообщение alex2103 »

А при чем тут ресет?
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Посмотри первый пост
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

ARV писал(а):вместо пустых слов, космический вы наш гость, лучше бы конкретно рассказали, как программа, собираемая без функций загрузчика, сможет обратиться к ним? если map-файл не выдает сведений об адресах этих функций? точка входа известна, это как бы main() загрузчика, а все прочие функции? например, ввод-вывод по UART или еще како-либо сервис? как найти входы в эти функции?

кстати, чтоб вы знали: строки компилятор тасует по памяти, как захочет, и конец-начало строки никак с началом кода функции не связан в общем случае. :)))
Да кроме как зная конкретный числовой адрес функции входа в бутлоадер - никак!
Возможно кому то и придёт в голову размещать стартовую бут-функцию в середине бут-секции. Самой первой она размещается. Всё остальное - мазохизм. Размещением, соответственно, линковщик занимается.
А если адрес известен, например для m32 у меня 0x7000, то из программы бутлоадер вызывается через указатель. Мне так нравится:

Код: Выделить всё

#define BOOTLOADER_START ( ( void ( * )( void ) )( 0x7000 ) )

void main( void )
{
    BOOTLOADER_START();
}
Обратного возврата в основную программу не будет. Ресет делается.

Не понял к чему тут прочие функции и ввод-вывод по UART? Это к бутлоадеру относится и находится в бут-секции. Ну вот пусть он сам с ними и разбирается. Он про них знает больше, чем кто либо.

Строку в памяти программы можно разместить по конкретному адресу. В IAR-e:

Код: Выделить всё

__root __flash char F_BootHere[] @ 0x7000 = { "bootloaler here" };
"__root" не дает выкинуть константу при оптимизации, даже если к ней не обращаются.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

asteroid7 писал(а):Не понял к чему тут прочие функции и ввод-вывод по UART? Это к бутлоадеру относится и находится в бут-секции. Ну вот пусть он сам с ними и разбирается. Он про них знает больше, чем кто либо.
похоже, читаете тему через строку... автор заинтересовался тем, как сэкономить объем основной программы путем использования протокольных функций, зашитых в загрузчике - например, ввод-вывод по UART: загрузчик это делает для своих целей и имеет для этого определенные функции, и основной программе это требуется - так зачем дважды писать одно и то же?! смысл есть и очень немаленький! например, для USB-контроллеров загрузчик содержит весь протокол обмена по USB, а это не так уж и мало! или дектриптор-энкриптор для защищенного обмена инфой - это вообще сам бог повелел только в загрузчике держать и нигде более (т.к. он особо защищен от несанкционированного доступа)!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

http://electronix.ru/forum/lofiversion/ ... 36933.html
здесь осуждали, но хз прокатит или нет.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Опытный кот
Аватара пользователя
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону

Сообщение Coolish »

Ого тема как разрослась :))
По теме топика, я в итоге пошёл путём #asm("RJMP 0x1C00"); - это для atmega8 и загрузчика на 512 слов.
Работает...

Спасибо за советы
Сделать хотел грозу, а получил КоЗу
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1138
Зарегистрирован: Сб апр 03, 2010 08:57:35

Сообщение Modest »

Слушайте вот подрезал то :)) Люди тут распинаются ,а он на вот так вот :))) :)))

Возвратится, там управление перейдёт бутлодеру, и как только он закончит то запустит выполнение основной програмки
с самого начала.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

DX168B писал(а):Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
А чем RJMP 0 не устраивает? Можно выдать недопустимый код или недопустимый адрес памяти - пойдет на начальный ресет. Можно по watch-собачке... Да мало ли! Когда запускаешь сырую программу, она так старательно на ресет уходит - только успевай разгребать.
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

ARV писал(а):похоже, читаете тему через строку... автор заинтересовался тем, как сэкономить объем основной программы путем использования протокольных функций, зашитых в загрузчике - например, ввод-вывод по UART: загрузчик это делает для своих целей и имеет для этого определенные функции, и основной программе это требуется - так зачем дважды писать одно и то же?! смысл есть и очень немаленький! например, для USB-контроллеров загрузчик содержит весь протокол обмена по USB, а это не так уж и мало! или дектриптор-энкриптор для защищенного обмена инфой - это вообще сам бог повелел только в загрузчике держать и нигде более (т.к. он особо защищен от несанкционированного доступа)!
По такой жаре совсем теме топика от меня уплыла... То-то я смотрю на разных языках говорим.

По теме использования одного кода в основной памяти программы и в загрузчике считаю вопрос риторическим. Нужен промежуточный буфер и одним циклом сразу менять всю прошивку. Внешняя ram, flash по i2c или spi.
Как вариант, если программа занимает меньше половины памяти, то загрузить во вторую половину. Потом по команде перепрошить основную часть.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Jack_A писал(а):
DX168B писал(а):Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
А чем RJMP 0 не устраивает? Можно выдать недопустимый код или недопустимый адрес памяти - пойдет на начальный ресет. Можно по watch-собачке... Да мало ли! Когда запускаешь сырую программу, она так старательно на ресет уходит - только успевай разгребать.
А компилятор не матернётся?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»