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

 
 
2 страниц V   1 2 >  
Closed TopicStart new topic
> CVAVR struct EEPROM copy struct SRAM
AndryG
сообщение Jun 11 2007, 08:44
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Доброго времени суток.

В еепром хранится массив записей.
Нужно определить в 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2007, 09:00
Сообщение #2


Гуру
******

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



Цитата(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 не работаю.


--------------------
На любой вопрос даю любой ответ
"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
AndryG
сообщение Jun 11 2007, 09:14
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Не проходит такой простой вариант - пробовал ... ругается на разные типы ... может точно в WinAvr переползти ... и нафиг этот cv.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2007, 09:31
Сообщение #4


Гуру
******

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



Цитата(AndryG @ Jun 11 2007, 12:14) *
Не проходит такой простой вариант - пробовал ... ругается на разные типы ... может точно в WinAvr переползти ... и нафиг этот cv.
Телепаты в это время года обычно в отпуске. Приведите код, на который ругается и полное сообщение об ошибке. Такая конструкция должна работать независимо от компилятора. Скорее всего ругается на что-то другое.


--------------------
На любой вопрос даю любой ответ
"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
AndryG
сообщение Jun 11 2007, 10:08
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Про телепатов я в курсе ...
Код
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

Сообщение отредактировал AndryG - Jun 11 2007, 09:49
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jun 11 2007, 11:41
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Увы,у CV большие проблемы в работе с EEPROM sad.gif Если вы посмотрите хэлп,то увидите,что практически
все библиотечные фукции определены только для данных,лежаших во флеш и рам,а с епром приходится руками работать.Хотя можно доствточно быстро наклеать самописных.)Сответственно,и работа со структурами в EEPROM-дело не для слабонервных.
З.Ы. дык если они пишут,что пофиксили баг с доступом в версии 1.25.4,почему не работает в 1.25.5?
З.З.Ы. 2 Сергей Борщ в CV в определении структуры надо явно указывать ее тип,а такое опреде
ление он понимает как структруру в раме и при определении обьектов структуры еепром ругается на
несовпадение типов.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2007, 13:10
Сообщение #7


Гуру
******

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



Цитата(WHALE @ Jun 11 2007, 14:41) *
З.З.Ы. 2 Сергей Борщ в CV в определении структуры надо явно указывать ее тип,а такое определение он понимает как структруру в раме и при определении обьектов структуры еепром ругается на несовпадение типов.
Тогда пожалуй прав AndryG:
Цитата(AndryG @ Jun 11 2007, 12:14) *
может точно в WinAvr переползти ... и нафиг этот cv.


--------------------
На любой вопрос даю любой ответ
"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
WHALE
сообщение Jun 11 2007, 15:32
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(Сергей Борщ @ Jun 11 2007, 17:10) *
Тогда пожалуй прав AndryG:

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

Ну вот опять-сразу голову рубить sad.gif Может,усы сбрить будет достаточно? smile.gif
Конвенцию это не нарушает,т.к.стандарт С про разные типы памяти,ессно,ни сном ни духом.
Соответственно,это 100% особенности реализации конкретного компилятора.
Имхо,в CV это сделано логично-без спецификатора типа памяти он по дефолту считает,что работает с
ОЗУ,т.е. по стандарту.
И опять имхо,а как по другому-указатель на данные в рам и например,во флэш действительно должны
иметь разные типы. unsure.gif
З.Ы. Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа?
Структуры ведь обычно используют для обьединения в единое целое данных разных типов cranky.gif
В вашем случае,имхо,массив лучше подойдет.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 11 2007, 17:17
Сообщение #9


Гуру
******

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



Цитата(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 делается вручную с помощью функций чтения/записи байта/слова


--------------------
На любой вопрос даю любой ответ
"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
WHALE
сообщение Jun 11 2007, 17:34
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(Сергей Борщ @ 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];
и потом работаем действительно непосредственно с именами,без всяких дополнительных имен с точками и стрелочками.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 11 2007, 17:44
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Сергей Борщ @ Jun 11 2007, 21:17) *
Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова

И ИМХО, это правильно, особенно в части записи, потому что не дает ложного
представления о том, что запись в eeprom/flash это просто присвоение значения одной
переменной другой которое выполняется за пару тактов.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jun 11 2007, 18:14
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



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

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


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 11 2007, 18:42
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



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

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

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

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

P.S. Да, чтобы никто не начал расказывать мне про то, что это (опрос портов и вычисления) можно
сделать в прерывании, сразу же замечу что сложные вычисления занимают примерно 80%
процессорного времени...
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jun 12 2007, 06:24
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Ух! Как обычно на этом форуме ... хоть вопрос и иссяк, но его выдавливают по полной 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)"

Сообщение отредактировал AndryG - Jun 12 2007, 06:26
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jun 12 2007, 06:35
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Вы будете смеяться,но В CV это реализовано именно с помощью простого присвоения
char a=5;
eeprom char b;
b=a;
Все что вы написали,абсолютно верно,только имхо,все это нужно просто держать в уме.
З.Ы. Последние посты уже откровенный оффтоп и религиозная война-я предлагаю прекратить,пока
че-нить от модеров не огребли. sad.gif Первым начал я -извиняюсь,вчера немного праздновали. smile.gif
З.З.ЫПока писал-пропустил пост аффтара. Могу вам сбросить 1.25.5-никмких проблем с взломом нет.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 20:28
Рейтинг@Mail.ru


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