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

 
 
> самописный бутлоадер для m128, самописный бутлоадер для m128
IVN2013
сообщение Dec 25 2013, 21:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго времени суток! После написания простенького бутлоадера на ассемблере для m8515 начал писать бутлоадер на си++
в atmel studio 6 для m128. До этого использовал stk500, теперь работаю с jtag ice. С си++ дела раньше не имел. Возник ряд вопросов. Не понимаю
как перейти в область бутлоадера, для написания его части кода, пробовал "jmp адрес"" или объявлял "bootloader section;" но при пошаговой отладке по
jtag просматривал память и не видел чтобы дальнейший код шел в области лоадера. Подскажите пожалуйста что может быть не так и как лучше осуществить этот переход. Или он произошел но не отображается?

И еще подойдет ли boot_page_fill(address, data); для ввода данных в память а boot_page_erase ( address ) чтобы стирать страницы? Если можно бросьте какой нить образец или ссылку на ресурс где это обсуждается!



Заранее спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Dec 26 2013, 11:04
Сообщение #2


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

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



Простой поиск по форуму уже много чего даёт.
Например: http://electronix.ru/forum/index.php?showt...=avr+bootloader
Поиск в яндексе (ну или в гугле - кому как удобно) тоже приносит свои результаты
http://www.scienceprog.com/testing-avr-uni...r-on-atmega128/

Для старта из секции загрузчика необходимо настроить фус-биты. Про это написано в документации.
Atmega128 отличается от остальных тем, что у неё 128кБайт памяти, поэтому есть свои особенности в адресации страниц памяти, но об этом также можно узнать из примеров исходником или из документации.
Go to the top of the page
 
+Quote Post
IVN2013
сообщение Jan 9 2014, 21:12
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Цитата(mempfis_ @ Dec 26 2013, 14:04) *
Простой поиск по форуму уже много чего даёт.
Например: http://electronix.ru/forum/index.php?showt...=avr+bootloader
Поиск в яндексе (ну или в гугле - кому как удобно) тоже приносит свои результаты
http://www.scienceprog.com/testing-avr-uni...r-on-atmega128/

Для старта из секции загрузчика необходимо настроить фус-биты. Про это написано в документации.
Atmega128 отличается от остальных тем, что у неё 128кБайт памяти, поэтому есть свои особенности в адресации страниц памяти, но об этом также можно узнать из примеров исходником или из документации.


Большое спасибо за ответ! Понемногу начинаю разбираться. То что размер загрузчика задается во фьюзах, это я понял. Но не понимаю как указать то, что конкретный код должен быть размещен в памяти загрузчика или в основной памяти(application sector). Нашел по ссылке http://avr-libc.nongnu.org/user-manual/gro...c42bb18f0f5789e следующую информацию: #define BOOTLOADER_SECTION __attribute__ ((section (".bootloader"))) Used to declare a function or variable to be placed into a new section called .bootloader. This section and its contents can then be relocated to any address (such as the bootloader NRWW area) at link-time.

Т.е. как я понял - можно указать местоположение в области бутлоадера каждой функции, но только как? Все мои попытки отнести конкретную часть кода в область лоадера не увенчались успехом, когда при отладке на паузе просматривал состояние памяти лоадера - оно отсавалось пустое все равно. А насколько понимаю то производить манипуляции с flash памятью(стирать страницы и записывать) можно только из области бутлоадера.

И еще хочу спросить на примере кода:
Код
#include <inttypes.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    
    void boot_program_page (uint32_t page, uint8_t *buf)
    {
        uint16_t i;
        uint8_t sreg;

        // Disable interrupts.

        sreg = SREG;
        cli();
    
        eeprom_busy_wait ();

        boot_page_erase (page);
        boot_spm_busy_wait ();      // Wait until the memory is erased.

        for (i=0; i<SPM_PAGESIZE; i+=2)
        {
            // Set up little-endian word.

            uint16_t w = *buf++;
            w += (*buf++) << 8;
        
            boot_page_fill (page + i, w);
        }

        boot_page_write (page);     // Store buffer in flash page.
        boot_spm_busy_wait();       // Wait until the memory is written.

        // Reenable RWW-section again. We need this if we want to jump back
        // to the application after bootloading.

        boot_rww_enable ();

        // Re-enable interrupts (if they were ever enabled).

        SREG = sreg;


int main(void)
{
  
     uint8_t data_buf[SPM_PAGESIZE];
  
     здесь получаем data_buf по USART
     boot_program_page(0, data_buf);
              
        
}


Т.е. имеем две функции : void boot_program_page (uint32_t page, uint8_t *buf) и int main(void), как отметить то что они должны размещаться в секторе загрузчика? и делается это по отдельности для каждой функции?
И как поступать с #define и #include в начале программы - их тоже в бутлоадер?

Сообщение отредактировал IVN2013 - Jan 9 2014, 21:16
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 9 2014, 22:14
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(IVN2013 @ Jan 9 2014, 23:12) *
Большое спасибо за ответ! Понемногу начинаю разбираться. То что размер загрузчика задается во фьюзах, это я понял.


Если весь не влазит, то можно часть функций и в application section расположить.

Цитата(IVN2013 @ Jan 9 2014, 23:12) *
Но не понимаю как указать то, что конкретный код должен быть размещен в памяти загрузчика или в основной памяти(application sector).



В опциях линкера сместить text в область boot-а(может и не лучший способ...наверняка):

Код
-Wl,--section-start=.text=0x30000


Да и как-то у AVRGCC плохо с бут-проектами...

Цитата(IVN2013 @ Jan 9 2014, 23:12) *
Т.е. как я понял - можно указать местоположение в области бутлоадера каждой функции, но только как?


Не замучаетесь?

Цитата(IVN2013 @ Jan 9 2014, 23:12) *
А насколько понимаю то производить манипуляции с flash памятью(стирать страницы и записывать) можно только из области бутлоадера.



Верно понимаете.

Цитата(IVN2013 @ Jan 9 2014, 23:12) *
и делается это по отдельности для каждой функции?

Цитата(IVN2013 @ Jan 9 2014, 23:12) *
И как поступать с #define и #include в начале программы - их тоже в бутлоадер?

Сами поняли что спросили? Тогда другим объясните.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 05:40
Рейтинг@Mail.ru


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