LINUX.ORG.RU

Использование структур в программировании микроконтроллеров — дурной тон?

 , ,


1

1

$SUBJ. Где-то с месяц назад меня уверяли, что писать структуры, программируя мк, не нужно. Меня это слегка удивило, но ладно, спорить не стал — неблагодарное это дело. Сейчас делаю лабу и мыслительным органом чувствую, что тут нужна структура. Ну вот нужна и все, код тут же станет красивым и шелковистым. Я что-то делаю не так?

★★★★★

Потом тебе скажут, что использование C — дурной тон.

olibjerd ★★★★★
()

Где-то с месяц назад меня уверяли, что писать структуры, программируя мк, не нужно.

Аргументы они предоставили, или ты так, на слово поверил?

Dragon59 ★★
()
Ответ на: комментарий от ilovewindows

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

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от Dragon59

Аргументы они предоставили, или ты так, на слово поверил?

Раз спрашиваю, то наверное не поверил, а? ;-)
Были бы аргументы, не стал бы тут интересоваться, а принял бы решение самостоятельно.

f1xmAn ★★★★★
() автор топика

Иногда бывает какая нибудь miss-optimization связанная со структурами, обычно если их начать передавать через стек. Если не стек то обычно все хорошо, отличается только читаемостью кода. Сам использую всегда.

amaora ★★
()

Бред. Я и классы использую. И, даже, местами, шаблоны.

Если уж очень хочется следовать каким-то рекомендациям — кури гайды MISRA. Там, например, не рекомендуют динамическое выделение памяти использовать. Но насчёт структур что-то ничего не припомню.

alegz ★★★★
()

Да, если тебе кто-то скажет, что использование `goto` в сях — дурной тон, смело плюй этому идиоту в морду!

Eddy_Em ☆☆☆☆☆
()

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

legolegs ★★★★★
()
Ответ на: комментарий от Eddy_Em

без структур с USB или ethernet ты работать не сможешь

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

drBatty ★★
()
Ответ на: комментарий от amaora

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

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Да, если тебе кто-то скажет, что использование `goto` в сях — дурной тон, смело плюй этому идиоту в морду!

goto в сях - дурной тон. почти всегда. ПОЧТИ. иногда оно к месту. классика жанра - qsort, без goto оно тормозит. у меня, во всяком случае не получилось в своё время.

2all - может научите?

drBatty ★★
()
Ответ на: комментарий от Eddy_Em

Ну и хорошо, а-то я тут уже напряг интеллект, как бы это дело красиво без структур написать.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от drBatty

ПОЧТИ

Вот именно! А некоторые говорят — ВСЕГДА!

Вот я этих некоторых и имел в виду. Т.к. `goto` в сях нужен. Редко, но нужен.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от legolegs

например, не уметь передавать структуры в функции.

передавай указатель. Сами структуры часто дорого передавать, да и опасно.

drBatty ★★
()
Ответ на: комментарий от Eddy_Em

Ну так спионерь готовую и подрихтуй ☺

Не интересно. ☺

Зачем структура в шрифтах? Там же тупой массив MxN бит/байт.

Симпатишно так. Удобно писать, скажем

PORTX = MATRIX_A.row;
// code
PORTX = MATRIX_A.col;

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от drBatty

тетрис на sed

Ух, япона мать! Я в sed даже простые конструкции-то с пятого раза только правильно пишу…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А некоторые говорят — ВСЕГДА!

ну для начинающих - ВСЕГДА. Особенно для тех, кто знает бэйсик и/или ассемблер.

drBatty ★★
()
Ответ на: комментарий от f1xmAn

Еще раз: у тебя экран наверняка по SPI, работаешь ты с SPI наверняка по DMA, в одну переменную пихаешь адрес (блок пикселей), в другую — значение. Ну так проще же массивом фигачить!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от f1xmAn

тебе не кажется, что

int arr[10];
int i;
for (i = 0; i < 10; i++)
{
  arr[i] = 0;
}
читаемей, чем
int a0 = 0;
int a1 = 0;
int a2 = 0;
int a3 = 0;
int a4 = 0;
int a5 = 0;
int a6 = 0;
int a7 = 0;
int a8 = 0;
int a9 = 0;
?

не?

(цитата с лурки)

drBatty ★★
()
Последнее исправление: drBatty (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Ну конечно я не ручками буду биты в порт писать, а ф-я сама парсить текст и писать соответствующие значения как я написал. Или не? ☺

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от drBatty

Читаемее. А причем тут это? Каждый символ это 2 8-битные переменные, которые циклом хрен заполнишь.

f1xmAn ★★★★★
() автор топика

Либо это бородатые ассемблерщики, либо они боятся проблем с выравниванием полей структур.

unsigned ★★★★
()
Ответ на: комментарий от beastie

а как же выравнивание по умолчанию, тянущее лишнюю память в массивах структур? а как же выравнивание на байт, тянущее дополнительную арифметику в расчет смещения?

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

x0r ★★★★★
()
Ответ на: комментарий от f1xmAn

Каждый символ это 2 8-битные переменные, которые циклом хрен заполнишь.

да ладно!

drBatty ★★
()
Ответ на: комментарий от unsigned

либо они боятся проблем с выравниванием полей структур

А еще есть такая штука, как остро/тупоконечность. Но вот если бы все боялись ее, у нас бы до сих пор сеть через задницу функционировала.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от f1xmAn

Каждый символ это 2 8-битные переменные

Т.е. uint16_t?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Ну вот, я сейчас напишу, а вы потом до забана меня говнокодером обзывать будете. ☹

struct matrix_symbol
{
	char col, row; // столбец индикатора, его строка
} 
const MATRIX_A = {.row = 0b01010101, .col = 0b10101010};
// константы для остальных символов алфавита

matrix_symbol parse_matrix(char symbol) {
	matrix_symbol sym;
	switch(symbol) {
		case 'a': sym.row = 0b00001111; sym.col = 0b11110000; break;
		default: //нет такого символа, мы все умрем
	}
	return sym;
}

Ну и там где-то функцию притулить, которая будет строки парсить, вызывая на каждый символ функцию parse_matrix(..). Возвращать она будет массив matrix_symbol'ов, элементы которого специальной функцией будут записаны в соответствующие порты.

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Пардон, сонный мозг забыл о созданной константе, там я хотел sym = MATRIX_A; ну или сразу return MATRIX_A;

Ну да ладно, раз фигня. ☺

f1xmAn ★★★★★
() автор топика
Ответ на: комментарий от f1xmAn

А, тады по-другому: два массива, либо действительно массив структур.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от f1xmAn

не игнорь меня

С фига ли? Я только фрактала игнорил.

В общем, советую-таки тебе хотя бы одну-две библиотечки для работы с экранчиками посмотреть. Там сложного ничего нет. Плюс — шрифт тебе явно тырить оттуда придется, т.к. самому шрифты рисовать — геморрой тот еще!

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)

Пишем: putstruct(*structVar, sizeof(structVar));

Читаем:getstruct(*structVar, sizeof(structVar));

И ещё enum весчь.

ziemin ★★
()
Ответ на: комментарий от f1xmAn
unsigned char alpha[256][2] = 
{
  {0b01010101, 0b10101010},
  {0b01010101, 0b10101010},
  {0b01010101, 0b10101010},
  ...
};
#define COL
#define ALPHA_COL(a) (alpha[(unsigned char)a][0])
#define ALPHA_ROW(a) (alpha[(unsigned char)a][1])

porta = ALPHA_COL('a');
portb = ALPHA_ROW('a');
anonymous
()
Ответ на: комментарий от Eddy_Em

С фига ли? Я только фрактала игнорил.

Шутю я так.

В общем, советую-таки тебе хотя бы одну-две библиотечки для работы с экранчиками посмотреть. Там сложного ничего нет.

Посмотреть-то можно, ради примера, но использовать нельзя — я электронщик, а не программист, поэтому цель этих лаб не столько научиться программировать мк, сколько разобраться, как же там все работает.

f1xmAn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.