|
CVAVR struct EEPROM copy struct SRAM |
|
|
|
Jun 11 2007, 08:44
|
Частый гость
 
Группа: Свой
Сообщений: 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; Приходится объявлять два "почти одинаковых" типа  Ну да ладно ... смирирился .. продолжаю. Код 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 вырастает в такую хучу кода ...
|
|
|
|
|
Jun 11 2007, 09:00
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 11 2007, 10:08
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 11 2007, 11:41
|

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

|
Увы,у CV большие проблемы в работе с EEPROM  Если вы посмотрите хэлп,то увидите,что практически все библиотечные фукции определены только для данных,лежаших во флеш и рам,а с епром приходится руками работать.Хотя можно доствточно быстро наклеать самописных.)Сответственно,и работа со структурами в EEPROM-дело не для слабонервных. З.Ы. дык если они пишут,что пофиксили баг с доступом в версии 1.25.4,почему не работает в 1.25.5? З.З.Ы. 2 Сергей Борщ в CV в определении структуры надо явно указывать ее тип,а такое опреде ление он понимает как структруру в раме и при определении обьектов структуры еепром ругается на несовпадение типов.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jun 11 2007, 13:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 11 2007, 15:32
|

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

|
Цитата(Сергей Борщ @ Jun 11 2007, 17:10)  Тогда пожалуй прав AndryG: (AndryG @ Jun 11 2007, 12:14) может точно в WinAvr переползти ... и нафиг этот cv. Ну вот опять-сразу голову рубить  Может,усы сбрить будет достаточно? Конвенцию это не нарушает,т.к.стандарт С про разные типы памяти,ессно,ни сном ни духом. Соответственно,это 100% особенности реализации конкретного компилятора. Имхо,в CV это сделано логично-без спецификатора типа памяти он по дефолту считает,что работает с ОЗУ,т.е. по стандарту. И опять имхо,а как по другому-указатель на данные в рам и например,во флэш действительно должны иметь разные типы.  З.Ы. Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа? Структуры ведь обычно используют для обьединения в единое целое данных разных типов В вашем случае,имхо,массив лучше подойдет.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jun 11 2007, 17:17
|

Гуру
     
Группа: Модераторы
Сообщений: 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)  З.Ы. Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа? Структуры ведь обычно используют для обьединения в единое целое данных разных типов В вашем случае,имхо,массив лучше подойдет. Вообще-то структуры используют для группирования именованных данных независимо от типа, чтобы потом обращаться к этим данным по осмысленному имени а не по загадочному индексу массива, так что тут автора понять можно. Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 11 2007, 17:34
|

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

|
Цитата(Сергей Борщ @ Jun 11 2007, 21:17)  Правда насчет WinAVR можно немного расстроить автора - он вообще прохо представляет что такое флеш и eeprom, поэтому там доступ к данным ф флеш и eeprom делается вручную с помощью функций чтения/записи байта/слова Вы меня утешили -не так плох CV,как его малюют 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
|
|
|
|
|
Jun 11 2007, 17:44
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

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

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

|
Цитата(singlskv @ Jun 11 2007, 21:44)  И ИМХО, это правильно, особенно в части записи, потому что не дает ложного представления о том, что запись в eeprom/flash это просто присвоение значения одной переменной другой которое выполняется за пару тактов. Дык это просто нужно знать-что запись в епром занимает примерно милисекунду и компилируется в несколько атомарных ассемблерных команд. Но с точки зрения логики программы это действительно "просто присвоение значения одной переменной другой",a=b,и зачем тут лишние телодвижения?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jun 11 2007, 18:42
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(WHALE @ Jun 11 2007, 22:14)  Дык это просто нужно знать-что запись в епром занимает примерно милисекунду и компилируется в несколько атомарных ассемблерных команд. ну во-первых, насколько я ничего не помню, в худшем случае это 3,5ms Цитата Но с точки зрения логики программы это действительно "просто присвоение значения одной переменной другой",a=b,и зачем тут лишние телодвижения? во-вторых, во время этого "простого" присвоения проц весит в никому не нужном цикле while, вместо того что бы заниматься какой-нибудь полезной работой. Например представте себе что нужно с частотой 1-10KHz опрашивать порты и после этого делать какие-то сложные вычисления (типа многоканальный частотомер, итд), а еще нужно время от времени писать что-то в eeprom. Ну и как Вы представляете реализацию этого с помощью "просто присвоение" ? P.S. Да, чтобы никто не начал расказывать мне про то, что это (опрос портов и вычисления) можно сделать в прерывании, сразу же замечу что сложные вычисления занимают примерно 80% процессорного времени...
|
|
|
|
|
Jun 12 2007, 06:24
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Ух! Как обычно на этом форуме ... хоть вопрос и иссяк, но его выдавливают по полной  Цитата З.Ы. дык если они пишут,что пофиксили баг с доступом в версии 1.25.4,почему не работает в 1.25.5? У меня на сегодня 1.25.2 есть ... читал ... что 1.25.5 ломается криво ... видать придется точно не выделываться и перейти на массивы. Цитата Уважаемый аффтар,а нафига вам ваще структура,вы ведь размещаете в ней данные одного типа? Да потому что надоело с индексами крутится таблиц  А тут у меня таблицы таблиц получаются, да еще разных размеров ... и т.д. и т.п. Ну типа ячейка данных еепром(h,m,s,d), которая ходит по RS-232 в пакете (head,h,m,s,d,crc) ... а в памяти лежит в еще более развернутом виде ... короче решил не путаться в индексах "копируем с индекса 2 в 4 5штук" и т.д.  (про #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
|
|
|
|
|
Jun 12 2007, 06:35
|

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

|
Вы будете смеяться,но В CV это реализовано именно с помощью простого присвоения char a=5; eeprom char b; b=a; Все что вы написали,абсолютно верно,только имхо,все это нужно просто держать в уме. З.Ы. Последние посты уже откровенный оффтоп и религиозная война-я предлагаю прекратить,пока че-нить от модеров не огребли.  Первым начал я -извиняюсь,вчера немного праздновали.  З.З.ЫПока писал-пропустил пост аффтара. Могу вам сбросить 1.25.5-никмких проблем с взломом нет.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|