Страница 2 из 2

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 08:40:46
ИС-пытатель
Вот привожу мой кусок, который касается памяти...
Спойлер

Код: Выделить всё

#define max_adress		(5*(Pos_Ctrl+1))		// Максимальный адрес для записи = количество групп ячеек * размер группы

#define Pos_min		0			// Смещения сохраненных значений в ЕЕПРОМ
#define Pos_chas	1
#define Pos_sut		2
#define Pos_Likv	3
#define Pos_Ctrl	4

#define Ctrl		0xAA		// Контрольное значение. не м.б. равно 0xFF и 0x00

#define EE_read(adress, x) \
while(EECR & (1<<EEWE));						/*Ждать завершения предыдущей записи*/ \
EEARL = (adress); \
EECR |= (1<<EERE);								/*Выполнить чтение*/ \
x = EEDR

#define EE_write(adress, x) \
while(EECR & (1<<EEWE));						/*Ждать завершения предыдущей записи*/ \
EEDR = (x); \
EEARL = adress; \
asm ("cli"); \
EECR |= (1<<EEMWE);								/*Установить флаг EEMWE*/ \
EECR |= (1<<EEWE);								/*Начать запись в EEPROM*/ \
asm ("sei")

#define EE_Proverka(x, y) \
EE_read ((OFFset + (x)), temp);				/* Прочитаем записанное значение */ \
if (temp != (y))							/* Если оно не равно тому, что писали */ \
{											/* Запишем в следующую группу */ \
	OFFset += Pos_Ctrl + 1;								\
	if (max_adress == OFFset)	OFFset = 0;				\
	if (OFFset == OLD_OFFset)					\
	{											\
		Flags.No_write = da;					\
		goto out;								\
	}											\
	goto back;									\
}

#define EE_SAVE \
if (Flags.No_write == net)									\
{														\
	__label__ back, out;									\
	OLD_OFFset = OFFset;								\
	back:													\
	EE_write ((OFFset + Pos_min), minuti);				/* Запишем новое значение минут в ЕЕПРОМ */ \
	EE_Proverka (Pos_min, minuti)						\
	EE_write ((OFFset + Pos_chas), chasi);				/* Запишем новое значение часов в ЕЕПРОМ */ \
	EE_Proverka (Pos_chas, chasi)						\
	EE_write ((OFFset + Pos_sut), sutki);				/* Запишем новое значение суток в ЕЕПРОМ */ \
	EE_Proverka (Pos_sut, sutki)						\
	EE_write ((OFFset + Pos_Likv), Likv);				/* Запишем новое значение времени Likv в ЕЕПРОМ */ \
	EE_Proverka (Pos_Likv, Likv)						\
	EE_write ((OFFset + Pos_Ctrl), Ctrl);				/* Запишем контрольное значение, по текущему смещению */ \
	EE_Proverka (Pos_Ctrl, Ctrl)						\
	if (0 < OLD_OFFset) {EE_write ((OLD_OFFset - 1), 0xFF);}		/* Делаем старое значение недействительным */ \
	OFFset += Pos_Ctrl + 1;										/* Устанавливаем смещение на следующий адрес */ \
	if (max_adress == OFFset) OFFset = 0;						\
	out: 													\
;	}
Саму запись осуществляю так:

Код: Выделить всё

void EE_save (void)				// Функция сохранения значений времен
{
	EE_SAVE;
}
Запись осуществляется только по младшим адресам памяти, поэтому старший регистр адресов не использую. В программе при записи контрольного значения в первую группу ячеек памяти (начальный адрес смещения 0) также записывается контрольное значение в середину памяти (значение адреса 0xFF), т.е. как бы в конец ее при условии использования только младшего регистра адресов, как у меня. Переменные объявлены как глобальные.

А если убрать проверку записи, то начинает затирать ячейки нулями... ((

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 10:27:15
AndyKorg
ИС-пытатель писал(а):... запись в память .... в новую группу ячеек с затиранием старой группы.....
Реализация как раз такого алгоритма выполнена у меня в часах http://radiokot.ru/circuit/digital/home/199/ Файлы eeprom.c и eeprom.h в исходниках. Все прекрасно работает.

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 10:41:09
ИС-пытатель
Ну, вот КОТ. Если где я не правильно что-то написал - тыкните меня носом - и я удалю тему.

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 14:30:16
Kavka
ИС-пытатель писал(а):Запись осуществляется только по младшим адресам памяти, поэтому старший регистр адресов не использую.
Сразу, с ходу - "The initial value of EEAR is undefined. A proper value must be written before the EEPROM may be accessed."
Ты EEARH хоть раз записываешь? Однако, ноль туда надо записать.

"АВР студио 6 - говно. Всем успехов."
Афигеть, каких "умных" людей вы в пример приводите. Если бы автор ролика знал, что студия отдельно, а компилятор отдельно, то сказал бы про компилятор и версию оного озвучил. А не поленился бы, то и листинг дизассемблерный привёл с ошибкой.
А так можно по неправильному пути двигаться. Например. У меня вот линукс, а у него винда. У меня всё компилируется как надо, а у него нет. Вывод - винда г....??? :twisted: :kill:

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 18:16:14
ИС-пытатель
Ноль при инициализации записываю.

Винда - говно - совершенно правильный вывод! :)))

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 18:29:34
Goodefine
Давно не видел такого хренового, мягко говоря кода. Макросы (нафига они вместо функций загадка века.. наверное чтоб невозможно было отлаживаться... или не смогли с goto разобраться, из функции в функцию?) не отличимы от переменных и функций. Если не записался один параметр переписывается вся группа а не проблемное число. Зачем? Goto... Функция проверки записи через *опу...

Код: Выделить всё

...
if (temp != (y))
{
 OFFset += Pos_Ctrl + 1;
   if (max_adress == OFFset)   OFFset = 0;
   if (OFFset == OLD_OFFset)...
Нафига это в проверке записи вообще? Типа неправильно пишется, значит eeprom неисправно и будем писать в другую область? Правильно делается так - запись в eeprom делается один раз при выключении, и то если значение в ячейке не совпадает с записываемым, никто туда не пишет периодически. В крайнем случае при изменении пользовательских параметров. Одни производители магнитол уже запоминали громкость при каждом ее изменении и через пяток лет до дыр затирали память.
Если вся программа в том же духе, не удивлюсь что все работает через пень колоду.
В данный момент, запись идет циклически в пять групп, в конце каждой дописывается 170 (0xAA), затем следующим циклом (когда офсет становиться больше нуля) число 170 перед текущей группой затирается. Т.е. фактически происходит смена числа 170/255, находящегося между группами. А у вас что делает приведенный вариант?

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 18:54:04
ARV
когда что-то делаешь, надо владеть инструментом, которым делаешь. это касается всего - от ковыряния пальцем в носу до написания программ. неумелым пальцем можно из носа и мозги достать :)))

в WinAVR или же AVR Toolchain есть готовые библиотечные функции для работы с EEPROM - проверенные, отлаженные, документированные. изобретение велосипеда хорошо только в виде развлечения, а если надо доехать - лучше взять готовый. рекомендую.

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 19:48:37
ИС-пытатель
Goodefine писал(а):Давно не видел такого хренового, мягко говоря кода... бла-бла-бла
Запись в память выполняется вызовом функции. Макросы нужны для удобочитаемости кода, исключения ошибок и повторения одних и тех же участков. В стандартной библе тоже все через макросы организовано. Так что ничего ужасного у меня нет. При инициализации проверяется контрольное число в конце каждой из групп по порядку, пока не будет совпадения. Поскольку групп всего пять, то после отсутствия 5 совпадений, присваивается значение по умолчанию. 5 групп сделано для уменьшения нагрузки на ячейку памяти, если бы использовалась только одна группа, а также для осуществления надежности в сохранении промежуточных значений минут, часов и суток (для этого должно быть как минимум две группы. сначала идет запись в следующую группу, затем стирание контрольного значения предыдущей).
Если не записался один параметр переписывается вся группа а не проблемное число.
Если ячейка нае..нулась, то ее хоть сто раз перезапиши - она не оживет (хотя есть вариант при повторной попытке получить нужное значение, но проще записать следующую группу). К тому же это сделано для упрощения кода, чтобы не делать 2-3 попытки перезаписи.
Одни производители магнитол уже запоминали громкость при каждом ее изменении и через пяток лет до дыр затирали память.
Это защита от наводок, в результате которых контроллер может сбросится, не успев записать текущее значение времени. Так как устройство будет работать не больше 40 суток, то данный подход оправдан и более надежен, чем запись по факту пропадания питания.
Нафига это в проверке записи вообще?
А это как раз для ограничения участка памяти в 5 групп.
затем следующим циклом (когда офсет становиться больше нуля)
совсем не так. Сначала записывается следующая группв, затем затирается значение предыдущей. Если смещения соответствует первой группе - то затирания последней не происходит, т.к. не имеет смысла (при рестарте проверка идет по порядку, начиная с первой группы).
Goodefine писал(а):Давно не видел...

Хотелось бы на Ваш код посмотреть и поржать.
ARV писал(а):изобретение велосипеда хорошо только в виде развлечения, а если надо доехать - лучше взять готовый. рекомендую.
Я мазохист и не доверяю библиотекам, написанным "чужими" руками. )))


P.S. Всем спасибо! Студия 6.1 последнего обновления все прекрасно скомпилировала. )) Ошибок замечено не было. пока не было. )

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 20:02:23
Goodefine
ИС-пытатель писал(а): Я мазохист и не доверяю библиотекам, написанным "чужими" руками. )))
Не знаю как мазохист, но писать код вы совершенно не умеете. Приведен классический образец говнокода, квинтэссенция так сказать...

ЗЫ. Хотите мой код, смотрите:
http://cxem.net/comp/comp109.php
http://radiokot.ru/circuit/digital/game/02/
http://cxem.net/avto/electronics/4-91.php
Хватит?
При желании можете еще найти и смеяться до упаду.

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 20:17:53
ИС-пытатель
Я что-то не понял, чем Ваш код 3,14здатей моего? )) Тем, что макросы написаны заглавными буквами? (Да, да, они у Вас тоже есть!) )) Так это дело привычки. ) Вы по одним книжкам учились, я по другим. ) Вопрос в том, что Вы в силу привычки не можете разобрать ни один код, кроме своего, а я могу сориентироваться в любом (это говорит больше о моей универсальности, чем о Вашем умении написания кода). ) А то, что Вы с первого раза не въехали в мой код.. так прочтите второй раз! )) И вообще интересно, что Вы считаете за умение писать код? Писать так, чтобы было понятно Вам? :dont_know: )) В общем, спасибо за Ваши положительные отзывы и удачи Вам в Ваших проектах. ;)
квинтэссенция так сказать...
P.S.http://ru.wikipedia.org/wiki/%D0%9A%D0% ... 0%B8%D1%8F
Спасибо за комплимент! ;)

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 22:03:44
Goodefine

Код: Выделить всё

Тем, что макросы написаны заглавными буквами? (Да, да, они у Вас тоже есть!) )) 
Хотя бы этим. Макросы пишутся в определенных случаях и по определенным правилам, они не заменяют функций, у них другое предназначение. А на самом деле многим, хоть и далеко не идеал, очень далеко. Имеющий глаза да увидит, объяснять не буду.

Код: Выделить всё

Вопрос в том, что Вы в силу привычки не можете разобрать ни один код, кроме своего, а я могу сориентироваться в любом (это говорит больше о моей универсальности, чем о Вашем умении написания кода). )
Я не знаю в чем Вы можете ориентироваться, но в простейших ситуациях начинаете грешить на компилятор, среду, на что угодно. Это говорит, что нужно уметь ориентироваться хотя бы в своем коде.
А то, что Вы с первого раза не въехали в мой код.. так прочтите второй раз! ))
Это где я не въехал? Тут что ли:
совсем не так. Сначала записывается следующая группв, затем затирается значение предыдущей. Если смещения соответствует первой группе - то затирания последней не происходит, т.к. не имеет смысла (при рестарте проверка идет по порядку, начиная с первой группы).
Так я про это и говорил, только вынес в главное не циклическую перезапись, а то что значение 0xAA меняется периодически на 0xFF. Там же чнго то затиралось у Вас невпопад. Запись самих групп это само собой разумеющееся.
И вообще интересно, что Вы считаете за умение писать код? Писать так, чтобы было понятно Вам?
Хороший код - это код без лишних сущностей, однозначно понятный, легко сопровождаемый и не менее легко портируемый на другие платформы. Чтобы этого достичь, или приблизится к этому нужно следовать определенным правилам при его написании. Это понимание приходит только с опытом. Гибкость конструкций позволяет писать как ужасный, так и хороший код, но только потом постепенно приходит понимание, что есть зло, а что добро. Придет и к Вам. Потом. Может быть.
В общем, спасибо за Ваши положительные отзывы и удачи Вам в Ваших грандиозных проектах. ;)
И Вам не хворать :beer:

Re: Подскажите нормальный компилятор.

Добавлено: Пн июн 02, 2014 22:12:22
ИС-пытатель
Ув. модераторы! Закройте, пожалуйста, тему! Не хочу больше спорить. )