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

 
 
> размещение данных в EEprom не работает, пробовал варианты что нашел
bugor
сообщение Feb 26 2009, 19:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Сергей Борщ
сообщение Feb 26 2009, 20:08
Сообщение #2


Гуру
******

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



Поиск по сочетанию "e133" дает ответы на ваши вопросы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 26 2009, 20:11
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Тема стара, как мир. Пользуйтесь поиском.

Для формирования файла .eep в командной строке линкера вставьте
-y(CODE)
-Ointel-extended,(XDATA)=.eep
Go to the top of the page
 
+Quote Post
bugor
сообщение Feb 27 2009, 07:54
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 27 2009, 08:27
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 27 2009, 10:58
Сообщение #6


Местный
***

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



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


Попробую предположить что у автора стоит PonyProg rolleyes.gif , хотя могу и ошибатся.
Go to the top of the page
 
+Quote Post
bugor
сообщение Feb 27 2009, 10:58
Сообщение #7


Участник
*

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



строка вот эта - без нее ошибку выдает

а Linker -> Output -> Format (radiobutton) поставить на Debug information.

Объясните пожалуйста, зачем вам обязательно нужно загнать код и содержимое eeprom в один файл?

вообще хотелось читать программатором один файл - и думалось что программатор сам раскидает куда чего писать а оказалось облом sad.gif

но собственно я рано обрадовался один из программаторов отказался принимать расширенный интел - проверю на другом и тогда может а скорее всего да появятся новые вопросы rolleyes.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 1 2009, 19:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(bugor @ Feb 27 2009, 14:58) *
вообще хотелось читать программатором один файл - и думалось что программатор сам раскидает куда чего писать а оказалось облом sad.gif

С точностью до "наоборот". smile.gif
Программаторы берут два разных файла. Для Пони-прога можно создать файл карточки, где указать оба имени.
Go to the top of the page
 
+Quote Post
ЛеонидК
сообщение Mar 1 2009, 20:18
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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 это делать запрещает.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 2 2009, 06:25
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 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}. Компилятор в этом случае должен выдать хотя бы ремарку (если они не запрещены).
Go to the top of the page
 
+Quote Post
ЛеонидК
сообщение Mar 2 2009, 14:47
Сообщение #11


Участник
*

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



Цитата
1. Из такого определения ещё не следует, что в программе нет ссылок на этот обьект.

Т.е. предполагается что в программе есть переменная zast[4]. Где она располагается?
В eeprom или... (Стой там, иди сюда). Как компилятор это должен понимать?
Цитата
с одной стороны есть указание, что обьект __no_init,

Где у это у меня.
Я предложил __root __eeprom unsigned char zast[4] = {23,34,56,78};
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 2 2009, 15:31
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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! */
};
Go to the top of the page
 
+Quote Post
ЛеонидК
сообщение Mar 2 2009, 16:02
Сообщение #13


Участник
*

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



Согласен. Беру свои слова обратно.
Я читал EEPROM через _EEGET.
Но если формировать данные для EEPROM,
без ссылки на них в программе нужно __root.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 17:56
Рейтинг@Mail.ru


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