Оптимизация кода на С, PIC16.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Оптимизация кода на С, PIC16.

Сообщение Ghost in shell »

Наваял я код, и опечалился: ну больно громоздкий получился.

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

....
void k_ss (void) // часть обработки нажатия кнопок останова
{
DSX = 1;	// закрыть защелку (чтобы можно было нажать только 1 кнопку останова.)
TMR2ON = 0;	// выключить TMR2 (счет времени)
stTMR1();	// запуск 1 сек интервала
DST = 0;	// открыть защелку для k_st
}
.....
main()
....
if ((k_s1 == 0) && (DSX == 0))
	{
	N_knop = 1;	// запоминаем номер кнопки
	k_ss();
	}

if ((k_s2 == 0) && (DSX == 0))
	{
	N_knop = 2;	// запоминаем номер кнопки
	k_ss();
	}

if ((k_s3 == 0) && (DSX == 0))
	{
	N_knop = 3;	// запоминаем номер кнопки
	k_ss();
	}

if ((k_s4 == 0) && (DSX == 0))
	{
	N_knop = 4;	// запоминаем номер кнопки
	k_ss();
	}

if ((k_s5 == 0) && (DSX == 0))
	{
	N_knop = 5;	// запоминаем номер кнопки
	k_ss();
	}
основная проблема - чтобы при нажатии кнопки переменная принимала определенное значение. Но через if как-то... не очень. Линии порта подключены через резистор 4к7 на +5В. Кнопка садит линию на "массу".
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Оптимизация кода на С, PIC16.

Сообщение dosikus »

switch-case .
Реклама
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Re: Оптимизация кода на С, PIC16.

Сообщение asteroid7 »

Ghost in shell писал(а):Наваял я код, и опечалился: ну больно громоздкий получился...
Переменные с индексами удобнее представить как массив.

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

volatile char arr_k_s[ 5 ]; //volitale если в прерывании обновляется
...
for ( char i = 0; i < sizeof( arr_k_s ); i++ )
{
	if ( ( DSX == 0 ) && ( arr_k_s[ i ] == 0 ) )
	{
		N_knop = i;
		k_ss();
	}
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение Аlex »

switch-case
Не думаю что с ними код получится меньше, как скомпилированый (те же условные проверки), так и визуально (так же громозко). Да и в его варианте они не пойдут, т.к. проверяют они одну переменную на несколько значений, а у него наоборот - несколько переменных и одно значение.
удобнее представить как массив
А если у него k_s1-k_s5 - это выводы портов ?
Ghost in shell, у Вас есть повторяющиеся куски кода - "(DSX == 0)" и "k_ss()". Зачем их засовывать во все условия ? Вынесете их за пределы "основных" условий.

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

if (!DSX){

if (!k_s1){
   N_knop = 1;   // запоминаем номер кнопки
   }

if (!k_s2){
   N_knop = 2;   // запоминаем номер кнопки
   }

if (!k_s3){
   N_knop = 3;   // запоминаем номер кнопки
   }

if (!k_s4){
   N_knop = 4;   // запоминаем номер кнопки
   }

if (!k_s5){
   N_knop = 5;   // запоминаем номер кнопки
   }

k_ss();
}
Если k_s1...5 это биты переменной/порта и идут подряд, то можно заюзать переменную, двигать в ней еденицу/ноль и использовать её как маску. Тогда "фокусы" с циклом прокатят.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение urry »

я бы добавил, что по Вашей логике, сброс
DST = 0; // открыть защелку для k_st
нужно делать в прерывании 1 таймера, а не сразу.
Реклама
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Оптимизация кода на С, PIC16.

Сообщение Ghost in shell »

А если у него k_s1-k_s5 - это выводы портов ?
Да, это линии (выводы) портов.
Да и в его варианте они не пойдут, т.к. проверяют они одну переменную на несколько значений, а у него наоборот - несколько переменных и одно значение.
У меня одна переменная и несколько значений - номера кнопок.
у Вас есть повторяющиеся куски кода - "(DSX == 0)" и "k_ss()". Зачем их засовывать во все условия ? Вынесете их за пределы "основных" условий.
"DSX == 0" — "защелка", чтобы можно было нажать только одну кнопку из 5. А "k_ss()" - функция-обработчик нажатия кнопки. Она отрабатывает только 1 раз. Т.е. в ППОП (подпрог. обраб. прерываний) ее не поставишь.

С switch я написал так:

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

switch (PORTA)
	{
	case (0b000010):
		N_knop = 1;
		break;
	case (0b000100):
		N_knop = 2;
		break;
	case (0b001000):
		N_knop = 3;
		break;
	case (0b010000):
		N_knop = 4;
		break;
	case (0b100000):
		N_knop = 5;
		break;
	}
но как заблокировать линии порта после 0 на любой из них? В каждом case добавить TRISA = 0b000001 ?
А в после нажатия кнопки "старт" - TRISA = 0b111110 ?

Откомпилил (PICC 8.05pl2) - switch занимает больше места, чем if. И это без защелок и k_ss(). Однозначно отпадает.
Последний раз редактировалось Ghost in shell Вт июн 07, 2011 17:07:48, всего редактировалось 1 раз.
Кот гуляет сам по себе, но вблизи холодильника.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение Аlex »

for тоже много будет времни выполняться.
Попрорбуйте сделать как я предложил, только немного по другому.

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

if (!DSX){

N_knop = 0;

if (!k_s1){
   N_knop = 1;   // запоминаем номер кнопки
   }

if (!k_s2){
   N_knop = 2;   // запоминаем номер кнопки
   }

if (!k_s3){
   N_knop = 3;   // запоминаем номер кнопки
   }

if (!k_s4){
   N_knop = 4;   // запоминаем номер кнопки
   }

if (!k_s5){
   N_knop = 5;   // запоминаем номер кнопки
   }

if(N_knop){
   k_ss();
}

}
Не понятно, Вы оптимизацию на что делаете ? На скорость или размер ? И нужна ли она Вам вообще, оптимизация эта ?
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Оптимизация кода на С, PIC16.

Сообщение Ghost in shell »

Не понятно, Вы оптимизацию на что делаете ? На скорость или размер ? И нужна ли она Вам вообще, оптимизация эта ?
На размер. Еще один оператор if вводить нехочу, ибо это увеличение hex на 0.03 килобайта. А при убирании защелок размер не изменяется.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение Аlex »

30 байт один if ? :shock: Что там в условии у него ? :shock:
Код, который я Вам предложил, будет занимать меньше Вашего. Можно попробовать с циклом и маской, но не думаю что будет компактнее. Хотя надо пробовать....
На АСМе можно сделать компактнее.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение urry »

Пропоную не перейматись.
На фоні, власне кажучи, незадовільного протоколу обробки клавіш - ці 30 байт - ні богу свічка, ні чорту кочерга.
Ні на що не впливають і ні від чого не збавляють.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение Аlex »

Это что сейчас было ? :shock: :shock: :shock:
А по Русски можно ? :P
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Оптимизация кода на С, PIC16.

Сообщение urry »

Я предложил ТС не искать лишние несколько байт, а акцентировать внимание на правильном протоколе обработки клавиш.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Оптимизация кода на С, PIC16.

Сообщение Ghost in shell »

Пропоную не перейматись.
На фоні, власне кажучи, незадовільного протоколу обробки клавіш - ці 30 байт - ні богу свічка, ні чорту кочерга.
Ні на що не впливають і ні від чого не збавляють.
Перево с украинского: :))
Предлагаю не беспокоиться.
На фоне, собственно говоря, неудовлетворительного протоколу обработки клавиш - эти 30 байт - ни богу свечка, ни черту кочерга.
Ни на что не влияют и ни от чего не избавляют.
Кот гуляет сам по себе, но вблизи холодильника.
Аватара пользователя
Ghost in shell
Держит паяльник хвостом
Сообщения: 936
Зарегистрирован: Пн июн 15, 2009 06:01:38
Откуда: USSR

Re: Оптимизация кода на С, PIC16.

Сообщение Ghost in shell »

Я предложил ТС не искать лишние несколько байт, а акцентировать внимание на правильном протоколе обработки клавиш.
Да мне бы в 2048 байт уложиться! Чтобы запас был, на случай чего-то поменять.
На АСМе можно сделать компактнее.
Асм не освоить за 3 месяца. И он не кроссплатформенный.
30 байт один if ? :shock: Что там в условии у него ? :shock:
:oops: не спрашивайте... Сплошной позор. Но уже допер, как выкинуть из кода. :oops:
Кот гуляет сам по себе, но вблизи холодильника.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»