Привет, форумчане. Имею проблему. Пытаюсь получить eep-файл в Atmel Studio7, но он пустой. Вместо него заполняется hex (тот в котором main). Код примерно следующий: Код (C++): #include <avr/eeprom.h> #include <inttypes.h> #define MAX_SIZE 5 int main void { eeprom_write_word((uint16_t*) 0, (uint16_t)830); eeprom_write_byte((uint8_t*)2,(uint8_t)15); // etc... } Как вынудить студию сохранять данные в *.eep?
Считать eeprom из МК и сохранить как eep. Но в версии 7 студии в eep сохраняется ещё и контрольная сумма. Поэтому изменить на шальную eep файл не получится - студия откажется загружать его в МК, если контролька не совпадает.
Ну почему же не получить? Сделайте что-то типа такого: Код (C++): struct Config config EEMEM = { 0, // Language 0, // Cancel Button { // Delay 0, // Minute 0 // Second }, { { // Preset #0 { 0 }, // name { // Time 0, // Minute 0 // Second } }, { // Preset #1 { 0 }, // name { // Time 0, // Minute 0 // Second } }, { // Preset #2 { 0 }, // name { // Time 0, // Minute 0 // Second } }, { // Preset #3 { 0 }, // name { // Time 0, // Minute 0 // Second } }, { // Preset #4 { 0 }, // name { // Time 0, // Minute 0 // Second } } } }; и получите при компиляции *.eep файл, который можно будет зашить в EEPROM при прошивке контроллера.
Я уже пробовал так. И честно говоря не понял, как потом из программы извлекать отдельные поля этой структуры. Ведь если подход такой - в одном файле, допустим main.c мы создаем глобальную структуру в EEPROM и компилируя его получаем *.eep для прошивания, то как потом извлекать данные из EEPROM работая уже из другой программы. Ведь тут нет явных адресов. Чисто теоретически можно завести в клиентской программе структуру подобного вида и указатель на нее, а потом доступ осуществлять через указатель. Но мне этот способ не кажется правильным - ведь кмопилятор может поля структур размещать по-разному...
Вот потому я и говорил "забей". Характер вопроса показывает. что ты просто не готов нормально воспринять ответ. Попозже, наберёшься опыта - разберёшься.
Вы сейчас не с голосами ли в голове разговариваете, нет? Вопрос был по существу, не можете ответить - не отвечайте.
А просто, была идея формировать hex для еепрома, что бы зашивать его дудкой в контроллер с уже существующей прошивкой. Тобишь, содержимое флеша не менять, а изменять только EEPROM под нужды заказчика так сказать.
Так и ответ был по-существу. Просто он тебе не понравился. Ну, извини. Жизнь такова, какова она есть.
В любом hex редакторе. Контрольку он должен сам считать. Ну или самому - сумма всех байтов в строке должна равняться нулю. Подробнее: http://microsin.net/programming/PC/intel-hex-file-format.html
Вообще можно сказать компилятору по какому адресу располагать переменные. Если для сборки используете компилятор из коллекции GCC, то копайте в сторону скриптов линкера.
Это конечно. Вот только, если будете собирать вручную, нужно будет иметь чёткое понимание по какому адресу в EEPROM находится та или иная переменная, что бы этот HEХ правильно собрать. И для этого понимания как раз пригодится, точные знания куда компилятор сохраняет данные. Правда, выше приведённые утверждения верны, если Вы компилятору доверяете распределение памяти. А не сами вручную по всей программе прописываете адреса (что, собственно, является феерической глупостью и источником ошибок). Вот тут было обсуждение, как "заставить" компилятор использовать для хранения переменных определённые адреса RAM памяти (см. 7-е сообщение) -- http://forum.easyelectronics.ru/viewtopic.php?f=4&t=34261. Для EEPROM проблема решается аналогично.