|
размещение данных в EEprom не работает, пробовал варианты что нашел |
|
|
|
Feb 26 2009, 19:28
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 26-02-09
Пользователь №: 45 408

|
Что надо: 1. желательно, чтобы после компиляции был один файл HEX (но можно и два) 2. сформировать в EEPROM данные, желательно с определенного адреса, строку символов, чтобы потом, обратившись из программы вывести ее на дисплей, чтобы при инициализации они не менялись. То есть надо просто массив данных из строк и констант (можно отдельно и переменных), которые будут при программировани записаны, а на этапе компиляции никак не меняются. 3.правил сfg1soim.xcl чтобы получить единый файл, но там даже нулей в eeprom не получилось
в общем засада - как мне это сделать - надоело отдельно формировать ручками данные для eeprom!
пробовал так:
typedef struct { __eeprom unsigned char var1; __eeprom unsigned char zast1[3]; } struct1;
Error[Pa004]: illegal declaration
вот так: __no_init __eeprom unsigned char zast[4];
при этом формирую два файла - для кода и eeprom - ПРОКАТЫВАЕТ но при загрузке файла eeprom там нули - что логично. При попытке инициализировать
вот так:
__no_init __eeprom unsigned char zast[4] = {23,34,56,78};
Error[e133]: The output format intel-extended cannot handle multiple address spaces. Use format variants (-y -O) to specify which address space is
а с #pragma _locate чтото не получилось разобраться - как выставить адрес, с которого начать размещение и при этом указать, что все это дело в EEPROM?
Сообщение отредактировал bugor - Feb 26 2009, 19:43
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Feb 27 2009, 07:54
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 26-02-09
Пользователь №: 45 408

|
По посту Igor26 сделал следующее
Советую в Linker -> Extra Options ввести настройку генерации выходных файлов: -Ointel-extended,(CODE)=NAME.hex -Ointel-extended,(XDATA)=NAME.eep а Linker -> Output -> Format (radiobutton) поставить на Debug information.
причем когда советуют забывают про последнюю строку и ничего не работает компилятор все проглотил но............ в файле образа для eeprom вместо одного числа 0x40 которое в тексте выглядит как const __eeprom unsigned char stst = 0x40; с нулевого по 41 адрес следующее 3A 30 32 30 30 30 30 3032 30 30 30 46 43 0D 0A 3A 30 31 30 30 30 41 30 30 34 30 ...... ну и так далее - ЭТО КАК??? чем это расширение открывать - если я просто его смотрю блокнотом то вижу там что надо гружу в eeprom как образ такая фигня если расширение сменю на hex и гружу то в нулевой ячейке памяти нулевое значение
и вот не ответили чегото - как мне указать,что данные в eeprom располагаются с определенного адреса?
По посту IgorKossak
понял что intel-xxxxxxx форматы в принципе не могут содержать в себе кусок для flasch и eeprom а программируемые области могут быть только в разных файлах я правильно понял?
Сообщение отредактировал bugor - Feb 27 2009, 08:03
|
|
|
|
|
Feb 27 2009, 08:27
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(bugor @ Feb 27 2009, 09:54)  причем когда советуют забывают про последнюю строку и ничего не работает Будьте добры, пишите конкретнее - что за последняя строка и как именно выглядит "ничего не работает". Потому что у остальных почему-то все работает. Цитата(bugor @ Feb 27 2009, 09:54)  в файле образа для eeprom вместо одного числа 0x40 которое в тексте выглядит как
const __eeprom unsigned char stst = 0x40; с нулевого по 41 адрес следующее 3A 30 32 30 30 30 30 3032 30 30 30 46 43 0D 0A 3A 30 31 30 30 30 41 30 30 34 30 ...... ну и так далее - ЭТО КАК??? Это надо почитать описание формата Intel-HEX, в котором вы попросили линкер создать ваш файл. Цитата(bugor @ Feb 27 2009, 09:54)  и вот не ответили чегото - как мне указать,что данные в eeprom располагаются с определенного адреса? Это есть в документации, если чем-то не устраивает определенный адрес "ноль". Цитата(bugor @ Feb 27 2009, 09:54)  понял что intel-xxxxxxx форматы в принципе не могут содержать в себе кусок для flasch и eeprom а программируемые области могут быть только в разных файлах я правильно понял? В общем да. Можно извратиться, но не нужно. Потому что программатор такой файл не поймет. Объясните пожалуйста, зачем вам обязательно нужно загнать код и содержимое eeprom в один файл? Уже второй раз в этом году такой вопрос, но внятного объяснения "зачем" пока никто не дал. Посмотрите эту тему.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 27 2009, 10:58
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(Сергей Борщ @ Feb 27 2009, 11:27)  Объясните пожалуйста, зачем вам обязательно нужно загнать код и содержимое eeprom в один файл? Уже второй раз в этом году такой вопрос, но внятного объяснения "зачем" пока никто не дал. Посмотрите эту тему. Попробую предположить что у автора стоит PonyProg  , хотя могу и ошибатся.
|
|
|
|
|
Feb 27 2009, 10:58
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 26-02-09
Пользователь №: 45 408

|
строка вот эта - без нее ошибку выдает а Linker -> Output -> Format (radiobutton) поставить на Debug information. Объясните пожалуйста, зачем вам обязательно нужно загнать код и содержимое eeprom в один файл? вообще хотелось читать программатором один файл - и думалось что программатор сам раскидает куда чего писать а оказалось облом но собственно я рано обрадовался один из программаторов отказался принимать расширенный интел - проверю на другом и тогда может а скорее всего да появятся новые вопросы
|
|
|
|
|
Mar 1 2009, 20:18
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 27-01-09
Пользователь №: 44 027

|
При таком объявлении __no_init __eeprom unsigned char zast[4] = {23,34,56,78}; компилятор скорее всего удаляет данные, т.к. на них нет ссылки в программе. Объявите __root __eeprom unsigned char zast[4] = {23,34,56,78}; и компилятор их удалять не будет, т.к. __root это делать запрещает.
|
|
|
|
|
Mar 2 2009, 06:25
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(ЛеонидК @ Mar 1 2009, 22:18)  При таком объявлении __no_init __eeprom unsigned char zast[4] = {23,34,56,78}; компилятор скорее всего удаляет данные, т.к. на них нет ссылки в программе. 1. Из такого определения ещё не следует, что в программе нет ссылок на этот обьект. 2. Данное определение взаимоисключающее, т. к. с одной стороны есть указание, что обьект __no_init, а с другой, он инициализируется значениями = {23,34,56,78}. Компилятор в этом случае должен выдать хотя бы ремарку (если они не запрещены).
|
|
|
|
|
Mar 2 2009, 14:47
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 27-01-09
Пользователь №: 44 027

|
Цитата 1. Из такого определения ещё не следует, что в программе нет ссылок на этот обьект. Т.е. предполагается что в программе есть переменная zast[4]. Где она располагается? В eeprom или... (Стой там, иди сюда). Как компилятор это должен понимать? Цитата с одной стороны есть указание, что обьект __no_init, Где у это у меня. Я предложил __root __eeprom unsigned char zast[4] = {23,34,56,78};
|
|
|
|
|
Mar 2 2009, 15:31
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Выссказывания IgorKossak относились к автору. Автор не указывал, что у него нет обращения к переменной. То есть при объявлении типа: __eeprom unsigned char zast[4] = {23,34,56,78}; и обращении типа i=zast[j]; компилятор всё разместит как надо и сформирует оба файла. У меня, кпримеру, всё прекрасно формируется. Можно также явно указать адресс размещения этого массива. Либо посредством прямого указания (через @) либо адресуя сегмент соответствующий. Всё это чётко описано в документации. Последовательность размещения переменных в EEPROM будет соответствовать последовательности объявления соответствующих переменных. Можно размещать и структуру в EEPROM. Для этого ключевое слово __eeprom должно быть вынесено за поле объявления. Не допускается только растусовка полей (одно в EEPROM, другое в ОЗУ), что совершенно очевидно и так. Хотя чётко описано в документации. Цитата STRUCTURES AND MEMORY TYPES For structures, the entire object is placed in the same memory type. It is not possible to place individual structure members in different memory types. In the example below, the variable gamma is a structure placed in eeprom memory. struct MyStruct { int alpha; int __flash * beta; /* Pointer to variables in flash memory */ }; __eeprom struct MyStruct gamma; The following declaration is incorrect: struct MySecondStruct { int blue; __eeprom int green; /* Error! */ };
|
|
|
|
|
Mar 2 2009, 16:02
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 27-01-09
Пользователь №: 44 027

|
Согласен. Беру свои слова обратно. Я читал EEPROM через _EEGET. Но если формировать данные для EEPROM, без ссылки на них в программе нужно __root.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|