Оформление кода

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Пробел и два знака < требуют большего пальцедвижения нежели *.
Зато сдвиг выполняется быстрее, чем умножение. :idea: Хотя, я думаю, современный компилятор вполне может соптимизировать умножение на два до сдвига. Хотя если хочется быть уверенным в этом, изначально написать сдвиг вполне несложно. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

Современный компилятор заменяет и умножение на 2, и сдвиг на сложение, даже без оптимизации.
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Ну, э, такие замены - это и есть форма оптимизации. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

Непонятно, зачем сдвиг заменять. Что так 1 такт, что так. И на счет оптимизации я имел в виду -O0, когда компилятор должен бы выполнять написанное дословно.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Я провел эксперимент. :)

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;
}
-Os :

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

@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:       }
-O0 :

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

@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:       }
Оптимизирует до сдвига даже на -O0.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

У меня (avr-gcc 4.8.1) оптимизирует до сложения

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

#include <avr/io.h>
int main(){
 uint8_t x = PINC;
 x *=2;
 PORTC = x;
 x <<=1;
 PORTC = x;
 return 0;
}
-O0
Спойлер

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

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
-Os
Спойлер

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

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	; 21
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Интересно... У меня avr-gcc 4.3.3, WinAVR 20100110.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

Недавно пробовал WinAVR-20090313 (avr-gcc 4.3.2), оптимизация не понравилась. Если хотите, могу поискать сам пример, но вряд ли найду.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Ну, я на 4.3.3 пока не жаловался...

Эх, жалко что для STM8 GCC пока не сделали. Приятные чипы (в основном, конечно, ценой), но приходится использовать Cosmic C compiler, а он несколько странный - в стандартной поставке нет даже stdint.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

"Не понравилось" - в смысле по сравнению с последним. С другой стороны, сколько читал сравнений, ни по объему, ни по скорости, gcc не рекордсмен.
STM8 gcc? Только что задал в поиске synaptic'а, пакет "sdcc" (Small Device C Compiler) вроде для этого и предназначен. Судя по описанию,
SDCC is a C compiler for the Intel MCS51 family, HC08, PIC,
GameBoy Z80, DS80S390, Z80, Z180 and STM8 microcontrollers.
Можете дать код для проверки? Я с stm8 дела не имел, так что сам не напишу.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Можете дать код для проверки?
OK, как только доберусь до основного компа - выложу. Вообще, надо попробовать этот SDCC.

А вы хотите протестить какой-то конкретный блок? Просто так-то Си везде один, отличаются особые конструкции, специфичные для компилятора (#pragma, методики определения прерываний и т.п.), ну и адреса/определения регистров и битов.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

Я хочу только проверить, тот ли это пакет. Изучать stm8 не планирую, разве что stm32. Поэтому хотелось бы не слишком сложный код и возможность проверки.
Аватара пользователя
scorpi_0n
Вымогатель припоя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Re: Оформление кода

Сообщение scorpi_0n »

Эх, жалко что для STM8 GCC пока не сделали
Да и врядли в ближайшее время сделают. СТМ8 хорош для мелких поделок так что выбор комилятора здесь как бы и неуместен.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Оформление кода

Сообщение COKPOWEHEU »

Так чем sdcc не устраивает? Вроде что-то компилирует.
Вложения
stm8.tar.gz
(9.71 КБ) 274 скачивания
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Оформление кода

Сообщение Alkul »

Я пишу комментарии вот в таком стиле (взят кусок реальной программы трехлетней давности)
Спойлер

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

;Подпрограмма инкремента счетчиков шагов
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			;
Причем в этом стиле пишется абсолютно вся программа, даже если в данный момент мне совершенно понятно, что делает этот кусок кода, все равно - подробные комментарии. Зато сопровождать мои программы потом одно удовольствие. И я, даже через год после написания программы очень быстро вспоминаю алгоритм и логику программы.
А в начале перед телом программы подробно расписано за что отвечает каждый использованный вывод микроконтроллера.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Я пишу комментарии вот в таком стиле
Все хорошо, только если бы еще не кириллицей - было бы совсем замечательно. Я вдоволь насмотрелся на комментарии в национальных кодировках, которые открываются непойми как.

Я тоже люблю оставлять достаточно подробные (в меру своей лени) комментарии.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Оформление кода

Сообщение Jack_A »

Alkul писал(а):Я пишу комментарии вот в таком стиле (взят кусок реальной программы трехлетней давности)

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


	push RH			;Сохранить на стеке
	push RL			;рег.пару RH:RL
	lds RL,MAINC_L		;Занести в рег.RL значение мл.байта основного счетчика
	lds RH,MAINC_H		;Занести в рег.RH значение ст.байта основного счетчика
;
Як на маю думку, это уже перебор. Что делают push и lds - это знает даже самый тупой потенциальный сопроводитель программы. Другое дело - какая "сверхзадача" этих манипуляций. Я в своих прогах - в подпрограмме, например - в начале расписывал назначение, диапазон применяемости, какие и где лежат аргументы , особенности п/п ( например: "Внимание! Рабочие регистры не сохраняются ! " ) и пр. В реализации описывал, не спускаясь до уровня каждой команды, работу функционально законченного фрагмента ( загрузили массив констант из флеши, вычислили по Пифагору полную мощность и пр. ) Ведь чересчур много комментов - плюс превращается в минус.
СпойлерЯ занимался спортивным ориентированием. Описывались соревнования где-то в Скандинавии: карта была настолько подробная, что был прорисован каждый бугорок, каждая ямка с полметра глубиной. Плотность информации немыслимая. Так вот, выиграли те, что плюнули на эту бездну сведений и просто бежали по азимуту как по ровному полю :) Это к слову.
Изображение
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Оформление кода

Сообщение Alkul »

YS писал(а): Все хорошо, только если бы еще не кириллицей - было бы совсем замечательно. Я вдоволь насмотрелся на комментарии в национальных кодировках, которые открываются непойми как.
Привычка писать кириллицей закрепилась после того, как устроился работать в "оборонку". Там при сдаче документации на изделие текст программы тоже должен сдаваться, как отдельный документ. Не всегда его требуют печатать, но он должен быть сдан в архив на CD или DVD-диске, ему присваивается децимальный номер. Заказчик "не поймет", если комментарии будут на английском.
А вопрос с кодировкой решается просто. Во-первых, сменить кодировку не проблема. Во-вторых, поскольку все пишется на ассемблере, то вопрос переносимости не ставится, и код по сути предназначен для одной и той же среды разработки. Более того, я очень сомневаюсь, что переносимость возможна даже на Си, если код по-настоящему оптимизировался для данного МК.
Jack_A писал(а): Як на маю думку, это уже перебор. Что делают push и lds - это знает даже самый тупой потенциальный сопроводитель программы.
Вопрос не в том, что делает команда push. В данном случае в комментарии просто написано, что команда push использована для сохранения регистров на стеке, а не, к примеру, для изменения адреса возврата путем манипуляций со стеком.

если б я строку lds RL,MAINC_L откомментировал, как "Занесение в регистр RL содержимого ячейки по адресу MAINC_L", это бы точно был бесполезный комментарий. А так я пишу, какие именно данные заносятся в регистр, это очень полезно для понимания алгоритма работы, когда смотришь на программу через годик после её написания.
Последний раз редактировалось Alkul Чт ноя 26, 2015 20:06:41, всего редактировалось 1 раз.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Оформление кода

Сообщение YS »

Привычка писать кириллицей закрепилась после того, как устроился работать в "оборонку". Там при сдаче документации на изделие текст программы тоже должен сдаваться, как отдельный документ. Не всегда его требуют печатать, но он должен быть сдан в архив на CD или DVD-диске, ему присваивается децимальный номер.
О-о-о, понимаю. :) Не то чтобы я работал прям на оборонку, но на работе имеется порядком олдскульных товарищей, и потому наша рабочая группа сейчас воюет с местными конструкторами на тему ЕСКД и ГОСТов. В чем дело - долгая история, но, в общем, я им упорно объясняю, что ГОСТы в наши дни являются рекомендательными (а не обязательными!) документами согласно федеральному закону о техническом регулировании (ст. 12), что DipTrace и КОМПАС 3D ничем не хуже Altium Designer, P-CAD и AutoCAD, и вообще, что им стоит отстать от меня и дать нормально работать, благо наша рабочая группа в некотором смысле не совсем относится к ним...
Более того, я очень сомневаюсь, что переносимость возможна даже на Си, если код по-настоящему оптимизировался для данного МК.
Код коду рознь. Если это какой-нибудь рассчетный алгоритм, не взаимодействующий с определенным железом, то он вполне будет переносим. :idea:
Во-первых, сменить кодировку не проблема.
У меня бывали случаи, когда код о-о-о-о-очень надо было посмотреть прямо сейчас, ну а под рукой, конечно, была только флешка с кодом и ближайший компьютер, на котором отродясь не стояло ничего подходящего, кроме разве notepad'а. Аналогичный случай - на планшете открыть письмо с кодом, и т.п.

А еще мне приходилось разбирать код с комментариями то ли на чешском, то ли на каком-то таком языке. Вроде бы и латиница, но от этого не легче. :))) Так что я предпочитаю человечно относиться к своим коллегам и писать латиницей (можно посмотреть везде) и на английском (поймет большинство разработчиков по всему миру).
это очень полезно для понимания алгоритма работы, когда смотришь на программу через годик после её написания.
Абсолютно поддерживаю! Комментарии очень помогают, когда через полгода-год заказчик просит что-то слегка поменять, или добавить фичу, или что-то скорректировать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Оформление кода

Сообщение Alkul »

YS писал(а):на работе имеется порядком олдскульных товарищей
"Олдскул" - это на самом деле очень хорошо, если там действительно специалист.
Сейчас среди разработчиков, особенно не "олдскульных", к сожалению, тоже начала превалировать тенденция к "одноразовым" разработкам. Мол, сделали - забыли.
Об архивном хранении документации, соответственно, речь тоже не идет. Подчас, и документации-то как таковой нет. Слова "учтенная копия" для "поколения Next" - пустой звук.
"Молодой" разработчик станет "суперпрофи", если, зная все современные тенденции разработки электроники и софта, еще "подхватит" у "олдскулов" грамотное отношение к организации процесса разработки и ведения документации.
YS писал(а):DipTrace и КОМПАС 3D ничем не хуже Altium Designer, P-CAD и AutoCAD
С этим полностью согласен, но с маленьким уточнением. В одной организации разработчики могут использовать любое ПО, но только обязательно однотипное. Чтобы не было такого, что, допустим, один конструктор работает в Компасе, другой - в Автокаде, а третьему удобнее рисовать чертеже в Ворде (тут утрирую, конечно). Чтобы не было такого, что один разработчик выполняет трассировку в P-CAD 2006, другому по душе SprintLayout, а третий упорно держится за P-CAD 4.5
В противном случае для нормальной работы у каждого разработчика на компьютере должен быть установлен весь "зоопарк" используемого софта и каждый должен будет знать все эти программы. Согласитесь, это неправильная ситуация.
К примеру, у нас конструкторы работают в Компасе 2D и 3D, а "электроники" - в P-CAD 2004. Я лично не вижу, чем Altium Designer в корне отличается от P-CAD последних версий. Более того, я и между P-CAD версий 2002, 2004 и 2006 не вижу коренных отличий, кроме несовпадения форматов выходных pcb-файлов.
YS писал(а):я им упорно объясняю, что ГОСТы в наши дни являются рекомендательными (а не обязательными!) документами согласно федеральному закону о техническом регулировании (ст. 12)
А вот это очень плохо, на мой взгляд. Ведь что значит ГОСТ? Это некий стандарт. Если, к примеру, производитель решил выпускать колбасу не по ГОСТу, это сто процентов будет означать ухудшение качества конечного продукта либо из-за замены ингредиентов на более дешевые и менее качественные, либо из-за упрощения техпроцесса.
И если законодатели пошли на это в угоду лобби производителей дерьма, то нормальные разработчики и производители не должны следовать этому примеру.
Ответить

Вернуться в «AVR»