Проблема с еепром 24С08

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а): Можно ли как то написать оптимальнее? Чтоб проц быстрее обработал команду с пульта?
И еще вопрос сколько тактов приблизительно потребуется на исполнение этого кода?
Ответ на Ваши вопросы только один Asm! В нем можно рассчитать и количество тактов на выполнение проги. "Си" содержит универсальные функции, что неизбежно приводит к избыточности кода.
Реклама
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

"И еще вопрос сколько тактов приблизительно потребуется на исполнение этого кода?"
Рассчитать количество тактов в плавающем условии невозможно!
Последний раз редактировалось __Oleg__ Вт окт 23, 2012 21:21:08, всего редактировалось 1 раз.
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

так что получается оператор switch{} быстрее будет работать чем if{} ?

Я почему то думал наоборот...
У меня компилятор получается генерит меньше код

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

if{}
if{}
if{}
чем;

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

switch()
{
case 0:
break;
case 1:
break;
case 2:
break;
}
default:
А разве скорость исполнения кода не имеет прямую зависимость размеру кода?
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а): А разве скорость исполнения кода не имеет прямую зависимость размеру кода?
Далеко не всегда! Все дело в том, как выполняются переходы. Линейно или дискретно.
Да я извиняюсь, в вашем коде это не требуется, был невнимателен! :oops:
Последний раз редактировалось __Oleg__ Вт окт 23, 2012 21:28:45, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

__Oleg__ писал(а):
Далеко не всегда! Все дело в том, как выполняются переходы. Линейно или дискретно.
Спасибо за аргументирующие пояснения !

А все же как на ассемблере
выполнить сравнение?

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

if (x > y)
{

}

if (x>y && a<b)
{

}
проц применяю серии Atmega (ATMEL)
Реклама
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Вы имеете в виду пример кода?
Реклама
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Да :)

Просто не дружу я с ассемблером .... :(
тяжелый для понимания..
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Ща попробую соорудить! :o
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Вот вырезка из ассемблерного листинга:

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

;                       if (timer_ir >= MIN_DATA && timer_ir <= MAX_DATA) // короткий импульс высокого уровня
	CALL SUBOPT_0x4
	BRLO _0x87
	CALL SUBOPT_0x5
	BRSH _0x88
_0x87:
	RJMP _0x86
_0x88:
;                        {
;
;                         data_ir[2] |=1;
	__POINTW2MN _data_ir,2
	CALL SUBOPT_0x8
;                         timer_ir=0;
;
;                        }
;
;                       if (timer_ir >= MIN_DATA_2 && timer_ir <= MAX_DATA_2) // средний импульс высокого уровня
_0x86:
	CALL SUBOPT_0x6
	BRLO _0x8A
	CALL SUBOPT_0x7
	BRSH _0x8B
_0x8A:
	RJMP _0x89
_0x8B:
;                        {
;
;                          data_ir[3] |=1;
Что сказать..... нихрена мне непонятно .... :))

Визуально вроде оптимальный код...
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

"Что сказать..... нихрена мне непонятно .... :)) Визуально вроде оптимальный код..."
Н-да, насчет оптимальности надо искать код с меткой SUBOPT_0x6, SUBOPT_0x7. Т. е. Это есть нечто иное как подпрограммы. А обращение к ним и возврат из них стоят несколько тактов туда и несколько обратно. BRSH и BRLO - как раз и есть команды передачи управления после сравнения. В итоге мы наблюдаем прыжки с передачей управления подпрограммам, что мало похоже на оптимальность! Хотя в итоге объем кода может быть и меньше, а вот время исполнения...
А вообще, не надо путать машинный ASM с самописным. В машинном представлено в удобном виде для машины и мало понятном для человека.

к примеру
cpi R16, 0x30 - сравнение значения регистра R16 (переменная величина) с константой - по человечески
cpi 0х80, 0x30 - (по машинному)
где легче разобраться ?
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

__Oleg__ писал(а): А вообще, не надо путать машинный ASM с самописным. В машинном представлено в удобном виде для машины и мало понятном для человека.

к примеру
cpi R16, 0x30 - сравнение значения регистра R16 (переменная величина) с константой - по человечески
cpi 0х80, 0x30 - (по машинному)
где легче разобраться ?
Легче конечно в первом примере разобраться :)

А как сравнить две переменных со значением? if (x>a && y<b) {}
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

А скажите пожалуйста, какой код будет быстрее?

Я сейчас использую 6шт. 8 битных переменных unsigned char

но использую еще счетчик битов которым я считаю биты так:

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

if (cnt_bit < 8)
{
  data0=<<1;
}

if (cnt_bit > 8 && cnt_bit <= 16)
{
  data1=<<1;
}

.................
.............
........

if (cnt_bit > 40 && cnt_bit < 49)
{
  data5=<<1;
}

cnt_bit++;
Или лучше создать 32битную переменную + 16битную переменную
и использовать тоже счетчик?

мне надо как можно лучше оптимизировать по скорости исполнения кода.

И еще вопрос:

какой код быстрее?

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

if (x>25)
или

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

if (x>=26)
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а):А скажите пожалуйста, какой код будет быстрее?

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

if (cnt_bit < 8)
{
  data0=<<1;
}

if (cnt_bit > 8 && cnt_bit <= 16)
{
  data1=<<1;
}

.................
.............
........

if (cnt_bit > 40 && cnt_bit < 49)
{
  data5=<<1;
}

cnt_bit++;
Или лучше создать 32битную переменную + 16битную переменную
и использовать тоже счетчик?

мне надо как можно лучше оптимизировать по скорости исполнения кода.
if cnt_bit < 8, а если cnt_bit = 8

Группу последовательных сравнений мыже уже обсуждали выше :shock:
А вот переменные свыше 8bit, если важна скорость лучше непользовать, это уже будут использоваться дополнительные ("довольно тяжелые") библиотеки Си. :kill:

Artos писал(а):И еще вопрос:

какой код быстрее?

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

if (x>25)
или

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

if (x>=26)
С точки зрения ASM разницы практически нет :solder:
Последний раз редактировалось __Oleg__ Ср окт 24, 2012 11:41:35, всего редактировалось 1 раз.
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а): А как сравнить две переменных со значением? if (x>a && y<b) {}
Поочереди конечно. Там есть оператор сравнения двух регистров.
Аватара пользователя
__Oleg__
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн окт 01, 2012 22:47:39

Re: Проблема с еепром 24С08

Сообщение __Oleg__ »

Artos писал(а):А скажите пожалуйста, какой код будет быстрее?

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

if (cnt_bit < 8)
{
  data0=<<1;
}

if (cnt_bit > 8 && cnt_bit <= 16)
{
  data1=<<1;
}

.................
.............
........

if (cnt_bit > 40 && cnt_bit < 49)
{
  data5=<<1;
}
Если поместить данный код в процедуру и в теле сравнений делать выход из процедуры "if ( cnt_bit <= 8 ) { data0=<<1; return;}"
можно увеличить скорость за счет исключения следующих "if", а так же убрать избыточность кода исключив начиная со второй конструкции "if" первое условие cnt_bit > 8 && ... cnt_bit > 40 && как лишнее. :wink: И в итоге получаем аналог конструкции:

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

switch()
{
case 0:
break;
case 1:
break;
case 2:
break;
}
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Проблема с еепром 24С08

Сообщение Artos »

Как оказалось, проц успевает обработать команды. Увеличил разрешение таймера и проблема решилась! Сейчас команды ДУ четко проц захватывает и выполняет! :)
Ответить

Вернуться в «Периферия»