Цитата(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