Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Хочу писать грамотный и красивый код (IAR C AVR)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Daisy
Здравствуйте.
Хотелось бы на примере красивых исходников или неких правил и установок поучиться писать программы (пишу на ИАР для АВР).
Преследуются такие цели как читаемость, понимаемость и относительная легкость внесения добавлений и исправлений в программный код.
Пока пишу с места в карьер. Методом проб и ошибок. В результате получаю "снежный ком" кода, из которого что только не торчит :-)
Скиньте пожалуйста если у кого что-нибудь есть. Или ссылкой поделитесь.
MALLOY2
Вот читай ! Но все это поверхностно, у каждого компилятора та даже от версии к версии может все менятся, ачто касается красоты так она обычно не совместима с производительностью, и все этьо приходит с опытом чем больше пишеш тем красивие программы smile.gif
MALLOY2
Вот еще коечто нашел правда на англицком
Daisy
Цитата(MALLOY2 @ Jul 27 2005, 15:12)
Вот еще коечто нашел правда на англицком
*

Спасибо. Буду кодосовершенствоваться. Английкий - не страшно.
BVU
Почитайте стандарт языка Си (ANSI) - для знания аспектов языка Си, хотя я начинал его изучение с книги Керниган/Ритчи, которая в 80-х годах считалась "настольной книгой" для программиста на Си.
Если же Вам необходима красота исходного кода(удобство в читаемости программ), то такие стандарты написания кода(на Си) имеются практически у каждой фирмы производителя software, особенно если она имеет категорию качества по стандарту CMM или другому. Далее если же Вам надо овладеть искусством алгоритмов, то далеко ходить не надо, Кнутт изложил это в своем трех-томнике.
Evgeny_CD
Цитата(MALLOY2 @ Jul 27 2005, 16:12)
Вот еще коечто нашел правда на англицком
*

http://www.chris-lott.org/resources/cstyle...hill-cstyle.pdf
вроде как свежая верия того же, но отличия мелкие.
Evgeny_CD
Вот еще нелохая книга по идеологии работы с кодом для больших проектов.

webfile.ru/428226

Как скачаете - дайте знать на esp1@kbkcc.ru, чтобы я мог выложить ссылку в public domain.
alexs
Цитата(Daisy @ Jul 27 2005, 16:16)
Здравствуйте.
Хотелось бы на примере красивых исходников или неких правил и установок поучиться писать программы (пишу на ИАР для АВР).
Преследуются такие цели как читаемость, понимаемость и относительная легкость внесения добавлений и исправлений в программный код.
Пока пишу с места в карьер. Методом проб и ошибок. В результате получаю "снежный ком" кода, из которого что только не торчит :-)
Скиньте пожалуйста если у кого что-нибудь есть. Или ссылкой поделитесь.
*

На сайте Atmel :Application Note: AVR035: Efficient C Coding for AVR.
Там как раз на IARе.
Maker6
Купил недавно книгу
Керниган-Пайк "Практика программирования"
Изд.дом Вильямс 2004 год 288 с

Книга достаточно интересная, хотя некоторые моменты ныне считаются спорными (это перевод восьмого издания этой книги).

На основе простых примеров определяются правила проектирования, кодирования и отладки на С
IV_K
советую почитать "Искусство программирования на С" Ричард Хэзфилд, Лоуренс Кирби. Там это подробно обсасывается
ControllerZ
Цитата(Daisy @ Jul 27 2005, 16:16)
Здравствуйте.
Хотелось бы на примере красивых исходников или неких правил и установок поучиться писать программы (пишу на ИАР для АВР).
Преследуются такие цели как читаемость, понимаемость и относительная легкость внесения добавлений и исправлений в программный код.
Пока пишу с места в карьер. Методом проб и ошибок. В результате получаю "снежный ком" кода, из которого что только не торчит :-)
Скиньте пожалуйста если у кого что-нибудь есть. Или ссылкой поделитесь.
*

Также не маловажно знать и уметь пользоваться архитектурой процессора, это очень важная деталь в программировании.
ek74
Цитата(IV_K @ Aug 1 2005, 14:16)
советую почитать "Искусство программирования на С" Ричард Хэзфилд, Лоуренс Кирби. Там это подробно обсасывается
*

Кстати, если нужно, то могу дать исходники всех примеров их этой книги (500 кб в архиве)

Кроме этого есть следующие книги (правда большинство из них - это C++, но тоже пожно почитать):

1. Programming languages, their environments and system software interfaces - Extensions for the programming language C to support embedded processors
2. C Style Guide for embedded systems
3. Embedded C - Traps and Pitfalls
4. Programming Embedded Systems in C and C++ by Michael Barr

5. ANSI/ISO C++ Professional Programmer's Handbook
6. Algorithms and Data Structures in C++ by Alan Parker
7. Patterns, Models, and Application Development: A C++ Programmer's Reference by Julio Sanchez; Maria P. Canton
8. C++ Programming Unleashed
9. C++ Gotchas: Avoiding Common Problems in Coding and Design By Stephen C. Dewhurst
10. C++ FAQs, Second Edition By Marshall Cline, Greg Lomow, Mike Girou
11. Efficient C++ Performance Programming Techniques By Dov Bulka, David Mayhew
nml
А вот вопрос знатокам С для АВРов.

Понадобилась перетасовка битов в int - по сути, транспонировать матрицу 4*4. Чтоб не мудрить - решил просто, в лоб - 16 команд перестановки битиков, объявив этот int в union-е с битовой структурой. Типа такого:
Код
 dst.b0 = src.b0;
 dst.b4 = src.b1;
 dst.b8 = src.b2;
 и т.д.


Учитывая умность компилятора, хотел увидеть что-то типа - src в регистры, потом 16 пар BST/BLD, и результат из регистров в dst. использование 4-х регистров, - не напрягает, по моему. Но. Получил код такой (оптимизация high):
Код
  \   0000012E   2F32               MOV     R19, R18
  \   00000130   7031               ANDI    R19, 0x01
  \   00000132   2F02               MOV     R16, R18
  \   00000134   0F00               LSL     R16
  \   00000136   0F00               LSL     R16
  \   00000138   0F00               LSL     R16
  \   0000013A   2B03               OR      R16, R19
  \   0000013C   7101               ANDI    R16, 0x11
  \   0000013E   2F32               MOV     R19, R18
  \   00000140   9536               LSR     R19
  \   00000142   9536               LSR     R19
  \   00000144   9536               LSR     R19
  \   00000146   7032               ANDI    R19, 0x02
  \   00000148   2B30               OR      R19, R16
  \   0000014A   2F02               MOV     R16, R18
  \   0000014C   7200               ANDI    R16, 0x20
  \   0000014E   2B03               OR      R16, R19
  \   00000150   2F31               MOV     R19, R17
  \   00000152   FB30               BST     R19, 0
  \   00000154   E030               LDI     R19, 0
  \   00000156   F932               BLD     R19, 2
  \   00000158   2B30               OR      R19, R16
  \   0000015A   2F01               MOV     R16, R17
  \   0000015C   9502               SWAP    R16
  \   0000015E   7F00               ANDI    R16, 0xF0
  \   00000160   0F00               LSL     R16
  \   00000162   7400               ANDI    R16, 0x40
  \   00000164   2B03               OR      R16, R19
  \   00000166   2F31               MOV     R19, R17
  \   00000168   9536               LSR     R19
  \   0000016A   7038               ANDI    R19, 0x08
  \   0000016C   2B30               OR      R19, R16
  \   0000016E   2F01               MOV     R16, R17
  \   00000170   0F00               LSL     R16
  \   00000172   0F00               LSL     R16
  \   00000174   7800               ANDI    R16, 0x80
  \   00000176   2B03               OR      R16, R19
  \   00000178   930C               ST      X, R16
  \   0000017A   2F02               MOV     R16, R18
  \   0000017C   FB02               BST     R16, 2
  \   0000017E   E000               LDI     R16, 0
  \   00000180   F900               BLD     R16, 0
  \   00000182   2F32               MOV     R19, R18
  \   00000184   0F33               LSL     R19
  \   00000186   2B30               OR      R19, R16
  \   00000188   7131               ANDI    R19, 0x11
  \   0000018A   2F02               MOV     R16, R18
  \   0000018C   9502               SWAP    R16
  \   0000018E   700F               ANDI    R16, 0x0F
  \   00000190   9506               LSR     R16
  \   00000192   7002               ANDI    R16, 0x02
  \   00000194   2B03               OR      R16, R19
  \   00000196   9526               LSR     R18
  \   00000198   9526               LSR     R18
  \   0000019A   7220               ANDI    R18, 0x20
  \   0000019C   2B20               OR      R18, R16
  \   0000019E   2F01               MOV     R16, R17
  \   000001A0   7004               ANDI    R16, 0x04
  \   000001A2   2B02               OR      R16, R18
  \   000001A4   2F21               MOV     R18, R17
  \   000001A6   0F22               LSL     R18
  \   000001A8   0F22               LSL     R18
  \   000001AA   0F22               LSL     R18
  \   000001AC   7420               ANDI    R18, 0x40
  \   000001AE   2B20               OR      R18, R16
  \   000001B0   2F01               MOV     R16, R17
  \   000001B2   9506               LSR     R16
  \   000001B4   9506               LSR     R16
  \   000001B6   9506               LSR     R16
  \   000001B8   7008               ANDI    R16, 0x08
  \   000001BA   2B02               OR      R16, R18
  \   000001BC   7810               ANDI    R17, 0x80
  \   000001BE   2B10               OR      R17, R16
  \   000001C0   8311               STD     Z+1, R17

... то есть более 70 команд (вместо 32). Жуть какая-то. Где-то я напортачил или все-таки этот ИАР местами глупости выдает?

Кстати, когда это же было в процедуре - там компилятор вообще построил код такой, что использовался только R16 и все через память...

Странно это, однако.
IV_K
<pre>
//
static union {
INT16U w;
struct {
INT16U b0:1; INT16U b4:1; INT16U b8:1; INT16U b12:1;
INT16U b1:1; INT16U b5:1; INT16U b9:1; INT16U b13:1;
INT16U b2:1; INT16U b6:1; INT16U b10:1; INT16U b14:1;
INT16U b3:1; INT16U b7:1; INT16U b11:1; INT16U b15:1;
};
}src,dst;

src.w = A;
dst.w = 0;

if (src.b0) dst.b0 = 1;
if (src.b4) dst.b1 = 1;
if (src.b8) dst.b2 = 1;
if (src.b12) dst.b3 = 1;

if (src.b1) dst.b4 = 1;
if (src.b5) dst.b5 = 1;
if (src.b9) dst.b6 = 1;
if (src.b13) dst.b7 = 1;

if (src.b2) dst.b8 = 1;
if (src.b6) dst.b9 = 1;
if (src.b10) dst.b10 = 1;
if (src.b14) dst.b11 = 1;

if (src.b3) dst.b12 = 1;
if (src.b7) dst.b13 = 1;
if (src.b11) dst.b14 = 1;
if (src.b15) dst.b15 = 1;


// dst.b0 = src.b0;
// dst.b4 = src.b1;
// dst.b8 = src.b2;
// dst.b12 = src.b3;

// dst.b1 = src.b4;
// dst.b5 = src.b5;
// dst.b9 = src.b6;
// dst.b13 = src.b7;

// dst.b2 = src.b8;
// dst.b6 = src.b9;
// dst.b10 = src.b10;
// dst.b14 = src.b11;

// dst.b3 = src.b12;
// dst.b7 = src.b13;
// dst.b11 = src.b14;
// dst.b15 = src.b15;

A = dst.w;

</pre>


а так еще круче!! =))))
register union спасет отца русской демократии
nml
Цитата(IV_K @ Aug 9 2005, 15:09)
а так еще круче!! =))))
register union спасет отца русской демократии
*


Не, не круче. Команд конечно меньше, но работает с памятью, а это еще по 4 такта на действие... Не то. Объявлять же в регистрах - и занять ради этого 4 регистра - как-то тоже не хочется.

Таки лучше всего спасает ассемблерная процедура. Хотя, согласен - не лучший выход.

Или я просто от компилятора слишком многого хочу?
IV_K
if (src.b0) dst.b0 = 1; это выражение занимает 2 команды

dst.b0 = src.b0; это больше

как по другому соптимизировать не знаю

Компилятор кажется на таких процедурах очень тупит.. (если бы переменные были volatile, тогда понятно)
а кто мешает объявить register в процедуре.. вроде бы компилер регистры в стек засунуть должен (не проверял)
bialix
Кроме правил эстетического оформления программ, имеет смысл сразу знакомиться с правилами логического оформления программ. Рекомендую:

http://joelonsoftware.com/articles/Wrong.html
impatt
Если разговор про оформление, то практически из любого фарша приводит в нормальный вид исходники прога indent. Все параметры настраиваются.
prottoss
Цитата(nml @ Aug 9 2005, 21:19)
Цитата(IV_K @ Aug 9 2005, 15:09)
а так еще круче!! =))))
register union спасет отца русской демократии
*


Не, не круче. Команд конечно меньше, но работает с памятью, а это еще по 4 такта на действие... Не то. Объявлять же в регистрах - и занять ради этого 4 регистра - как-то тоже не хочется.

Таки лучше всего спасает ассемблерная процедура. Хотя, согласен - не лучший выход.

Или я просто от компилятора слишком многого хочу?
*



Может просто применить в корне другой алгоритм для задачи в целом (я имею ввиду вообще отказаться от процедуры перестановки бит)? Ведь у любой задачи есть бесчисленное множество решений. И не факт, что Ваше верное...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.