1-wire -> ПК реализация

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

мысли есть.
1. никогда не используйте никакую иную оптимизацию, кроме -Os
2. обязательно добавьте в опции компилятора -ffunction-sections
3. обязательно добавьте в опции линкера -Wl,-gc-sections (п.2 и 3 добавлять точно так, как здесь написано, без малейшей отсебятины)
4. разберитесь с типом параметров функций, типом возвращаемых ими значений - где нет нужды, не используйте int и другие типы со знаком.
5. не пишите бессмысленные и лишние команды и операторы "на всякий случай"
6. все функции, которые "больше никому не нужны", делайте static

ну, как-то так, для начала.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

OWI_Send_1 и OWI_Send_0 совместил в одну функцию, так добавилось еще 10 кб :))
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

OWI_Send_1 и OWI_Send_0 убрал как функции, они только из одного места выполсялись :)) Теперь 22кб нужно отваевать :kill:
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

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

1. никогда не используйте никакую иную оптимизацию, кроме -Os
Хорошо помогает

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

2. обязательно добавьте в опции компилятора -ffunction-sections
Толку 0

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

3. обязательно добавьте в опции линкера -Wl,-gc-sections
Хорошо помогает

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

4. разберитесь с типом параметров функций, типом возвращаемых ими значений - где нет нужды, не используйте int и другие типы со знаком.
То есть заместо char писать unsigned char? Я думал они одного размера!

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

5. не пишите бессмысленные и лишние команды и операторы "на всякий случай"
PORTB &= ~_BV(PB1); оставил один раз, или вообще убрать, там по-умочанию 0?

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

6. все функции, которые "больше никому не нужны", делайте static 
То есть?

Ну в общем пока еще и место осталось, пройдусь ка по функциям внимательно...
Реклама
Эиком - электронные компоненты и радиодетали
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

-ffunction-sections работает в паре с -Wl,-gc-sections и никак иначе, поотдельности эти опции бесполезны. вторая иногда помогает и сама по себе, но в паре лучше.

в другой теме я вам уже давал ответ по поводу БИТОВОГО типа - потрудитесь прочесть хотя бы его, если уж на чтение справочника по языку Си вас не хватает.

по поводу static - см. выше: букварь по Си вам поможет. нельзя писать программы, не удосужившись даже разобраться с языком, на котором пишите. во всяком случае по поводу ключевых слов языка надо не на форуме спрашивать, а сразу в справочник лезть.

что касается знаковых типов, то char и unsigned char одного размера, но вот некоторые математические операции с ними будут порождать совершенно разный объем кода. еще хуже с int и unsigned int может быть ситуация
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Про бит уже видил, и книжку листаю, только она кажись так себе, дезинформирует :)

Мда, опыт великая штука...
Отжал 200байт :)
Статик я так думал это для переменных, что бы создать переменную глобально, но только для данной функции, как оно влияет на функцию? Функция итак объявляется в глобальном окружении... Будем искать еще мануалы
Реклама
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

От статик размер увеличивается
Компилятор ругается что я main объявил как void, коме он результат передать пытается?
Фиг с ним или вернуть?
Последний раз редактировалось danger3466 Вт дек 27, 2011 09:51:47, всего редактировалось 1 раз.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

последний раз вам напоминаю: все данные ранее советы надо применять одновременно. один вычеркните - и результат будет не тот. есть еще некоторые советы по оптимизации, но покуда из этого вы не научитесь выжимать все возможное - смысла рассказывать о них нет.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Мастер Ломастер писал(а):последний раз вам напоминаю: все данные ранее советы надо применять одновременно. один вычеркните - и результат будет не тот. есть еще некоторые советы по оптимизации, но покуда из этого вы не научитесь выжимать все возможное - смысла рассказывать о них нет.
Так я все сделал! Делал по порядку и смотрел на эффект и так до конца дошел где статик, но эффект после статик обратный
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Makefile дать в доказательство? :)
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Имеется в виду если функция используется всего один раз?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

че у вас за кодировка в файлах - русские комменты кракозямбами и не могу понять, какую кодировку выбрать...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Мастер Ломастер писал(а):че у вас за кодировка в файлах - русские комменты кракозямбами и не могу понять, какую кодировку выбрать...
UTF8
Я думал успел удалить сообщение, давай дам исходники, посмотрите, уже башка болит, в стимуляторе все вроде верно работает в железе читает сплошь 1, сначала думал что информация поступает, оказалось у функции скобки не поставил и он мне адрес функции читал :(
Там есть проект для VMLAB, только в исходниках я комментировал задержку в 800мс, что бы в стимуляторе долго не ждать
Вложения
ATtiny2313.zip
(4.4 КБ) 143 скачивания
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

показалось (или на самом деле?), что у вас в функции передачи бита перед тем, как установить уровень имеется задержка аж 10 микросекунд?! это зачем такое? передача бита должна делаться так:
1. давим линию в 0
2. ждем 1 мкс
3. устанавливаем в линии НУЖНЫЙ уровень
4. ждем дальше до конца тайм-слота

чтение чуть иначе.
но похоже, чтение верно сделано или близко к тому. позже посмотрю внимательнее
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Мастер Ломастер писал(а):показалось (или на самом деле?), что у вас в функции передачи бита перед тем, как установить уровень имеется задержка аж 10 микросекунд?! это зачем такое? передача бита должна делаться так:
1. давим линию в 0
2. ждем 1 мкс
3. устанавливаем в линии НУЖНЫЙ уровень
4. ждем дальше до конца тайм-слота

чтение чуть иначе.
но похоже, чтение верно сделано или близко к тому. позже посмотрю внимательнее
Попробую, спасибо что помогаете
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

danger3466 писал(а):Попробую, спасибо что помогаете
не пробуйте - я сбрехал. не могу сосредоточиться - нервы все... погодите маленько
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

НАШЕЛ!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Помните я использовал ваш код?
/*void OWI_Send_byte(unsigned char x){
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1) {
if(x & mask) {
OWI_Send_bit(1);
} else {
OWI_Send_bit(0);
}
}
}*/
void OWI_Send_byte(unsigned char command)
{
unsigned char data=command, i;
for(i=0;i<8;i++)
{
data=data<<7; //Сдвиг на i разрядов влево
command=command>>1; //Сдвиг передаваемого байта
if(data==0x80) OWI_Send_bit(1); //Передача лог.1
else OWI_Send_bit(0); //Передача лог.0
data=command; //Новое значение для сдвига
};
}
Вставил функцию из старого файла и заработало!
Аватара пользователя
danger3466
Встал на лапы
Сообщения: 135
Зарегистрирован: Ср дек 21, 2011 12:18:39

Re: 1-wire -> ПК реализация

Сообщение danger3466 »

Я кстати эту функцию вообще не понимаю, ох как я не любил дискретную математику...
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: 1-wire -> ПК реализация

Сообщение Мастер Ломастер »

danger3466 писал(а):Помните я использовал ваш код?
/*void OWI_Send_byte(unsigned char x){
unsigned char mask;
for(mask = 0x80; mask; mask >>= 1) {
if(x & mask) {
OWI_Send_bit(1);
} else {
OWI_Send_bit(0);
}
}
}*/
void OWI_Send_byte(unsigned char command)
{
unsigned char data=command, i;
for(i=0;i<8;i++)
{
data=data<<7; //Сдвиг на i разрядов влево
command=command>>1; //Сдвиг передаваемого байта
if(data==0x80) OWI_Send_bit(1); //Передача лог.1
else OWI_Send_bit(0); //Передача лог.0
data=command; //Новое значение для сдвига
};
}
Вставил функцию из старого файла и заработало!
дело в том, что направление сдвига у меня не такое, как у вас. я посмотрел на ваш код - там два сдвига, вот я взял первый - а он не тот, что надо... передавать-то биты надо от младшего к старшему, а не от старшего к младшему... т.е. правильная передача в "моем" варианте должна быть такой:

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

void OWI_Send_byte(unsigned char x){
	unsigned char mask;
	for(mask = 1; mask; mask <<= 1) {
		if(x & mask) {
			OWI_Send_bit(1);
		} else {
			OWI_Send_bit(0);
		}
	}
}
извините за дезинформацию...

P.S. я вот тоже не понимаю, как ваша функция работает...
битва с дураками проиграна, победители торжествуют. слава победителям!
Закрыто

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