Я так думаю, что проскольку бутлодер может работать только в строго определенной секции флеш-памяти, загнать его именно туда без .org вряд ли получится.Murav писал(а): Здесь предлагалось найти адрес функции в map-файле, а не задавать его .org .
AVR, как прыгнуть на bootloader из программы?
- Реклама
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Продолжу... и конечный вывод, как аксиома: Бутлоадер постоянен. И адрес входа в него останется таким же. Бутлоадер сам себя изменить не сможет. Не мне вам рассказывать про предусловную компиляцию ) , когда требуется убрать из сборки загрузчик.ARV писал(а):вывод о том, что загрузчик и основная программа друг о друге не знают, я сделал из такого простого факта: предположим, мы собрали программу вместе с загрузчиком - это, так сказать, исходная версия прошивки. все пучком, адреса всех функций известны и нет проблем. но потом мы скармливаем загрузчику обновление - оно ведь уже не содержит самого кода загрузчика, он ведь не перезаписывается! и в этом случае приходится исходить из принципа, что в коде обновления об адресах функций загрузчика компилятору ничего не известно...
Показалось, что тема топика интереснее. Ан нет. Ошибся.
Насколько я понял, тема пошла по пути, что есть два отдельно откомпилированного бинарного кода, который требуется вместе слинковать. Ни первый не знает о втором, не второй о первом... Ищем адрес входа из одного в другой.
Похоже на измерение зазора свечей через выхлопную трубу в дизельном двигателе. Тыкаем и ищем место, куда щуп вставлять. )
Ушёл пить квас…
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Ну и махнув кваску, с содержанием 1,2% спирта, в порядке бреда предложу идею:
В секции бутлоадера, перед входом в него нужно разместить ASCII строку, типа bootloaler here. Из секции программы поиском найти эту строку. Начало строки + длина её + 1 даст нужный адрес входа.
В секции бутлоадера, перед входом в него нужно разместить ASCII строку, типа bootloaler here. Из секции программы поиском найти эту строку. Начало строки + длина её + 1 даст нужный адрес входа.
вместо пустых слов, космический вы наш гость, лучше бы конкретно рассказали, как программа, собираемая без функций загрузчика, сможет обратиться к ним? если map-файл не выдает сведений об адресах этих функций? точка входа известна, это как бы main() загрузчика, а все прочие функции? например, ввод-вывод по UART или еще како-либо сервис? как найти входы в эти функции?
кстати, чтоб вы знали: строки компилятор тасует по памяти, как захочет, и конец-начало строки никак с началом кода функции не связан в общем случае.
кстати, чтоб вы знали: строки компилятор тасует по памяти, как захочет, и конец-начало строки никак с началом кода функции не связан в общем случае.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
В качестве дурацкого предложения...
Если функцию начать 3 NOP-ами (ассемблерными вставками) и искать три подряд кода NOP
Это как раз будет адрес начала функции...
В былые времена MS-DOS? таким образом резидентные функции отлаживал через отладчик....
Если функцию начать 3 NOP-ами (ассемблерными вставками) и искать три подряд кода NOP
Это как раз будет адрес начала функции...
В былые времена MS-DOS? таким образом резидентные функции отлаживал через отладчик....
- Реклама
- Сообщения: 1138
- Зарегистрирован: Сб апр 03, 2010 08:57:35
Если есть свободные ноги контроллера, то киньте одну на ресет.
и ещё хотел глупость сморозить но одумался
Каким интерфейсом мк связан с пк? COM - есть специальные сигнальные линии которыми можно сбросить мк.
и ещё хотел глупость сморозить но одумался
Каким интерфейсом мк связан с пк? COM - есть специальные сигнальные линии которыми можно сбросить мк.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
А при чем тут ресет?
- Сообщения: 1138
- Зарегистрирован: Сб апр 03, 2010 08:57:35
Посмотри первый пост
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Да кроме как зная конкретный числовой адрес функции входа в бутлоадер - никак!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" };
похоже, читаете тему через строку... автор заинтересовался тем, как сэкономить объем основной программы путем использования протокольных функций, зашитых в загрузчике - например, ввод-вывод по UART: загрузчик это делает для своих целей и имеет для этого определенные функции, и основной программе это требуется - так зачем дважды писать одно и то же?! смысл есть и очень немаленький! например, для USB-контроллеров загрузчик содержит весь протокол обмена по USB, а это не так уж и мало! или дектриптор-энкриптор для защищенного обмена инфой - это вообще сам бог повелел только в загрузчике держать и нигде более (т.к. он особо защищен от несанкционированного доступа)!asteroid7 писал(а):Не понял к чему тут прочие функции и ввод-вывод по UART? Это к бутлоадеру относится и находится в бут-секции. Ну вот пусть он сам с ними и разбирается. Он про них знает больше, чем кто либо.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1138
- Зарегистрирован: Сб апр 03, 2010 08:57:35
http://electronix.ru/forum/lofiversion/ ... 36933.html
здесь осуждали, но хз прокатит или нет.
здесь осуждали, но хз прокатит или нет.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Ого тема как разрослась
По теме топика, я в итоге пошёл путём #asm("RJMP 0x1C00"); - это для atmega8 и загрузчика на 512 слов.
Работает...
Спасибо за советы
По теме топика, я в итоге пошёл путём #asm("RJMP 0x1C00"); - это для atmega8 и загрузчика на 512 слов.
Работает...
Спасибо за советы
Сделать хотел грозу, а получил КоЗу
- Сообщения: 1138
- Зарегистрирован: Сб апр 03, 2010 08:57:35
Слушайте вот подрезал то
Люди тут распинаются ,а он на вот так вот
Возвратится, там управление перейдёт бутлодеру, и как только он закончит то запустит выполнение основной програмки
с самого начала.
Возвратится, там управление перейдёт бутлодеру, и как только он закончит то запустит выполнение основной програмки
с самого начала.
[img]http://i053.radikal.ru/1102/71/0a0346d3a067.gif[/img]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
[size=85]Ты думаешь ты думал как ты думаешь? (с)[/size]
Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
I am DX168B and this is my favourite forum on internet!
А чем RJMP 0 не устраивает? Можно выдать недопустимый код или недопустимый адрес памяти - пойдет на начальный ресет. Можно по watch-собачке... Да мало ли! Когда запускаешь сырую программу, она так старательно на ресет уходит - только успевай разгребать.DX168B писал(а):Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
По такой жаре совсем теме топика от меня уплыла... То-то я смотрю на разных языках говорим.ARV писал(а):похоже, читаете тему через строку... автор заинтересовался тем, как сэкономить объем основной программы путем использования протокольных функций, зашитых в загрузчике - например, ввод-вывод по UART: загрузчик это делает для своих целей и имеет для этого определенные функции, и основной программе это требуется - так зачем дважды писать одно и то же?! смысл есть и очень немаленький! например, для USB-контроллеров загрузчик содержит весь протокол обмена по USB, а это не так уж и мало! или дектриптор-энкриптор для защищенного обмена инфой - это вообще сам бог повелел только в загрузчике держать и нигде более (т.к. он особо защищен от несанкционированного доступа)!
По теме использования одного кода в основной памяти программы и в загрузчике считаю вопрос риторическим. Нужен промежуточный буфер и одним циклом сразу менять всю прошивку. Внешняя ram, flash по i2c или spi.
Как вариант, если программа занимает меньше половины памяти, то загрузить во вторую половину. Потом по команде перепрошить основную часть.
А компилятор не матернётся?Jack_A писал(а):А чем RJMP 0 не устраивает? Можно выдать недопустимый код или недопустимый адрес памяти - пойдет на начальный ресет. Можно по watch-собачке... Да мало ли! Когда запускаешь сырую программу, она так старательно на ресет уходит - только успевай разгребать.DX168B писал(а):Жалко, что в МК нет такого регистра, при обращении к которому МК перезагружается полностью.
Типа аппаратного ресета, но с программным пуском. Идею можно предложить атмелу.
I am DX168B and this is my favourite forum on internet!


