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

 
 
> Редактирование данных в памяти программ.
koT-34
сообщение Mar 29 2010, 10:25
Сообщение #1





Группа: Участник
Сообщений: 6
Регистрация: 20-03-06
Пользователь №: 15 391



Добрый день.

Пишу на С, компилятор winavr, контроллер atmega64.
Знаю, что создать и прочитать переменные, в памяти программ, можно с помощью PROGMEM.

Возможно ли средствами С редактировать данные записанные во флеш память МК ?

Пример(создаю в памяти программ массив данных, и хочу изменить первый байт):

Код
static unsigned char mydata[20] PROGMEM = {0x00,0x01,0x02, ... 0x12,0x13,0x14};

Код
unsigned char temp = 10;
mydata[0] = temp;


Приведенный способ естественно не работает: error: assignment of read-only location 'mydata[0]'
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vlx
сообщение May 17 2011, 10:44
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 17-05-11
Из: Харьков
Пользователь №: 65 054



Добрый день!
Чтобы не плодить топики, задам вопрос здесь.
Не получается записать данные в Flash. Код следующий:

CODE
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/boot.h>
#include <inttypes.h>
#include <avr/interrupt.h>

void BOOTLOADER_SECTION boot_program_page (uint32_t page, uint8_t *buf);

uint8_t buffer[128] = "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";

int main()
{
boot_program_page(0x30, buffer);
while(1)
{
}
return 0;
}

void BOOTLOADER_SECTION 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;
}

контроллер ATmega16L;
функция boot_program_page скопирована из документации к avr-libc;
линкеру задано -Wl,-section-start=.bootloader=0x1F80;
по hex-файлу видно, что код размещается в нужной области памяти.
В считанной прошивке никаких изменений не наблюдается...
Подскажите, пожалуйста, чего ему не хватает?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 01:07
Рейтинг@Mail.ru


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