roboforum.ru

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

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

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

ROBsoer » 30 окт 2013, 19:07

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

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

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,... использовать сдвиг в лево право... обычно апаратного делителя и множетеля нет.

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

RoboHobbyRu » 31 окт 2013, 01:42

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

П.С.
Деление и умножение по степеням 2-ки уже лет 10 назад компиляторы научились оптимизировать, если не больше. Поэтому код лучше писать понятный, если по логике есть деление, значит деление и нужно использовать.

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

AndreW82 » 31 окт 2013, 15:49

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

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

Aseris » 31 окт 2013, 18:08

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

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

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

Молодое поколение компилятор писателей об етом забыло, если судить по генерируемому листингу..., или работает на платной суперпро версии, в максимальном режиме оптимизации, которая дебаг анфрендли, т.е. толку от нее на сложном проекте 0, ибо дебаг версия не помещается в флеш :crazy:

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

dccharacter » 31 окт 2013, 23:58

Для пиков много алгоритмов на microchip.su, особенно в архивах
Но на самом деле... Ну как не говнокодить. Кодить до тех пор пока ты не поймешь, что говнокодишь.
Я вон всю жизнь обнулял таймер в прерывании. И мне казалось это нормальным. Что тут может быть говнокодного.
А оказалось, что этим действием ты вводишь значительную погрешность входа в прерывание.

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

Madf » 01 ноя 2013, 03:10

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

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

Duhas » 01 ноя 2013, 12:18

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

ПС я вот не мог вчера понять почему у меня при отправке пакета через уарт по прерываниям уходит только один символ, оказалось, и это прописано в ДШ, что меня настройки прерывания уарта надо при отключенных глобально прерываниях.. иначе они просто не применяются..

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

Madf » 01 ноя 2013, 16:27

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

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) и локальные переменные с памяти выгружаться не будут?

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

Duhas » 01 ноя 2013, 19:41

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

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

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

legion » 14 апр 2014, 09:55

Задумался, как не говнокодить на asm'е... Ушел в глубокую депрессию :D

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

esisl » 16 апр 2014, 16:07

Не мучайтесь, просто возьмите молот... тьфу! Контроллер потолще. Они щас по цене, как трава...

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

Duhas » 17 апр 2014, 05:18

вот не надо в такой теме такие советы давать...

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

legion » 17 апр 2014, 09:45

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


Rambler\'s Top100 Mail.ru counter