Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: CVAVR struct EEPROM copy struct SRAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AndryG
Доброго времени суток.

В еепром хранится массив записей.
Нужно определить в ram парочку таких же записей и гонять данные туда-сюда.

Пишу на CV. (1.25b2 ... пробовал и на других - тот же результат)
TINY2313

Первое неудобство:
Код
typedef eeprom struct{
  unsigned char h;
  unsigned char m;
  unsigned char s;
  unsigned char d;
} tpoint_eep;

typedef struct{
  unsigned char h;
  unsigned char m;
  unsigned char s;
  unsigned char d;
} tpoint_ram;

tpoint_ram      point_ram;
eeprom tpoint_eep      point_eep;

Приходится объявлять два "почти одинаковых" типа sad.gif

Ну да ладно ... смирирился .. продолжаю.
Код
void func1(void)
{
point_ram = point_eep;
}

Ругается на ошибку в АСМ-коде ... смотрю листинг - красота!
Код
__COPYME:
    SBIC EECR,EEWE
    RJMP __COPYME
    IN   R23,SREG
    CLI
    OUT  EEARL,R30
    OUT  EEARH,R31
    SBI  EECR,EERE
    IN   R22,EEDR
    OUT  SREG,R23
    ADIW R30,1
    ST   X+,R22
    DEC  R24
    BRNE __COPYME
    RET

OUT EEARH,R31 - нет такого.

Встречал кто такое? Как побороли?
____
P.S.
Плюнул на CV:"Вот хороший повод переползти на WinAvr" ... почитал ... а у него вообще работа с "не SRAM" через функции eeprom_read_byte и т.д.
Тогда получается сравнение point_eep.h == point_rem.h вырастает в такую хучу кода ...
sad.gif
Сергей Борщ
Цитата(AndryG @ Jun 11 2007, 11:44) *
Первое неудобство:
Это как раз элементарно:
Код
typedef  struct{
  unsigned char h;
  unsigned char m;
  unsigned char s;
  unsigned char d;
} point_t;

point_t  point_ram;
eeprom point_t      point_eep;
А вот про вторую часть вопроса - пас, с CV не работаю.
AndryG
Не проходит такой простой вариант - пробовал ... ругается на разные типы ... может точно в WinAvr переползти ... и нафиг этот cv.
Сергей Борщ
Цитата(AndryG @ Jun 11 2007, 12:14) *
Не проходит такой простой вариант - пробовал ... ругается на разные типы ... может точно в WinAvr переползти ... и нафиг этот cv.
Телепаты в это время года обычно в отпуске. Приведите код, на который ругается и полное сообщение об ошибке. Такая конструкция должна работать независимо от компилятора. Скорее всего ругается на что-то другое.
AndryG
Про телепатов я в курсе ...
Код
typedef struct{
  unsigned char h;
  unsigned char m;
  unsigned char s;
  unsigned char d;
} tpoint_ram;


      tpoint_ram      point_ram;
eeprom tpoint_ram      point_eep;

void func1(void)
{
point_ram = point_eep;
}

ERROR structure must be stored in the same memory class as defined

Вот решение второй части проблемы:

В версии 1.25.4
fixed: an assembly error occurred for chips with 128 bytes of EEPROM when assigning a structure located in EEPROM to a structure located in RAM
WHALE
Увы,у CV большие проблемы в работе с EEPROM sad.gif Если вы посмотрите хэлп,то увидите,что практически
все библиотечные фукции определены только для данных,лежаших во флеш и рам,а с епром приходится руками работать.Хотя можно доствточно быстро наклеать самописных.)Сответственно,и работа со структурами в EEPROM-дело не для слабонервных.
З.Ы. дык если они пишут,что пофиксили баг с доступом в версии 1.25.4,почему не работает в 1.25.5?
З.З.Ы. 2 Сергей Борщ в CV в определении структуры надо явно указывать ее тип,а такое опреде
ление он понимает как структруру в раме и при определении обьектов структуры еепром ругается на
несовпадение типов.
Сергей Борщ
Цитата(WHALE @ Jun 11 2007, 14:41) *
З.З.Ы. 2 Сергей Борщ в CV в определении структуры надо явно указывать ее тип,а такое определение он понимает как структруру в раме и при определении обьектов структуры еепром ругается на несовпадение типов.
Тогда пожалуй прав AndryG:
Цитата(AndryG @ Jun 11 2007, 12:14) *
может точно в WinAvr переползти ... и нафиг этот cv.
WHALE
Цитата(Сергей Борщ @ Jun 11 2007, 17:10) *
Тогда пожалуй прав AndryG:

(AndryG @ Jun 11 2007, 12:14)
может точно в WinAvr переползти ... и нафиг этот cv.

Ну вот опять-сразу голову рубить sad.gif Может,усы сбрить будет достаточно? smile.gif
Конвенцию это не нарушает,т.к.стандарт С про разные типы памяти,ессно,ни сном ни духом.
Соответственно,это 100% особенности реализации конкретного компилятора.
Имхо,в CV это сделано логично-без спецификатора типа памяти он по дефолту считает,что работает с
ОЗУ,т.е. по стандарту.
И опять имхо,а как по другому-указатель на данные в рам и например,во флэш действительно должны
иметь разные типы. unsure.gif
З.Ы. Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа?
Структуры ведь обычно используют для обьединения в единое целое данных разных типов cranky.gif
В вашем случае,имхо,массив лучше подойдет.
Сергей Борщ
Цитата(WHALE @ Jun 11 2007, 18:32) *
Конвенцию это не нарушает,т.к.стандарт С про разные типы памяти,ессно,ни сном ни духом.
Соответственно,это 100% особенности реализации конкретного компилятора.
Имхо,в CV это сделано логично-без спецификатора типа памяти он по дефолту считает,что работает с
ОЗУ,т.е. по стандарту.
И опять имхо,а как по другому-указатель на данные в рам и например,во флэш действительно должны
иметь разные типы.
Не согласен. Типы данных как раз одни и те же - char, int, float, struct. Отличаются они модификатором размещения - например const, volatile, eeprom, __flash. Часть этих модификаторов действительно является расширениями языка, но они никоим образом не говорят о том, что данные имеют другой тип. И насколько я понимаю стандарт, с его точки зрения совершенно фиолетово, что
Код
typedef struct
{
    ........
} a_type;
a_type const a_const;
что
Код
typedef struct const
{
    ........
} a_type;
a_type a_const;
, а в CV мы наблюдаем именно изменение типа, что для меня несколько непонятно.
Цитата(WHALE @ Jun 11 2007, 18:32) *
З.Ы. Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа?
Структуры ведь обычно используют для обьединения в единое целое данных разных типов cranky.gif
В вашем случае,имхо,массив лучше подойдет.
Вообще-то структуры используют для группирования именованных данных независимо от типа, чтобы потом обращаться к этим данным по осмысленному имени а не по загадочному индексу массива, так что тут автора понять можно. Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова
WHALE
Цитата(Сергей Борщ @ Jun 11 2007, 21:17) *
Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова

Вы меня утешили -не так плох CV,как его малюют smile.gif
a чем плохо
define tpoint_eep[0] h;
define tpoint_eep[1] m;
define tpoint_eep[2] s;
define tpoint_eep[3] d;
eeprom unsigned char tpoint_eep[4];
и потом работаем действительно непосредственно с именами,без всяких дополнительных имен с точками и стрелочками.
singlskv
Цитата(Сергей Борщ @ Jun 11 2007, 21:17) *
Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова

И ИМХО, это правильно, особенно в части записи, потому что не дает ложного
представления о том, что запись в eeprom/flash это просто присвоение значения одной
переменной другой которое выполняется за пару тактов.
WHALE
Цитата(singlskv @ Jun 11 2007, 21:44) *
И ИМХО, это правильно, особенно в части записи, потому что не дает ложного
представления о том, что запись в eeprom/flash это просто присвоение значения одной
переменной другой которое выполняется за пару тактов.

Дык это просто нужно знать-что запись в епром занимает примерно милисекунду и компилируется
в несколько атомарных ассемблерных команд.
Но с точки зрения логики программы это действительно "просто присвоение значения одной
переменной другой",a=b,и зачем тут лишние телодвижения?
singlskv
Цитата(WHALE @ Jun 11 2007, 22:14) *
Дык это просто нужно знать-что запись в епром занимает примерно милисекунду и компилируется
в несколько атомарных ассемблерных команд.

ну во-первых, насколько я ничего не помню, в худшем случае это 3,5ms
Цитата
Но с точки зрения логики программы это действительно "просто присвоение значения одной
переменной другой",a=b,и зачем тут лишние телодвижения?

во-вторых, во время этого "простого" присвоения проц весит в никому не нужном
цикле while, вместо того что бы заниматься какой-нибудь полезной работой.

Например представте себе что нужно с частотой 1-10KHz опрашивать порты и после
этого делать какие-то сложные вычисления (типа многоканальный частотомер, итд), а еще
нужно время от времени писать что-то в eeprom.
Ну и как Вы представляете реализацию этого с помощью "просто присвоение" ?

P.S. Да, чтобы никто не начал расказывать мне про то, что это (опрос портов и вычисления) можно
сделать в прерывании, сразу же замечу что сложные вычисления занимают примерно 80%
процессорного времени...
AndryG
Ух! Как обычно на этом форуме ... хоть вопрос и иссяк, но его выдавливают по полной smile.gif
Цитата
З.Ы. дык если они пишут,что пофиксили баг с доступом в версии 1.25.4,почему не работает в 1.25.5?
У меня на сегодня 1.25.2 есть ... читал ... что 1.25.5 ломается криво ... видать придется точно не выделываться и перейти на массивы.

Цитата
Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа?

Да потому что надоело с индексами крутится таблиц smile.gif А тут у меня таблицы таблиц получаются, да еще разных размеров ... и т.д. и т.п. Ну типа ячейка данных еепром(h,m,s,d), которая ходит по RS-232 в пакете (head,h,m,s,d,crc) ... а в памяти лежит в еще более развернутом виде ... короче решил не путаться в индексах "копируем с индекса 2 в 4 5штук" и т.д. smile.gif (про #define rs_head rs_buf[0] можно не говорить)

Цитата
"может точно в WinAvr переползти ... и нафиг этот cv."
Ну вот опять-сразу голову рубить sad.gif Может,усы сбрить будет достаточно? smile.gif
Да не фанатизм это, просто давно хочу уйти с cvavr, да только духу не хватает. Не мастер я в avr-асме, но как гляну. что там cv накрутит -- жалко память ... хорошо хоть у структуры адреса сразу вычисляет :-)
В воскресенье поймал глюк этот ... думаю: "Ну вот - хороший повод!" ... сел за WinAvr ... посмотрел на кучу макросов и настроек makefile (понимаю. что это всё дает крутую гибкость) ... Мдя. Пошел в ИАР ... полазил там ... вот так как осел меж двух стогов сена и просидел всё воскресение :-)
Жаль, но не нашел нигде толкового описания изюминок этих компиляторов ... а CVAVR имеет минимум своих наворотов, и все хорошо в _маленькой_ справке лежат.

Кстати ... структуры я определил так...
Код
#define point_struct struct {byte h,m,s,d;}
typedef eeprom point_struct tpoint_eep;
typedef        point_struct tpoint_ram;


Небольшой итог:
1. НЕ НУЖНО поднимать спор кто из компиляторов круче, пжлст! :-)
2. может кто встречал доку типа "переход с CV на (WinAVR/IAR)"
WHALE
Вы будете смеяться,но В CV это реализовано именно с помощью простого присвоения
char a=5;
eeprom char b;
b=a;
Все что вы написали,абсолютно верно,только имхо,все это нужно просто держать в уме.
З.Ы. Последние посты уже откровенный оффтоп и религиозная война-я предлагаю прекратить,пока
че-нить от модеров не огребли. sad.gif Первым начал я -извиняюсь,вчера немного праздновали. smile.gif
З.З.ЫПока писал-пропустил пост аффтара. Могу вам сбросить 1.25.5-никмких проблем с взломом нет.
singlskv
Цитата(WHALE @ Jun 12 2007, 10:35) *
Вы будете смеяться,но В CV это реализовано именно с помощью простого присвоения
char a=5;
eeprom char b;
b=a;
Все что вы написали,абсолютно верно,только имхо,все это нужно просто держать в уме.
З.Ы. Последние посты уже откровенный оффтоп и религиозная война-я предлагаю прекратить,пока
че-нить от модеров не огребли. sad.gif Первым начал я -извиняюсь,вчера немного праздновали. smile.gif
З.З.ЫПока писал-пропустил пост аффтара. Могу вам сбросить 1.25.5-никмких проблем с взломом нет.

Если Вы это про мой пост, то я вобще названий никаких компиляторов в
своих постах не упоминал 07.gif
Я говорил только про запись в eeprom вне зависимости от компилятора...
Я в курсе что в некоторых компиляторах запись осуществляется присвоением,
но ИМХО, чаще всего, так делать не стоит.

Так что никаких религиозных войн beer.gif
mdmitry
>может кто встречал доку типа "переход с CV на (WinAVR/IAR)"
Не встречал. Использую WinAVR последней версии. Его выбрал давно за GPL wink.gif. Сравнивал с IAR новым. Где-то лучше, где-то хуже. Некий код компилировал под оба и смотрел дизассемблер. В моем случае WinAVR больше понравился. Make файл не столь страшен. Есть скрипт в поставке, генерящий его под Вашу задачу. Достаточно просто правиться руками.
С EEPROM работал через функции встроенной библиотеки, вполне корректно, за исключением аппаратного глюка в EEPROM ATMega128. Выбор за Вами в любом случае.
Наверно сообщение несколько не по теме.
SunnyDevil
Цитата(Сергей Борщ @ Jun 11 2007, 20:17) *
Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова


Как ручками?
А вот такое:

Код
extern void *memcpy_P(void *, PGM_VOID_P, size_t);
extern char *strcat_P(char *, PGM_P);
extern int strcmp_P(const char *, PGM_P) __ATTR_PURE__;
extern char *strcpy_P(char *, PGM_P);
extern int strcasecmp_P(const char *, PGM_P) __ATTR_PURE__;
extern size_t strlcat_P (char *, PGM_P, size_t );
extern size_t strlcpy_P (char *, PGM_P, size_t );
extern size_t strlen_P(PGM_P) __ATTR_CONST__; /* program memory can't change */
extern size_t strnlen_P(PGM_P, size_t) __ATTR_CONST__; /* program memory can't change */
extern int strncmp_P(const char *, PGM_P, size_t) __ATTR_PURE__;
extern int strncasecmp_P(const char *, PGM_P, size_t) __ATTR_PURE__;
extern char *strncat_P(char *, PGM_P, size_t);
extern char *strncpy_P(char *, PGM_P, size_t);
extern char *strstr_P(const char *, PGM_P) __ATTR_PURE__;


Это из стандартной библиотеки WinAVR, используем, все работает...
WHALE
Цитата(mdmitry @ Jun 14 2007, 17:35) *
С EEPROM работал через функции встроенной библиотеки, вполне корректно, за исключением аппаратного глюка в EEPROM ATMega128. Выбор за Вами в любом случае.
Наверно сообщение несколько не по теме.

А мужики-то не знают! sad.gif Можно поподробнее насчет аппаратного глюка EEPROM ATMega128?Прям щас
лежит девайс c ATMega128 на столе,EEPROM довольно активно испльзуется,вроде полет нормальный.
Где грабли зарыты?
Сергей Борщ
Цитата(SunnyDevil @ Jun 14 2007, 16:50) *
Как ручками?
Код
typedef struct
{
   uint8_t a;
   uint16_t b;
} tipa_struct_t

tipa_struct_t Struct1;
tipa_struct_t PROGMEM Struct2 = {1,2};

void test()
{
    Struct1 = Struct2;   // ась???
}
char T;
void test2(const prog_char * pSrc)
{
     T = *pSrc;  // ась?
}
mdmitry
>А мужики-то не знают! Можно поподробнее насчет аппаратного глюка EEPROM ATMega128?Прям щас
>лежит девайс c ATMega128 на столе,EEPROM довольно активно испльзуется,вроде полет нормальный.
>Где грабли зарыты?
Года два назад. Компилятор WinAvr был 2005 года . Не записывался первый байт в EEPROM по любому страничному адресу, а не только по нулевому (известный глюк). Обнаружили при чтении программатором EEPROM'а после записи данных. Пришлось использовать мажоритарную схему 2 из 3 для надежного сохранения блоков данных, каждый блок с CRC8. Может быть в новых ревизиях кристаллов это исправлено. А может у меня руки кривые sad.gif .? Проверить нет возможности новый компилятор и кристаллы, так как платы переданы заказчику.
WHALE
Цитата(mdmitry @ Jun 15 2007, 00:33) *
Года два назад. Компилятор WinAvr был 2005 года . Не записывался первый байт в EEPROM по любому страничному адресу, а не только по нулевому (известный глюк). Обнаружили при чтении программатором EEPROM'а после записи данных. Пришлось использовать мажоритарную схему 2 из 3 для надежного сохранения блоков данных, каждый блок с CRC8. Может быть в новых ревизиях кристаллов это исправлено. А может у меня руки кривые sad.gif .? Проверить нет возможности новый компилятор и кристаллы, так как платы переданы заказчику.

Ну дык так и пишите,что по неизвестной причине у меня глючил EEPROM,а не про "известный аппарат-
ный глюк",а то я уже было испугался. sad.gif
А запись в нулевую ячейку вылечили еще в поздних ревизиях at90.
А что такое страничный адрес EEPROM?это-ж не пик.
IgorKossak
Цитата(WHALE @ Jun 15 2007, 07:26) *
А что такое страничный адрес EEPROM?это-ж не пик.

В современных ATmega EEPROM разделена на страницы с целью ускорения программирования внешними программаторами.
На программирование из программы страничность EEPROM никакого влияния не оказывает.
mdmitry
Цитата(WHALE @ Jun 15 2007, 08:26) *
А запись в нулевую ячейку вылечили еще в поздних ревизиях at90.

Это я и назвал известным глюком.
Выразился плохо про страничные адреса, извините crying.gif .
Делал запись по адресам кратным 0x100. Эффект описал ранее, использовались функции из библиотеки WinAvr соответствующей версии.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.