roboforum.ru

Технический форум по робототехнике.


Как не говнокодить на микроконтроллере? Поделитесь опытом

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Как не говнокодить на микроконтроллере? Поделитесь опытом

Сообщение ROBsoer » 30 окт 2013, 19:07

Доброго времени суток!
Имея некоторый опыт программирования, начал назревать вопрос создания своих библиотек. Так как кодинг на микроконтроллере (пишу для AVR, но думаю, что это не принципиально в даной ситуации) сильно отличается от высокоуровневого программирования, оказалось это не так просто. И обычные советы высокоуровневых программистов здесь не работают.
Взять хотя бы большое количество глобальных переменных, которые никак не засунеш в параметры с указателями из-за прерываний (могу ошибаться, поправьте если не так). Да и есть ли смысл их прятать туда? Насколько больше тактов выедают ф-ции с параметрами нежели без? А если оставляем глобальные переменные, то как делать универсальные библиотеки, подключение которых тянет за собой наименьшее количество телодвижений?
Для большого количества параметров одного обьекта используете структуры? Как это сказывается на быстродействии?

Вопросов по поводу универсальности микроконтроллерного кода очень много.
Поделитесь опытом. Кто какие правила для себя выработал по мере накопления опыта? Кто как достигает оптимального соотношения скорость/обьем?
Если соберется большое количество полезных советов, думаю их можно будет потом обьеденить в статью/инструкцию/мануал. В общем: "Как не говнокодить на микроконтроллере?"
ROBsoer
 
Сообщения: 7
Зарегистрирован: 25 май 2012, 17:19

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Aseris » 30 окт 2013, 22:26

Все зависит от камня на который пишется - 4Кб+256б , 256Кб+64Кб, 1мб...
Вобщем все зависит от обьемов, архитектуры и глюков/фич компилятора

обычно геттеры сетеры функций делаю через макра, махатся со стеком на малых контроллерах = путь к геморою и поиску где ж он валится в сложных проектах.

хороший тон писать коменты при установке битов, зачем его ставим, а не типа set reg A
Функции - оптимально 1,2 параметра размерности архитектуры, напр 8битные - uint8,char,etc.

по возможности везде юзать unsigned int, char, etc вместо привычных int, char int8, int16.. знаковые операции обычно толще беззнаковых..

еще че вспомню напишу..

Добавлено спустя 2 часа 31 минуту 50 секунд:
Re: Как не говнокодить на микроконтроллере? Поделитесь опытом
по возможности не использовать беззнаковое деление и умножение на 2,4,8,16,... использовать сдвиг в лево право... обычно апаратного делителя и множетеля нет.
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение RoboHobbyRu » 31 окт 2013, 01:42

Обычно микроконтроллерные компиляторы достаточно хорошо оптимизируют код, плохо дела обстоят только с некоторыми линкерами. Т.е. при линковке (которая часто подразумевает статическую) не выкидываются неиспользуемые функции.

П.С.
Деление и умножение по степеням 2-ки уже лет 10 назад компиляторы научились оптимизировать, если не больше. Поэтому код лучше писать понятный, если по логике есть деление, значит деление и нужно использовать.
RoboHobbyRu
 
Сообщения: 203
Зарегистрирован: 04 май 2013, 10:35
Откуда: Тюмень

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение AndreW82 » 31 окт 2013, 15:49

RoboHobbyRu писал(а):П.С.
Деление и умножение по степеням 2-ки уже лет 10 назад компиляторы научились оптимизировать, если не больше. Поэтому код лучше писать понятный, если по логике есть деление, значит деление и нужно использовать.
А я по привычке "сдвигаю" даже в проектах C# под "винду" и Java под "ведроид" :D.
ЗЫ ...кодить начинал на С++ под Palm OS... как же давно это было :roll:
Аватара пользователя
AndreW82
 
Сообщения: 170
Зарегистрирован: 14 ноя 2012, 21:30
Откуда: Моск. обл.

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Aseris » 31 окт 2013, 18:08

Обычно микроконтроллерные компиляторы достаточно хорошо оптимизируют код

Угу, ток, в моей практике ето только заявленная фича которая работает ток на простеньких проектах, на сложных артефакты вылазают.. Оптимально лучше писать изначально...

Деление и умножение по степеням 2-ки уже лет 10 назад компиляторы научились оптимизировать

Молодое поколение компилятор писателей об етом забыло, если судить по генерируемому листингу..., или работает на платной суперпро версии, в максимальном режиме оптимизации, которая дебаг анфрендли, т.е. толку от нее на сложном проекте 0, ибо дебаг версия не помещается в флеш :crazy:
Аватара пользователя
Aseris
 
Сообщения: 1142
Зарегистрирован: 01 сен 2009, 14:58
Откуда: Чехия
прог. языки: C/С++, VHDL, Verilog, ASM, Python

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение dccharacter » 31 окт 2013, 23:58

Для пиков много алгоритмов на microchip.su, особенно в архивах
Но на самом деле... Ну как не говнокодить. Кодить до тех пор пока ты не поймешь, что говнокодишь.
Я вон всю жизнь обнулял таймер в прерывании. И мне казалось это нормальным. Что тут может быть говнокодного.
А оказалось, что этим действием ты вводишь значительную погрешность входа в прерывание.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Madf » 01 ноя 2013, 03:10

Чтобы не говнокодить, нужно знать хорошо архитектуру, т.е. иметь опыт.
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Duhas » 01 ноя 2013, 12:18

а кроме знания архитектуры - как правильно сказали - кодить и расширять кругозор...

ПС я вот не мог вчера понять почему у меня при отправке пакета через уарт по прерываниям уходит только один символ, оказалось, и это прописано в ДШ, что меня настройки прерывания уарта надо при отключенных глобально прерываниях.. иначе они просто не применяются..
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Madf » 01 ноя 2013, 16:27

Ну так правильно, происходит задержка во времени и сбивка пакета. :D
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение ROBsoer » 01 ноя 2013, 17:41

Aseris писал(а):по возможности везде юзать unsigned int, char, etc вместо привычных int, char int8, int16.. знаковые операции обычно толще беззнаковых..

Тоже так пишу, даже в десктопных проэктах.

Aseris писал(а): обычно геттеры сетеры функций делаю через макра, махатся со стеком на малых контроллерах = путь к геморою и поиску где ж он валится в сложных проектах.

Грамотное использование макросов - очень полезная и важная тема.
Один из способов ее применения:
Код: Выделить всёРазвернуть
#ifndef _name_DEFINED_
#define _name_DEFINED_

//собственно код подключаемого файла

#endif

Использовать в сорцах. Помагает в больших проэктах избежать дублирования подключаемых файлов.

Еще к обязательным я бы вынес использования HEADERов с описанием переменных и функций. Для кого-то эти советы могут показаться банальными, но как показала практика многие, даже очень опытные, ими не пользуются.
Помню как на ПЯТОМ курсе, в процессе написания дипломного проекта, друг открыл для себя табулирования кода.

Madf писал(а):Чтобы не говнокодить, нужно знать хорошо архитектуру, т.е. иметь опыт.

Так вот я и предлагаю поделится опытом. Кто какие правила для себя определил.

Возвращаясь к вопросу о глобальных переменных и ф-циях с параметрами. Есть ли смысл отказываться от глобальных переменных в пользу параметров, если мы и так крутимся в одном глобальном while(1) и локальные переменные с памяти выгружаться не будут?
ROBsoer
 
Сообщения: 7
Зарегистрирован: 25 май 2012, 17:19

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Duhas » 01 ноя 2013, 19:41

Madf писал(а):Ну так правильно, происходит задержка во времени и сбивка пакета. :D

нет, просто не срабатывает прерывание по опустошению буфера, т.к. оно включалось без выключения глобально прерывания.. это фича железа..
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение legion » 14 апр 2014, 09:55

Задумался, как не говнокодить на asm'е... Ушел в глубокую депрессию :D
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение esisl » 16 апр 2014, 16:07

Не мучайтесь, просто возьмите молот... тьфу! Контроллер потолще. Они щас по цене, как трава...
esisl
 
Сообщения: 1480
Зарегистрирован: 23 июл 2012, 15:24

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение Duhas » 17 апр 2014, 05:18

вот не надо в такой теме такие советы давать...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Как не говнокодить на микроконтроллере? Поделитесь опыто

Сообщение legion » 17 апр 2014, 09:45

Результат моих размышлений о том, как на асм не говнокодить - чаще использовать макросы для повышения самодокументированности кода и изучить препроцессор.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28