гхмм. медленно и огромный код ? эхх. я разрываюсь. хочется легкости си и четкости АСМ.
вы как-то определитесь четкость присутствует и там и там, только эта четкость разного уровня: в Си четкость абстракций, а в асме - четкость реалий. как известно, абстрактное мышление - более высокая ступень, нежели конкретное
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
вы и в ассемблере не можете написать MOV TXEN, 1 например или LDI TXEN, 1, но ведь вас это не удивляет? TXEN - это символ номера бита в регистре а вертикальная черта обозначает операцию побитного ИЛИ
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
т.е. это константа, и напис`ать TXEN=1 это значит напис`ать 3=1. А Сишный код в переводе на рабоче-крестьянский звучит приблизительно так : взять единицу и сдвинуть ее влево 3 раза, потом взять еще единицу и сдвинуть ее влево 4 раза, а то, что получится, по ИЛИ добавить к содержимому регистра UCSRB .
оу.. понял. вопрос выбора. если необходимо применить достаточно сложный алгоритм ( например алгоритм шифрования или обработки изображений.. с камеры ) что будет действительно быстрее ? АSM ?
_________________ RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код @hobbyelectronics
При достаточной квалификации программиста, язык ассемблера позволяет писать самый быстрый и компактный код. Возможно, даже лучше, чем генерируемый трансляторами языков более высокого уровня. Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов). Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов.
http://ru.wikipedia.org/wiki/Язык_ассемблера Справедливо и в случае мк. До недавнего времени разница между си и асмом составляла 30% объема, но сейчас код си оптимизируется до меньших размеров. Если требуется быстродействие, то только асм!
На одном раньшем проекте у меня пошла напряженка с микросекундами, пришлось применить нестандартную "самопальную" плавающую арифметику : один байт порядок, 2 байта мантисса без скрытого разряда. Конечно, всю арифметику и минимальный набор функций ( exp,sin,cos,sqrt) пришлось напис`ать и оттестить, зато когда с моим коллегой - убежденным Си-шником провели сравнительное тестирование, выигрыш по скорости был в 2 раза! Обошлись без миграции на другой более быстрый ( и более дорогой! ) камень, что при большой серийности вылилось бы в бо-ольшую американскую копеечку. А при моей тутошней программерской зряплате пару недель дополнительного писания окупились продажей одной месячной партии изделий.
Конечно, ревнители чистоты рядов возмутятся: у тебя точность ни в жилу! Успокойтесь, судари, точночти для решаемой задачи хватало с запасом, а там, где требовалось в одном месте суммирование большого числа разноразмерных данных, взял для сумматора обычную 4-байтовую переменную, и она пркрасно уживалась с остальной арифметикой.
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19671 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Кислый писал(а):
но непонятно почему нельзя записать
Код:
TXEN =1; RXEN =1;
илиэто просто для наглядности ?
В СиЛабовском компиляторе можно так написать, если регистр бит-адресуемый
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19671 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Jack_A писал(а):
АВР вроде в таком не замечен.
К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит) Под эти регистры, как правило, попадают и USART'овские с битами RXEN и TXEN.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит) Под эти регистры, как правило, попадают и USART'овские с битами RXEN и TXEN.
Я же не утверждаю, что этого сделать нельзя. Просто из известных мне МК отдельные биты можно устанавливать не комантами SET BIT, CLR BIT (это не мнемоника команд, а их суть ), а прямым присваиванием MOV, только в 51-х. Хотя сути дела это не меняет, на асме эти биты взводишь-сбрасываешь не задумываясь, а вот на ЯВУ приходится, как выясняется, подумать.
кто нибудь объясните мне почему функция 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 на индикатор не загружая стек и более менее быстро?
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19671 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
А у меня sprintf() сожрало больше килобайта (!) флэш-памяти
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
за флешем не следил, сейчас не могу посмотреть, проект на рабочем компе. но думаю флеш тоже нормально "потрепало")))) мне главное глубину стека сейчас поменьше сделать. знаю что на асме было бы намного короче, поэтому воюю.
знаю что на асме было бы намного короче, поэтому воюю.
Не используя sprintf и желая получить приличный вид на индикаторе, придется малость попотеть. Идея у Вас изложена правильно несколькими постами выше, только чтоб получить приемлемую точность отображения, нужно сначала определить порядок величины, чтобы знать, на каком знакоместе поместить точку, иначе малые числа будут отображаться с большой погрешностью. А отсюда будет видно, на сколько умножить перед преобразованием в integer. Получать частное вычитанием нет смысла, можно использовать целочисленное деление с остатком.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения