25.09.2012, 01:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Возможно, я с недосыпу уже не фокусирую, но тогда объясните, плиз, в чем здесь может заключаться розыгрыш? :
Код:
|
Вариант 1:
128 PORTD &= 0xF0;
129 PORTD |= 0x0A;
\ ??main_5:
\ 0000006E B302 IN R16, 0x12
\ 00000070 7F00 ANDI R16, 0xF0
\ 00000072 BB02 OUT 0x12, R16
\ 00000074 B302 IN R16, 0x12
\ 00000076 600A ORI R16, 0x0A
\ 00000078 BB02 OUT 0x12, R16
Вариант 2:
128 PORTD = ( PORTD & 0xF0 ) | 0x0A;
\ ??main_5:
\ 0000006E B302 IN R16, 0x12
\ 00000070 7F00 ANDI R16, 0xF0
\ 00000072 600A ORI R16, 0x0A
\ 00000074 BB02 OUT 0x12, R16 |
В первом варианте - два OUT'а, сначала в нижний нибл пишутся нули, затем - целевое значение, во втором варианте OUT - один, нули не пишутся.
__________________
There's always more than one way to skin a cat.
|
|
|
|
25.09.2012, 02:59
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
То есть Вас смущают две лишних строчки ассемблера?
Хороший пример, но немного неудачный. У Вас используется порт ввода-вывода, поэтому компилятору приходится тупо подряд писать
Код:
|
\ 00000072 BB02 OUT 0x12, R16
\ 00000074 B302 IN R16, 0x12 |
А если вместо порта использовать регистр или ячейку памяти, то компилятор просто выкинет ненужные перемещения из аккумулятора в память и обратно, и поэтому приведённый Вами код не будет отличаться от библиотечного.
В этом, собственно, и заключается розыгрыш.
|
|
|
|
25.09.2012, 09:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Yurkin2007, Вы, положительно, не понимаете в чем состоит мой вопрос, что меня насторожило. Сейчас не могу писать пространно - сделаю это позже, однако, дам наводящий вопрос - какая мысль посещает Вас, когда Вы видите в исходнике, например, такой фрагмент:
Код:
|
int x;
x = 5;
x = 7;
... |
Я позже вернусь и мне будет интересно узнать Ваши варианты.
Благодарю.
__________________________________________________
Сообщение от Yurkin2007
|
то компилятор просто выкинет ненужные перемещения
|
Всё же, допишу сейчас, а-то, потом забуду. В общем случае: - возможности оптимизатора не безграничны, получив на входе более рыхлый код, он и результат выдаст хуже, чем с исходно плотным кодом,
- в некоторых подобных случаях, оптимизированный код может оказаться неэффективным или даже неверным,
- и наконец, зачем сознательно лепить горбатого - чтобы оптимизатору было чем заняться?
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 25.09.2012 в 10:18.
|
|
|
|
25.09.2012, 10:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
Возможно, я с недосыпу уже не фокусирую, но тогда объясните, плиз, в чем здесь может заключаться розыгрыш? :
Код:
|
Вариант 1:
128 PORTD &= 0xF0;
129 PORTD |= 0x0A;
\ ??main_5:
\ 0000006E B302 IN R16, 0x12
\ 00000070 7F00 ANDI R16, 0xF0
\ 00000072 BB02 OUT 0x12, R16
\ 00000074 B302 IN R16, 0x12
\ 00000076 600A ORI R16, 0x0A
\ 00000078 BB02 OUT 0x12, R16
Вариант 2:
128 PORTD = ( PORTD & 0xF0 ) | 0x0A;
\ ??main_5:
\ 0000006E B302 IN R16, 0x12
\ 00000070 7F00 ANDI R16, 0xF0
\ 00000072 600A ORI R16, 0x0A
\ 00000074 BB02 OUT 0x12, R16 |
В первом варианте - два OUT'а, сначала в нижний нибл пишутся нули, затем - целевое значение, во втором варианте OUT - один, нули не пишутся.
|
В первом случае особого криминала не вижу. Типичное использование регистра порта как РОН (ячейки памяти). Извлекли содержимое регистра (порта), про-Эндили, очистили место под младший ниббл, сохранили в регистре (порту). Потом снова извлекли, про-Орили на освободившееся место в младщем ниббле и снова сохранили в регистре (вывели в порт). Неэффективно по сравнению со вторым, да. Но странностей не вижу. Может недопонимаю..
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
25.09.2012, 12:41
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
Вы, положительно, не понимаете в чем состоит мой вопрос,
|
Начинаю догадываться, не смотря на всю сумбурность изложения.
Вот Ваш вариант
Код:
|
AWU-›TBR =(AWU-›TBR &((uint8_t)~AWU_TBR_AWUTB)))|TBR_Array[(uint8_t)AWU_TimeBase]; |
хоть и записан в одну строчку, будет выполняться по частям всё равно. Сначала операция AND, затем OR. Промежуточный результат первой операции надо ж где-то сохранить. Но Вы категорически против использования для этого ячейки памяти с адресом AWU-›TBR и предлагаете использовать внутренние регистры микропроцессора. Я правильно Вас понял ?
Ну, у STM8S не очень много этих самых регистров: аккумулятор, два индексных регистра, стак-пойнтер, счётчик программного адреса и статус. И всё. Тесно как шахтёру в шахте. Уж не знаю, откуда Вы взяли R16 в Вашем варианте.
В таком случае, если повезёт, то, наверно, и можно всё прокрутить через аккумулятор. Но число ассемблерных строк будет больше, чем четыре. И ещё неизвестно, может код короче будет при использовании памяти для промежуточных значений ...
|
|
|
|
25.09.2012, 17:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от Yurkin2007
|
... не смотря на всю сумбурность изложения.
|
Вот тут я Вам ничем помочь не смогу, так как я никакого изложения еще не делал - я лишь задал короткий вопрос: зачем в одни и те же биты сначала пишутся нули и только затем нужные данные.
Ответом на этот вопрос были: - рассуждения о битах, не реализованных на кристалле, дескать, чтобы в них не писать, вся эта затея и сделана,
- затем - соображения о том, что в ячейки памяти (в отличие от I/O-портов) можно писать сколько угодно - оптимизатор всю эту фигню исправит,
- наконец, замечания о хранении промежуточных результатов вычислений и о том, что якобы я "категорически против использования для этого ячейки памяти с адресом AWU-›TBR"...
Если и есть тут какой-то сумбур, то он - ну, никак не в моём вопросе...
Сообщение от ut1wpr
|
Неэффективно по сравнению со вторым, да. Но странностей не вижу.
|
Ну, неэффективность в коде от производителя - это, на мой взгляд, тоже странность. Однако, дело не в ней.
Когда встречается фрагмент кода типа "x = 5; x = 7;" меня это, по меньшей мере, удивляет, и хочется понять что это такое. С одной стороны, действительно, можно предположить один из простых вариантов - пофигизм ("зачем париться, оптимизатор всё лишнее удалит"), результат копипаста, невнимательность/спешка и так далее. Но штука-то в том, что иногда такие "странности" в коде неслучайны и более того - должны выполняться именно так, поскольку кроме очевидных событий, типа изменения данных, такие инструкции производят и неочевидные действия.
Навскидку, пара-тройка примеров (вы их и сами назовётё массу): - смена значения делителя тактовой - CLKPR=0x80; CLKPR=0xNN;
- очистка некоторых флагов прерываний чтением - i = AWU_CSR1;
- блокировка регистра данных ADC чтением ADCL и разблокировка его чтением ADCH,
- наконец, эта классная шутка Atmel'овцев, благодаря которой работает вот такой код:
Код:
|
while (1){
PINB.0 = 1;
} |
Я писал выше, что буквально на днях впервые пощупал STM8 (чистого времени - от силы, часа три-четыре) и поэтому я пока гораздо лучше не знаю их особенности, чем знаю их. В связи с этим, у меня вызывают интерес те вещи - в доках, в коде - которые выглядят нелогичными. Отсюда и желание узнать, кто что думает по этому поводу.
Ну, а не обращай я внимание на такие штуки, я мог бы многого так никогда и не узнать. Например, как работает "PINB.0 = 1;".
__________________
There's always more than one way to skin a cat.
|
|
|
|
25.09.2012, 21:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Уважаемый tempora.
Не уверен, но мне кажется, что пару месяцев назад я находился в таком же состоянии, как и вы. Интенсивно до этого работал на продуктах Микрочипа и Атмела. Сформировались свои стереотипы. И точно так же, как и вы, был в легком недоумении от решений ЭсТешников. И когда я прочитал ответ (не помню кого, вроде Досикус это был) на мои ПАЧИМУ?, все встало на свои места в голове. Надо сменить позицию оценки. Вам предлагают изделие со своими фичами и загогулинами. А кто ж спорит, что оно отличается от того, с чем вы ранее работали. И ваше право принять это или отвергнуть.
Все ваши рассуждения базируются на вашей ЛИЧНОЙ, субъективной оценке. Но если вы не в состоянии внести изменения в сторону улучшения, то какова цена вашим выкладкам? Да и сами оценки весьма спорны. Может есть смысл выждать некоторое время, поработать с камнем поплотнее? Ваши посты по теме STM8 со стороны выглядят как приглашение ярого полемиста такому же же коллеге, для которого важен скорее не результат, а сам факт наличия полемики.
Я пока воздерживаюсь от глобальных оценок камня (его топологии, архитектуры), но чем дальше, тем больше он нравится.
Я не хочу принимать участия в спорах о лишнем байте-команде в процедуре инициализации, которая исполняется один раз за время нахождения МК во включенном состоянии. Скажу одно. Я в прошлом году писал программу на М8 от Атмела, не имеет значения, что там было. Но отмечу, что заняла она процентов 85 памяти кодов. Когда я ради освоения STM8 начал портировать ее, с удивлением обнаружил, что те же функции заняли не более 30%. После решения расширить возможности, я добавил туда еще три (!) фичи, но так и не добрался до тех же 80%. Из 8К занято около 5К. Наверное так и формируется личное восприятие и личные оценки. Повторяю, субъективно. Я не задавался и не собираюсь задаваться целью производить какие-либо сравнения ни по скорости, ни по иным параметрам. Одно скажу, время показало, что мне почему-то не хочется возвращаться к Мегам-Тайням.
Ну, а ваши замечания о "нелогичности" в доках и кодах тоже не совсем однозначны. К примеру, рассуждать о логике разработчика МК и сравнивать ее со совей логикой, я бы не стал. Разные вещи. У разработчика больше информации, и моя логика просто может разбиться об нее, узнай я поближе, "почему так, а не так сделано"....
Извините меня за абсолютный треп и "многа букафф".
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
25.09.2012, 22:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от ut1wpr
|
Все ваши рассуждения базируются на вашей ЛИЧНОЙ, субъективной оценке.
|
Бог с Вами - какие рассуждения? Я задал вопрос, который, как Вы правильно отметили, возник из-за того, что этот кристалл сильно отличается от atmel'овского, и выслушиваю ответы. Выслушиваю с интересом, оцениваю для себя, но вслух свою оценку не произношу - какая ж тогда полемика?
В общем, разбираюсь в новостях - и только. Спасибо.
Сообщение от ut1wpr
|
рассуждать о логике разработчика МК и сравнивать ее со совей логикой, я бы не стал
|
Я тоже не сравниваю разные логики. Здесь логичность - служит лишь индикатором понимания/непонимания материала - если что-то кажется нелогичным, значит нужно изучить глубже. И только.
___________________________________________
Сообщение от ut1wpr
|
те же функции заняли не более 30%
|
Это радует.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 25.09.2012 в 22:09.
|
|
|
|
25.09.2012, 22:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
Это радует.
|
Меня тоже. Искренне.
Готов поделиться только что проделанным экспериментом с stm8s003. Залил в него прогу, состоящую из одной команды на асме HALT. Потребление глянуть. Насколько могу верить своему китайцу XB-868 (ширпотреб с базара) - 400 мкА. Питание 3.3. Чтение ДШ вдоль и поперек и по диагонали наводило на меньшие значения. Но все так размазано, перетасовано условиями (то включено, это выключено, разницы какие-то в 5 мкА, путают, гады нашего брата, пролетария). Да и само состояние хальт не очень расписано. Скользко и размазанно. Оставляет место для разночтений. Мысля такая. Если надо супермикро - надо Эльки закладывать ("L"). Наверное правильно все это, для каждой ниши свой камушек. Хотя вспоминая PIC с его micropower технологией...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
25.09.2012, 22:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от ut1wpr
|
400 мкА
|
Ну, 8s003 для меня и вовсе штука ненадёванная.
А на каком клоке и в котором из трёх хальтов он столько потребляет? Просто, те самые эльки обещают 3мкА в самом жрущем из хальтов. У них еще и контроллеры LCD бывают...
__________________
There's always more than one way to skin a cat.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:38.
|
|