Вот тут еще вопрос возник при изучении чужой программы, что это такое +'0' ?
Сам нашел только то, что компилятор поддерживает операторы и в данном случае -1 переводит в 0xff, а что такое -1 + '0'? Или таким образом автор имел ввиду что при начале цикла счетчик установился с 255 в 0?
Добрый день, так сложилось, что в руках у меня плата stm32f4decovery в МК я профон и погуглив понял, что изучать МК лучше начинать с ассемблера, но тут столкнулся с проблемой такого характера: никто не пишет под stm32 на ассемблере единственное что нашел это пара примеров для keil, но там ассемблер отличатся от интеловского. Вообщем посоветуйте чего делать, перейти на атмел, забить на ассемблер и начать грызти С++ или остановиться на keil?
Тут ещё проблема в том, что архитектура гораздо сложнее, и без опыта лучше не браться за ассемблер. Если AVR просто как валенок, соответственно и его ассемблер, то с STM32 такое не прокатит.
Хотя бы какие-то части вынести в качестве ассемблерной вставки ещё можно, но делать полностью проект нет смысла. Там на одном конфигурировании мозг взорвётся.
ploop писал(а):Тут ещё проблема в том, что архитектура гораздо сложнее, и без опыта лучше не браться за ассемблер. Если AVR просто как валенок, соответственно и его ассемблер, то с STM32 такое не прокатит.
Хотя бы какие-то части вынести в качестве ассемблерной вставки ещё можно, но делать полностью проект нет смысла. Там на одном конфигурировании мозг взорвётся.
Я бы не сказал. Что касается конфигурирования, то нет особой разницы, на Си его клепать, или на асме, по-любому надо в какой-то набор портов распихать какое-то количество констант, то есть на каждый шаг инициализации либо одна строчка на Си, либо две на асме, одна - загрузить константу в регистр, вторая - выдать ее в порт. Ну, и, опять же, простые действия, типа проверить битик в порту и перейти куда-то, если он взведен, на Си и на Асме занимают примерно одинаково. Зато Си - это дополнительный уровень абстракции. Если ты его заранее не знаешь (причем хорошо), да и еще камень незнакомый, результат вряд ли порадует.
А что действительно сложно на асме - это оптимизация по скорости для глубоко конвееризуемых процессоров, когда "инструкция z выполняется за один такт, но результат будет доступен через 17 тактов", вот тут действительно мозг взорвется, но ЦП большинства МК не такие...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Допустим, есть 8 байт (если важно — подряд, в ОЗУ или флэше), каждый содержит по 7 бит информации, 8-й бит — "ноль" (допустим, старший). Т.е. байты вида
01234567, где 1234567 — информационные биты.
Необходима компактная и/или быстрая функция, вставляющая "ноль" в N-ный бит N-ного байта.
Т.е. 8 байт принимаем, 8 байт выдаём. Первый байт идёт без изменения 01234567, ... четвёртый будет 12304567, ... , восьмой — 12345670.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
т.е. операцию INSERT с раздвиганием в сторону старшего разряда т.к. в ином случае произойдет потеря информации.
Кажется,мне что тут надо подготовить маску - для второй половины которая будет сдвигаться.
Затем копируем значение во временный регистр применяем маску и сдвигаем на одну позицию.
делаем операцию OR маски и результата, а затем XOR с временным регистром.
черт, нужный бит у нас будет в "1"... ну, обнулить его можно разными методами, лучше конечно во временном регистре эту 1 прописать сразу. Или как-то так...
Маску кстати можно перед циклом приравнять "$FF" и сдвигать её вправо заполняя нулем. Как только маска равна нулю - цикл закончен.
Alexeyslav , да. INSERT с раздвиганием. Двигать маску... Подумаю когда до бумажки доберусь) Потому что меня хватило только на разрезание регистра на две части, сдвиг одной и склеивание. Притом для каждого бита (байта) своя маска. ILYAUL , вы просто вставляете нули.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Что-то не уловил - перенос между 7-битными словами от младшего к старшему не нужен? Т.е. нужна вставка в один байт по указанным условиям?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Поправочка: Тут сдвиг в другую сторону, не в ту которую Gudd-Head указывал. Но смысл сохраняется. Есть ещё идея как упростить.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Gudd-Head писал(а):Кто хочет мозги размять?
каждый содержит по 7 бит информации, 8-й бит — "ноль" (допустим, старший). Т.е. байты вида
01234567, где 1234567 — информационные биты.
На мой взгляд задача поставлена немного расплывчато. Поэтому вот мой вариант.
Если взять обычную нумерацию битов: 0-й - младший, 7-й - старший.
Т.е. байт будет вот так состоять из битов 76543210. И при вставке "0" биты сдвигаются в сторону старшего.
Тогда, хорошенько размяв мозги, раскатав их тонким слоем, чтобы на просвет можно было увидеть остатки математики в них застрявшие можно сделать вот так.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
А компактная по какому критерию? По объему текста исходника, или коду? если по коду - то С отпадает(или нужно очень аккуратно использовать его) нужно делать на ассемблере. Одно только использование массива на С убивает эффективность и увеличивает размер кода.
И кстати почему-то никто не принимает во внимание что нужно обработать не ОДИН байт, а целых 8 байт за присест! В таком случае массив масок не нужен вовсе - маску можно формировать в рамках цикла по этим самым 8-ми байтам это всего один регистр и одна команда сдвига на итерацию. Какие при этом нужны массивы? да никаких!