Зато сдвиг выполняется быстрее, чем умножение.Пробел и два знака < требуют большего пальцедвижения нежели *.
Оформление кода
Re: Оформление кода
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
Современный компилятор заменяет и умножение на 2, и сдвиг на сложение, даже без оптимизации.
Re: Оформление кода
Ну, э, такие замены - это и есть форма оптимизации. 
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
Непонятно, зачем сдвиг заменять. Что так 1 такт, что так. И на счет оптимизации я имел в виду -O0, когда компилятор должен бы выполнять написанное дословно.
Re: Оформление кода
Я провел эксперимент.
AVR GCC:
-Os :
-O0 :
Оптимизирует до сдвига даже на -O0.
AVR GCC:
Код: Выделить всё
#include <avr/io.h>
#include <stdint.h>
volatile uint8_t a,b,c;
void main(void)
{
a=3;
b=5;
a*=2;
b = b << 1;
return 0;
}
Код: Выделить всё
@0000002B: main
---- ee_test.c ------------------------------------------------------------------------------------
7: {
+0000002B: E083 LDI R24,0x03 Load immediate
+0000002C: 93800102 STS 0x0102,R24 Store direct to data space
9: b=5;
+0000002E: E085 LDI R24,0x05 Load immediate
+0000002F: 93800100 STS 0x0100,R24 Store direct to data space
11: a*=2;
+00000031: 91800102 LDS R24,0x0102 Load direct from data space
+00000033: E090 LDI R25,0x00 Load immediate
+00000034: 0F88 LSL R24 Logical Shift Left
+00000035: 1F99 ROL R25 Rotate Left Through Carry
+00000036: 93800102 STS 0x0102,R24 Store direct to data space
12: b = b << 1;
+00000038: 91800100 LDS R24,0x0100 Load direct from data space
+0000003A: 0F88 LSL R24 Logical Shift Left
+0000003B: 93800100 STS 0x0100,R24 Store direct to data space
15: }
Код: Выделить всё
@0000002B: main
---- ee_test.c ------------------------------------------------------------------------------------
7: {
+0000002B: 93DF PUSH R29 Push register on stack
+0000002C: 93CF PUSH R28 Push register on stack
+0000002D: B7CD IN R28,0x3D In from I/O location
+0000002E: B7DE IN R29,0x3E In from I/O location
8: a=3;
+0000002F: E083 LDI R24,0x03 Load immediate
+00000030: 93800102 STS 0x0102,R24 Store direct to data space
9: b=5;
+00000032: E085 LDI R24,0x05 Load immediate
+00000033: 93800100 STS 0x0100,R24 Store direct to data space
11: a*=2;
+00000035: 91800102 LDS R24,0x0102 Load direct from data space
+00000037: 2F88 MOV R24,R24 Copy register
+00000038: E090 LDI R25,0x00 Load immediate
+00000039: 0F88 LSL R24 Logical Shift Left
+0000003A: 1F99 ROL R25 Rotate Left Through Carry
+0000003B: 93800102 STS 0x0102,R24 Store direct to data space
12: b = b << 1;
+0000003D: 91800100 LDS R24,0x0100 Load direct from data space
+0000003F: 0F88 LSL R24 Logical Shift Left
+00000040: 93800100 STS 0x0100,R24 Store direct to data space
15: }
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
У меня (avr-gcc 4.8.1) оптимизирует до сложения
-O0
-Os
Код: Выделить всё
#include <avr/io.h>
int main(){
uint8_t x = PINC;
x *=2;
PORTC = x;
x <<=1;
PORTC = x;
return 0;
}Спойлер
Код: Выделить всё
uint8_t x = PINC;
42: 83 e3 ldi r24, 0x33 ; 51
44: 90 e0 ldi r25, 0x00 ; 0
46: fc 01 movw r30, r24
48: 80 81 ld r24, Z
4a: 89 83 std Y+1, r24 ; 0x01
x *=2;
4c: 89 81 ldd r24, Y+1 ; 0x01
4e: 88 0f add r24, r24
50: 89 83 std Y+1, r24 ; 0x01
PORTC = x;
52: 85 e3 ldi r24, 0x35 ; 53
54: 90 e0 ldi r25, 0x00 ; 0
56: 29 81 ldd r18, Y+1 ; 0x01
58: fc 01 movw r30, r24
5a: 20 83 st Z, r18
x <<=1;
5c: 89 81 ldd r24, Y+1 ; 0x01
5e: 88 0f add r24, r24
60: 89 83 std Y+1, r24 ; 0x01
PORTC = x;
62: 85 e3 ldi r24, 0x35 ; 53
64: 90 e0 ldi r25, 0x00 ; 0
66: 29 81 ldd r18, Y+1 ; 0x01
68: fc 01 movw r30, r24
6a: 20 83 st Z, r18Спойлер
Код: Выделить всё
uint8_t x = PINC;
38: 83 b3 in r24, 0x13 ; 19
x *=2;
3a: 88 0f add r24, r24
PORTC = x;
3c: 85 bb out 0x15, r24 ; 21
x <<=1;
3e: 88 0f add r24, r24
PORTC = x;
40: 85 bb out 0x15, r24 ; 21Re: Оформление кода
Интересно... У меня avr-gcc 4.3.3, WinAVR 20100110.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
Недавно пробовал WinAVR-20090313 (avr-gcc 4.3.2), оптимизация не понравилась. Если хотите, могу поискать сам пример, но вряд ли найду.
Re: Оформление кода
Ну, я на 4.3.3 пока не жаловался...
Эх, жалко что для STM8 GCC пока не сделали. Приятные чипы (в основном, конечно, ценой), но приходится использовать Cosmic C compiler, а он несколько странный - в стандартной поставке нет даже stdint.
Эх, жалко что для STM8 GCC пока не сделали. Приятные чипы (в основном, конечно, ценой), но приходится использовать Cosmic C compiler, а он несколько странный - в стандартной поставке нет даже stdint.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
"Не понравилось" - в смысле по сравнению с последним. С другой стороны, сколько читал сравнений, ни по объему, ни по скорости, gcc не рекордсмен.
STM8 gcc? Только что задал в поиске synaptic'а, пакет "sdcc" (Small Device C Compiler) вроде для этого и предназначен. Судя по описанию,
STM8 gcc? Только что задал в поиске synaptic'а, пакет "sdcc" (Small Device C Compiler) вроде для этого и предназначен. Судя по описанию,
Можете дать код для проверки? Я с stm8 дела не имел, так что сам не напишу.SDCC is a C compiler for the Intel MCS51 family, HC08, PIC,
GameBoy Z80, DS80S390, Z80, Z180 and STM8 microcontrollers.
Re: Оформление кода
OK, как только доберусь до основного компа - выложу. Вообще, надо попробовать этот SDCC.Можете дать код для проверки?
А вы хотите протестить какой-то конкретный блок? Просто так-то Си везде один, отличаются особые конструкции, специфичные для компилятора (#pragma, методики определения прерываний и т.п.), ну и адреса/определения регистров и битов.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
Я хочу только проверить, тот ли это пакет. Изучать stm8 не планирую, разве что stm32. Поэтому хотелось бы не слишком сложный код и возможность проверки.
Re: Оформление кода
Да и врядли в ближайшее время сделают. СТМ8 хорош для мелких поделок так что выбор комилятора здесь как бы и неуместен.Эх, жалко что для STM8 GCC пока не сделали
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Оформление кода
Так чем sdcc не устраивает? Вроде что-то компилирует.
- Вложения
-
- stm8.tar.gz
- (9.71 КБ) 274 скачивания
-
Alkul
- Держит паяльник хвостом
- Сообщения: 933
- Зарегистрирован: Ср апр 13, 2011 11:09:20
- Откуда: Екатеринбург
Re: Оформление кода
Я пишу комментарии вот в таком стиле (взят кусок реальной программы трехлетней давности)
Причем в этом стиле пишется абсолютно вся программа, даже если в данный момент мне совершенно понятно, что делает этот кусок кода, все равно - подробные комментарии. Зато сопровождать мои программы потом одно удовольствие. И я, даже через год после написания программы очень быстро вспоминаю алгоритм и логику программы.
А в начале перед телом программы подробно расписано за что отвечает каждый использованный вывод микроконтроллера.
Спойлер
Код: Выделить всё
;Подпрограмма инкремента счетчиков шагов
INCCOUN:
push R16 ;Сохранить на стеке рег. R16
lds R16,AUXCOU ;Занести в рег.R16 значение вспомогательного счетчика
inc R16 ;Инкремент вспомогательного счетчика
cpi R16,4 ;Значение вспомогательного счетчика после инкремента меньше 4
brlo INC_END ;Если да, то перейти на сохранение значения вспомогательного счетчика и выход из подпрограммы
;Иначе значение вспомогательного счетчика после инкремента стало равно 4, обнулить вспомогательный счетчик и инкрементировать основной
push RH ;Сохранить на стеке
push RL ;рег.пару RH:RL
lds RL,MAINC_L ;Занести в рег.RL значение мл.байта основного счетчика
lds RH,MAINC_H ;Занести в рег.RH значение ст.байта основного счетчика
cpi RH,0x8C ;Старший байт основного счетчика меньше 8Ch?
brcs INCREM ;Если ст.байт меньше 0x8C, то выполнить инкремент счетчика
;Иначе проверить мл.байт на совпадение с 0x9F
cpi RL,0x9F ;Младший байт счетчика меньше 9Fh?
brcs INCREM ;Если при старшем байте, равном 0x8C, мл.байт меньше 0x9F, выполнить инкремент счетчика
;Иначе счетчик равен 8C9Fh, следующее значение при инкременте - 0000h
clr R16 ;Обнулить основной и вспомогательный
sts MAINC_L,R16 ;счетчики, так как они достигли
sts MAINC_H,R16 ;своего максимального значения
rjmp INC_E ;Переход на восстановление регистров из стека и выход из подпрограммы
;Значение 35999 не превышено, выполнить инкремент основного счетчика
INCREM:
adiw RL,1 ;Инкремент основного счетчика
clr R16 ;Так как вспомогательный счетчик достиг максимального значения, то обнулить его
sts MAINC_L,RL ;Сохранить в ОЗУ новое значение мл.байта основного счетчика
sts MAINC_H,RH ;Сохранить в ОЗУ новое значение ст.байта основного счетчика
INC_E:
pop RL ;Восстановить из стека
pop RH ;рег.пару RH:RL
INC_END: ;
sts AUXCOU,R16 ;Сохранить в ОЗУ новое значение вспомогательного счетчика
pop R16 ;Восстановить из стека рег.R16
ret ;
А в начале перед телом программы подробно расписано за что отвечает каждый использованный вывод микроконтроллера.
Re: Оформление кода
Все хорошо, только если бы еще не кириллицей - было бы совсем замечательно. Я вдоволь насмотрелся на комментарии в национальных кодировках, которые открываются непойми как.Я пишу комментарии вот в таком стиле
Я тоже люблю оставлять достаточно подробные (в меру своей лени) комментарии.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Оформление кода
Як на маю думку, это уже перебор. Что делают push и lds - это знает даже самый тупой потенциальный сопроводитель программы. Другое дело - какая "сверхзадача" этих манипуляций. Я в своих прогах - в подпрограмме, например - в начале расписывал назначение, диапазон применяемости, какие и где лежат аргументы , особенности п/п ( например: "Внимание! Рабочие регистры не сохраняются ! " ) и пр. В реализации описывал, не спускаясь до уровня каждой команды, работу функционально законченного фрагмента ( загрузили массив констант из флеши, вычислили по Пифагору полную мощность и пр. ) Ведь чересчур много комментов - плюс превращается в минус.Alkul писал(а):Я пишу комментарии вот в таком стиле (взят кусок реальной программы трехлетней давности)Код: Выделить всё
push RH ;Сохранить на стеке push RL ;рег.пару RH:RL lds RL,MAINC_L ;Занести в рег.RL значение мл.байта основного счетчика lds RH,MAINC_H ;Занести в рег.RH значение ст.байта основного счетчика ;
Спойлер
Я занимался спортивным ориентированием. Описывались соревнования где-то в Скандинавии: карта была настолько подробная, что был прорисован каждый бугорок, каждая ямка с полметра глубиной. Плотность информации немыслимая. Так вот, выиграли те, что плюнули на эту бездну сведений и просто бежали по азимуту как по ровному полю-
Alkul
- Держит паяльник хвостом
- Сообщения: 933
- Зарегистрирован: Ср апр 13, 2011 11:09:20
- Откуда: Екатеринбург
Re: Оформление кода
Привычка писать кириллицей закрепилась после того, как устроился работать в "оборонку". Там при сдаче документации на изделие текст программы тоже должен сдаваться, как отдельный документ. Не всегда его требуют печатать, но он должен быть сдан в архив на CD или DVD-диске, ему присваивается децимальный номер. Заказчик "не поймет", если комментарии будут на английском.YS писал(а): Все хорошо, только если бы еще не кириллицей - было бы совсем замечательно. Я вдоволь насмотрелся на комментарии в национальных кодировках, которые открываются непойми как.
А вопрос с кодировкой решается просто. Во-первых, сменить кодировку не проблема. Во-вторых, поскольку все пишется на ассемблере, то вопрос переносимости не ставится, и код по сути предназначен для одной и той же среды разработки. Более того, я очень сомневаюсь, что переносимость возможна даже на Си, если код по-настоящему оптимизировался для данного МК.
Вопрос не в том, что делает команда push. В данном случае в комментарии просто написано, что команда push использована для сохранения регистров на стеке, а не, к примеру, для изменения адреса возврата путем манипуляций со стеком.Jack_A писал(а): Як на маю думку, это уже перебор. Что делают push и lds - это знает даже самый тупой потенциальный сопроводитель программы.
если б я строку lds RL,MAINC_L откомментировал, как "Занесение в регистр RL содержимого ячейки по адресу MAINC_L", это бы точно был бесполезный комментарий. А так я пишу, какие именно данные заносятся в регистр, это очень полезно для понимания алгоритма работы, когда смотришь на программу через годик после её написания.
Последний раз редактировалось Alkul Чт ноя 26, 2015 20:06:41, всего редактировалось 1 раз.
Re: Оформление кода
О-о-о, понимаю.Привычка писать кириллицей закрепилась после того, как устроился работать в "оборонку". Там при сдаче документации на изделие текст программы тоже должен сдаваться, как отдельный документ. Не всегда его требуют печатать, но он должен быть сдан в архив на CD или DVD-диске, ему присваивается децимальный номер.
Код коду рознь. Если это какой-нибудь рассчетный алгоритм, не взаимодействующий с определенным железом, то он вполне будет переносим.Более того, я очень сомневаюсь, что переносимость возможна даже на Си, если код по-настоящему оптимизировался для данного МК.
У меня бывали случаи, когда код о-о-о-о-очень надо было посмотреть прямо сейчас, ну а под рукой, конечно, была только флешка с кодом и ближайший компьютер, на котором отродясь не стояло ничего подходящего, кроме разве notepad'а. Аналогичный случай - на планшете открыть письмо с кодом, и т.п.Во-первых, сменить кодировку не проблема.
А еще мне приходилось разбирать код с комментариями то ли на чешском, то ли на каком-то таком языке. Вроде бы и латиница, но от этого не легче.
Абсолютно поддерживаю! Комментарии очень помогают, когда через полгода-год заказчик просит что-то слегка поменять, или добавить фичу, или что-то скорректировать.это очень полезно для понимания алгоритма работы, когда смотришь на программу через годик после её написания.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
-
Alkul
- Держит паяльник хвостом
- Сообщения: 933
- Зарегистрирован: Ср апр 13, 2011 11:09:20
- Откуда: Екатеринбург
Re: Оформление кода
"Олдскул" - это на самом деле очень хорошо, если там действительно специалист.YS писал(а):на работе имеется порядком олдскульных товарищей
Сейчас среди разработчиков, особенно не "олдскульных", к сожалению, тоже начала превалировать тенденция к "одноразовым" разработкам. Мол, сделали - забыли.
Об архивном хранении документации, соответственно, речь тоже не идет. Подчас, и документации-то как таковой нет. Слова "учтенная копия" для "поколения Next" - пустой звук.
"Молодой" разработчик станет "суперпрофи", если, зная все современные тенденции разработки электроники и софта, еще "подхватит" у "олдскулов" грамотное отношение к организации процесса разработки и ведения документации.
С этим полностью согласен, но с маленьким уточнением. В одной организации разработчики могут использовать любое ПО, но только обязательно однотипное. Чтобы не было такого, что, допустим, один конструктор работает в Компасе, другой - в Автокаде, а третьему удобнее рисовать чертеже в Ворде (тут утрирую, конечно). Чтобы не было такого, что один разработчик выполняет трассировку в P-CAD 2006, другому по душе SprintLayout, а третий упорно держится за P-CAD 4.5YS писал(а):DipTrace и КОМПАС 3D ничем не хуже Altium Designer, P-CAD и AutoCAD
В противном случае для нормальной работы у каждого разработчика на компьютере должен быть установлен весь "зоопарк" используемого софта и каждый должен будет знать все эти программы. Согласитесь, это неправильная ситуация.
К примеру, у нас конструкторы работают в Компасе 2D и 3D, а "электроники" - в P-CAD 2004. Я лично не вижу, чем Altium Designer в корне отличается от P-CAD последних версий. Более того, я и между P-CAD версий 2002, 2004 и 2006 не вижу коренных отличий, кроме несовпадения форматов выходных pcb-файлов.
А вот это очень плохо, на мой взгляд. Ведь что значит ГОСТ? Это некий стандарт. Если, к примеру, производитель решил выпускать колбасу не по ГОСТу, это сто процентов будет означать ухудшение качества конечного продукта либо из-за замены ингредиентов на более дешевые и менее качественные, либо из-за упрощения техпроцесса.YS писал(а):я им упорно объясняю, что ГОСТы в наши дни являются рекомендательными (а не обязательными!) документами согласно федеральному закону о техническом регулировании (ст. 12)
И если законодатели пошли на это в угоду лобби производителей дерьма, то нормальные разработчики и производители не должны следовать этому примеру.



