Страница 343 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб май 09, 2020 23:08:33
Shuspano
Похоже я прогневал кого-то из программистских богов.
Пытался выделить функцию hc595send() в отдельный файл, чтоб спокойно потестить логические функции - она отказалась работать. Притащил осциллограф, чтоб посмотреть чего выдает аттини13, а после измерений он отказался прошиваться через усбасп. Сходил за большим программатором (top-3000), вставил тиньку, сбросил на заводские фузы, все шьется, все хорошо. Подключил к усбасп - не шьется. Опять в большой программатор, подключаю его к компу - венда выдает синего.
Кажется, на сегодня хватит.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 18:53:43
Shuspano
Добрый день!
Возникла проблема. Компилятор опять ругается:
Код: Выделить всё
D:\avr>make func_test.c attiny13a
func_test.c: In function 'main':
func_test.c:123:2: warning: '__progmem__' attribute ignored [-Wattributes]
const unsigned char lcd_data[] PROGMEM = "Hello, Radiokot";
^
func_test.c:125:7: warning: assignment discards 'const' qualifier from pointer t
arget type [enabled by default]
dptr = lcd_data;
^
Явно что-то не так, но при этом (что необычно) все работает так, как хотел.

Догадываюсь, накосячил с указателем, но как?
Функция main():
Код: Выделить всё
{
setup();
lcd_init();
lcd_setup();
const unsigned char lcd_data[] PROGMEM = "Hello, Radiokot";
char *dptr;
dptr = lcd_data;
int i;
for (i = 0; i < 14; i ++)
{
send_data(*dptr);
dptr++;
}
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 19:16:31
ARV
Shuspano писал(а):Явно что-то не так, но при этом (что необычно) все работает так, как хотел.
работает - потому что не ошибка, а варнинг.
а не так то, что
dptr у вас "указатель на символ" (т.е. на ОЗУ), а массив
lcd_data - это "массив неизменяемых символов во FLASH", то есть типы указателей не одинаковы, вот и предупреждает.
совет вам: избавляйтесь от PROGMEM, заменяйте это на корректное и правильное
const __flash (вы ж не WinAVR используете? новые версии так могут):
Код: Выделить всё
const __flash unsigned char lcd_data[] = "Hello, Radiokot";
const __flash char *dptr;
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 19:58:30
Shuspano
Спасибо!
Не, у меня блокнот, avr-gcc, и дудка. Я просто знаю как это делать на ассемблере: строка размещается директивой DB, адрес строки в16-битный регистр-указатель, а там - MOVC или LPM. Я погуглил, нашел кое что у DI HALT, и решил что PROGMEM - это аналог этой директивы.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 20:19:15
ARV
Shuspano писал(а):Не, у меня блокнот, avr-gcc, и дудка.
и чо? WinAVR - это довольно древняя версия avr-gcc. если у вас свежая версия - пользуйтесь тем, что я рекомендовал.
Shuspano писал(а):Я просто знаю как это делать на ассемблере
забудьте! если взялись за Си, пользуйтесь средствами Си, чтобы быстрее войти в струю. разумеется, запаситесь справочником каким-нибудь по основным определениям, правилам, функциям и т.п. для Си. и реализовывайте свои алгоритмы уже этими средствами.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 20:37:20
oleg110592
[uquote="Shuspano",url="/forum/viewtopic.php?p=3841042#p3841042"]Догадываюсь, накосячил с указателем, но как?[/uquote]
можно попрбовать
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 20:50:13
Shuspano
Не, так не компиляется
Код: Выделить всё
D:\avr>make func_test.c attiny13a
func_test.c: In function 'main':
func_test.c:123:2: error: '__flash' specified for auto variable 'lcd_data'
const __flash unsigned char lcd_data[] = "Hello, Radiokot";
^
avr-objcopy: 'func_test.elf': No such file
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 20:54:23
ARV
Shuspano писал(а):Не, так не компиляется
вынесите этот массив в область глобальных переменных, то есть за пределы функции, вот и вся проблема.
Добавлено after 1 minute 15 seconds:
кстати, для символьных строк правильнее применять просто char, а не unsigned char - все стандартные функции рассчитаны именно на char - будете ловить варнинги...
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 21:12:45
oleg110592
[uquote="Shuspano",url="/forum/viewtopic.php?p=3841090#p3841090"]Не, так не компиляется[/uquote]
так норм.

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 22:55:01
Shuspano
В общем, это сделать невозможно. Как только не пробовал, засыпает ошибками. Потому, буду использовать первоначальный рабочий вариант.
Простых понятных примеров рабочего прогмема класса хеллворлд найти не могу, везде либо простынки где непонятно что к чему, либо еще менее понятные какие-то двухкоординатные char[j]
Хочу допилить и сделать покрасивше подпрограммы для индикатора. В связи с тем вопрос: а как ставить и снимать биты в unsigned char в одной строке одновременно?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 23:02:43
WiseLord
Код: Выделить всё
a |= (1<3); // установить бит 3 переменной a
a &= ~(1<<3); // очистить бит 3 переменной a
Ну или макрос _BV есть
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 23:24:21
Shuspano
Так я знаю. Но вроде как можно в одну строку... или нет?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 23:32:26
WiseLord
А чем это не в одну строку? Или нужно и то и другое сразу? Если так, то можно тое накрутить каким-нибудь макросом, но стандартного простого способа вроде как нет.
Код: Выделить всё
a = (a | ((1<<2) | (1<<0))) & ~((1<<4) | (1<<1));
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср май 13, 2020 23:46:48
NStorm
Нуу.... проще и нагляднее в 2 строки написать, если не все биты меняются. А то получается хрень, вроде такой:
Добавлено after 4 minutes 39 seconds:
А, ну да,
WiseLord правильнее написал, у меня лишний шаг И.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 00:00:31
Мурик
NStorm писал(а):Нуу.... проще и нагляднее в 2 строки написать
Так нагляднее, а с точки зрения компилятора это одна строка.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 00:52:35
Аlex
[uquote="Shuspano",url="/forum/viewtopic.php?p=3841172#p3841172"]Но вроде как можно в одну строку...[/uquote]

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 04:55:22
VladislavS
Господа, не забыаайте, что вы с AVR имеете дело. При работе с портами такие директивы компилятор в CBI и SBI транслирует. Одним выражением (не строкой конечно же, тут вас Аlex круто подколол) будет "чтение - модификация - запись".
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 08:50:08
NStorm
При работе с портами такие директивы компилятор в CBI и SBI транслирует
Только если будет меняться всего 1 бит. Если больше 1го, всё-равно будет R-M-W с OR/AND.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 08:52:39
ARV
[uquote="Shuspano",url="/forum/viewtopic.php?p=3841172#p3841172"]Так я знаю. Но вроде как можно в одну строку... или нет?[/uquote]
В Си нет прямой связи между количеством строк и чем-то ещё, размером кода, например, или скоростью его исполнения. Зато часто прослеживается связь "меньше строк - менее понятно - больше вероятность ошибки".
Добавлено after 2 minutes 14 seconds:
[uquote="NStorm",url="/forum/viewtopic.php?p=3841259#p3841259"]Только если будет меняться всего 1 бит. Если больше 1го, всё-равно будет R-M-W с OR/AND.[/uquote]так вроде и SBI тоже RMW... Или я путаю?
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт май 14, 2020 09:07:29
NStorm
Не, SBI/CBI - одна инструкция на асме.
Зато часто прослеживается связь "меньше строк - менее понятно - больше вероятность ошибки".
Ну это имеет смысл, если по какой-то причине установку и снятие бита надо проводить атомарно, при этом не весь регистр писать. За всё время в реальности ни разу такой необходимости не встречал...