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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Вот привожу мой кусок, который касается памяти...
Спойлер

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

#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), т.е. как бы в конец ее при условии использования только младшего регистра адресов, как у меня. Переменные объявлены как глобальные.

А если убрать проверку записи, то начинает затирать ячейки нулями... ((
Последний раз редактировалось ИС-пытатель Пн июн 02, 2014 10:31:32, всего редактировалось 1 раз.
Реклама
Встал на лапы
Сообщения: 93
Зарегистрирован: Пт янв 07, 2011 08:52:08
Откуда: Санкт-Петербург

Сообщение AndyKorg »

ИС-пытатель писал(а):... запись в память .... в новую группу ячеек с затиранием старой группы.....
Реализация как раз такого алгоритма выполнена у меня в часах http://radiokot.ru/circuit/digital/home/199/ Файлы eeprom.c и eeprom.h в исходниках. Все прекрасно работает.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Ну, вот КОТ. Если где я не правильно что-то написал - тыкните меня носом - и я удалю тему.
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

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

"АВР студио 6 - говно. Всем успехов."
Афигеть, каких "умных" людей вы в пример приводите. Если бы автор ролика знал, что студия отдельно, а компилятор отдельно, то сказал бы про компилятор и версию оного озвучил. А не поленился бы, то и листинг дизассемблерный привёл с ошибкой.
А так можно по неправильному пути двигаться. Например. У меня вот линукс, а у него винда. У меня всё компилируется как надо, а у него нет. Вывод - винда г....??? :twisted: :kill:
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Ноль при инициализации записываю.

Винда - говно - совершенно правильный вывод! :)))
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение 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, находящегося между группами. А у вас что делает приведенный вариант?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

когда что-то делаешь, надо владеть инструментом, которым делаешь. это касается всего - от ковыряния пальцем в носу до написания программ. неумелым пальцем можно из носа и мозги достать :)))

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

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

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


P.S. Всем спасибо! Студия 6.1 последнего обновления все прекрасно скомпилировала. )) Ошибок замечено не было. пока не было. )
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Сообщение Goodefine »

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

ЗЫ. Хотите мой код, смотрите:
http://cxem.net/comp/comp109.php
http://radiokot.ru/circuit/digital/game/02/
http://cxem.net/avto/electronics/4-91.php
Хватит?
При желании можете еще найти и смеяться до упаду.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

Сообщение Goodefine »

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

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

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

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

Сообщение ИС-пытатель »

Ув. модераторы! Закройте, пожалуйста, тему! Не хочу больше спорить. )
Ответить

Вернуться в «AVR»