Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

avreal писал(а):Не советую. Получите объединение недостатков.


гхмм. медленно и огромный код ? эхх. я разрываюсь. хочется легкости си и четкости АСМ.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

что в си обозначает символ | ? просто как использовать я вроде понял

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

UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN );


но непонятно почему нельзя записать

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

TXEN =1;
 RXEN =1;

илиэто просто для наглядности ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

вы и в ассемблере не можете написать MOV TXEN, 1 например :) или LDI TXEN, 1, но ведь вас это не удивляет?
TXEN - это символ номера бита в регистре
а вертикальная черта обозначает операцию побитного ИЛИ
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

ARV писал(а):TXEN - это символ номера бита в регистре


т.е. это константа, и напис`ать TXEN=1 это значит напис`ать 3=1. А Сишный код в переводе на рабоче-крестьянский звучит приблизительно так : взять единицу и сдвинуть ее влево 3 раза, потом взять еще единицу и сдвинуть ее влево 4 раза, а то, что получится, по ИЛИ добавить к содержимому регистра UCSRB .
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

оу.. понял.
вопрос выбора. если необходимо применить достаточно сложный алгоритм ( например алгоритм шифрования или обработки изображений.. с камеры ) что будет действительно быстрее ? АSM ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: Вопросы по С/С++ (СИ)

Сообщение phenomen »

При достаточной квалификации программиста, язык ассемблера позволяет писать самый быстрый и компактный код. Возможно, даже лучше, чем генерируемый трансляторами языков более высокого уровня.
Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов).
Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов.

http://ru.wikipedia.org/wiki/Язык_ассемблера
Справедливо и в случае мк.
До недавнего времени разница между си и асмом составляла 30% объема, но сейчас код си оптимизируется до меньших размеров.
Если требуется быстродействие, то только асм!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

phenomen писал(а):Если требуется быстродействие, то только асм!


На одном раньшем проекте у меня пошла напряженка с микросекундами, пришлось применить нестандартную "самопальную" плавающую арифметику : один байт порядок, 2 байта мантисса без скрытого разряда. Конечно, всю арифметику и минимальный набор функций ( exp,sin,cos,sqrt) пришлось напис`ать и оттестить, зато когда с моим коллегой - убежденным Си-шником провели сравнительное тестирование, выигрыш по скорости был в 2 раза! Обошлись без миграции на другой более быстрый ( и более дорогой! ) камень, что при большой серийности вылилось бы в бо-ольшую американскую копеечку. А при моей тутошней программерской зряплате пару недель дополнительного писания окупились продажей одной месячной партии изделий.

Конечно, ревнители чистоты рядов возмутятся: у тебя точность ни в жилу! Успокойтесь, судари, точночти для решаемой задачи хватало с запасом, а там, где требовалось в одном месте суммирование большого числа разноразмерных данных, взял для сумматора обычную 4-байтовую переменную, и она пркрасно уживалась с остальной арифметикой.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Кислый писал(а):но непонятно почему нельзя записать

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

TXEN =1;
 RXEN =1;

илиэто просто для наглядности ?

В СиЛабовском компиляторе можно так написать, если регистр бит-адресуемый :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

Gudd-Head писал(а): В СиЛабовском компиляторе можно так написать, если регистр бит-адресуемый :)


Насколько я в курсе, бит-адресация была в 51-х МК, АВР вроде в таком не замечен.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

Jack_A писал(а):АВР вроде в таком не замечен.

К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит) :) Под эти регистры, как правило, попадают и USART'овские с битами RXEN и TXEN.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

Кислый писал(а):но непонятно почему нельзя записать

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

TXEN =1;
 RXEN =1;
вообще то можно, если немного схитрить:

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

SFR_B(FLAGS,0x60)
#define FLAG1 FLAGS_Bit0
#define FLAG2 FLAGS_Bit1
// some code
FLAG1=1;
//some code
FLAG1=0;

Имена FLAG1, FLAG2 использованы для примера. то же самое для регистра UCSR (USART CONTROL and STATUS REGISTER)
Например для Тиньки 2313:

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

SFR_B(UCSRB,0x0A)
#define RXEN UCSRB_Bit4 //Rx enable
#define TXEN UCSRB_Bit3 //Tx enable
//some code
RXEN=1;
//some code
TXEN=1;
Ставим плюсы: )
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

Gudd-Head писал(а):К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит) :) Под эти регистры, как правило, попадают и USART'овские с битами RXEN и TXEN.


Я же не утверждаю, что этого сделать нельзя. Просто из известных мне МК отдельные биты можно устанавливать не комантами SET BIT, CLR BIT (это не мнемоника команд, а их суть ), а прямым присваиванием MOV, только в 51-х. Хотя сути дела это не меняет, на асме эти биты взводишь-сбрасываешь не задумываясь, а вот на ЯВУ приходится, как выясняется, подумать.
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

грациас, сеньёро !!!
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

кто нибудь объясните мне почему функция sprintf() жрет так много стека?и как это оптимизировать? мне нужно переменную типа float конвертировать в строку с, хотя бы, 4 знаками после запятой. приходит в голову только один способ : объявить переменную integer, умножить float на 10000, присвоить переменной integer полученное после умножения на 10000 значение, далее в цикле последовательно вычитать из integer 10000,1000,100,10, считая при этом кол-во десятков тысяч, тысяч, сотен, десятков в переменной и записывать их в массив. после этого добавить точку в массив в то место где она была и вывести массив на индикатор. но это прокатывает только с неотрицательными числами типа X.YYYYY, т.е. с нулевой степенью. а если число до точки еще содержит знаки, например: XXXX.YYYYY? помогите советом. как Вы выводите float на индикатор?

P.S. тупо взять вместо переменной типа integer переменную типа long (или long long)... прокатит.
Последний вопрос в силе: как выводить float на индикатор не загружая стек и более менее быстро?

здесь продублировал viewtopic.php?p=655424#p655424
Ставим плюсы: )
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

А у меня sprintf() сожрало больше килобайта (!) флэш-памяти :(
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

за флешем не следил, сейчас не могу посмотреть, проект на рабочем компе. но думаю флеш тоже нормально "потрепало")))) мне главное глубину стека сейчас поменьше сделать. знаю что на асме было бы намного короче, поэтому воюю.
Ставим плюсы: )
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

ребята, кто может скинуть работающий исходник с usbAvr от obDev, такой чтоб скомпилился в gcc ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Кислый »

с примером чтения-записи данных.
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

ibiza11 писал(а): знаю что на асме было бы намного короче, поэтому воюю.


Не используя sprintf и желая получить приличный вид на индикаторе, придется малость попотеть. Идея у Вас изложена правильно несколькими постами выше, только чтоб получить приемлемую точность отображения, нужно сначала определить порядок величины, чтобы знать, на каком знакоместе поместить точку, иначе малые числа будут отображаться с большой погрешностью. А отсюда будет видно, на сколько умножить перед преобразованием в integer. Получать частное вычитанием нет смысла, можно использовать целочисленное деление с остатком.
Ответить

Вернуться в «Разные вопросы по МК»