Посоветуйте литературу для изучения Си

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

:tea:
http://easyelectronics.ru/rabota-s-port ... na-si.html

typedef struct Bits_t
{
uint8_t Bit0 :1;
uint8_t Bit1 :1;
uint8_t Bit2 :1;
uint8_t Bit3 :1;
uint8_t Bit4 :1;
uint8_t Bit5 :1;
uint8_t Bit6 :1;
uint8_t Bit7 :1;
}Bits;

#define PortaBits (*((volatile Bits*)&PORTA))
#define LedPin PortaBits.Bit5

int main()
{
DDRA = 1 << 5;
while(1)
{
LedPin = 1;//зажечь
_delay_ms(100);
LedPin = 0;//выключить
_delay_ms(100);
}
}

:tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

pcb писал(а):http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollerov-na-si.html
автор хотел продемонстрировать глубину своих знаний С/С++ ? у него получилось в полной мере.

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

pcb писал(а):

Код: Выделить всё

typedef struct Bits_t
{
	uint8_t Bit0 :1;
	uint8_t Bit1 :1;
	uint8_t Bit2 :1;
	uint8_t Bit3 :1;
	uint8_t Bit4 :1;
	uint8_t Bit5 :1;
	uint8_t Bit6 :1;
	uint8_t Bit7 :1;
}Bits;
 
#define PortaBits (*((volatile Bits*)&PORTA))
#define LedPin PortaBits.Bit5
 
int main()
{
	DDRA = 1 << 5;
	while(1)
	{
		LedPin = 1;//зажечь 
		_delay_ms(100);
		LedPin = 0;//выключить
_delay_ms(100);
	}
}
и что это должно демонстрировать? как с моей точки зрения - плохой стиль программирования.

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

Мой уютный бложик... заходите!
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 193
Зарегистрирован: Пн апр 15, 2013 21:25:00
Откуда: Россия, Киров

Сообщение Cyber-master »

Я в свое время (лет 12 назад) начинал по страуструпу, керригану и т.п. учебникам изучать С++. Просто как хобби. Еще под досом начинал (с паскаля переходил). Потом, уже под виндами, купил книжку по Win SDK, по ней погнал проги под винду... А когда дошло до контроллеров, первым я взял тиньку 2313, прочитал вдумчиво весь даташит, раза 3, и сел писать. Первая прога, действительно, в блокноте была. С++ в контроллерах такой же точно, а когда компилятор ругнется - погуглить надо)))

Ну и если мне будет позволено подключиться к, гм, срачу извините, спору, я не понимаю, чем неправославно, например, такое:

Код: Выделить всё

#define STATUS_LED PINB.1

...

STATUS_LED = 1;
Это если просто ногой подергать.
[/code]
Придумать бы, ЧТО создавать, остальное - дело техники
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Дык... ARV уже сказал же... можно спутать с переменной... неинформативно...
Да и макросы... ИМХО... должны быть однозначными... типа...
LED_GREEN_On();
или
LED_RED_Off();
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я не зря в предыдущем посте написал про веревку и ногу :)))

мое отношение к стилю программирования сильно изменилось после прочтения книги А.И.Голуба "Веревка достаточной длины, чтобы выстрелить себе в ногу" - рекомендую :)))

в вашем примере макрос хотя бы набран заглавными буквами, что при определенном стиле заставит подозревать, что это не просто переменная... и тем не менее PINB.1 - это в контексте языка Си ошибочная запись. и, на сколько я могу судить, даже для С++ эта запись недопустима. ни у Страуструпа, ни у Кернигана&Ричи вы не найдете ничего подобного, и любой уважающий себя компилятор ЯЗЫКА СИ должен на такую запись реагировать выдачей сообщения об ошибке.

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Cyber-master писал(а):я не понимаю, чем неправославно, например, такое:

Код: Выделить всё

#define STATUS_LED PINB.1

...

STATUS_LED = 1;
Это если просто ногой подергать.
Такая конструкция студией не прожевывается.
Именно И соответственно некоторые проекты приходится переписывать заново, разгребая и без того корявый говнокод
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 193
Зарегистрирован: Пн апр 15, 2013 21:25:00
Откуда: Россия, Киров

Сообщение Cyber-master »

Прошу прощения, спутал.. Конечно же, PORTB.1
В CVAVR нормально компилится

Я так понял, вам не нравится ".1" ? Вроде как в стиль языка не попадает?
тогда, может быть:

Код: Выделить всё

#define STATUS_LED 0x80;

PORTB |= (STATUS_LED); // включить 

...

PORTB &= ~(STATUS_LED); //выключить

(пример взят из работы с SREG, управление прерываниями).

Как выбрать веревку не сильно длинную, но и не сильно запутанную?

И еще, на секундочку! С точки зрения классического С++ это может быть и не очень... Но вспомним о том, что мы программируем МК!
И тогда все максимально просто и логично:
В начале кода лежит список define'оф, которые связывают аппаратную и программную части. А ниже по коду уже без привязки к аппаратной чатси.
Разве нет?
Придумать бы, ЧТО создавать, остальное - дело техники
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

Ну блистать так блистать. ;-)
Cyber-master писал(а):

Код: Выделить всё

#define STATUS_LED 0x80;

PORTB |= (STATUS_LED); // включить 

...

PORTB &= ~(STATUS_LED); //выключить

Скобки лишние. Даже если тело дефайна сложно-составное - даже в этом случае Святые Отцы усердно лупят нас по головам своими посохами дабы тела и параметры в дефайнах скобками окружаемы были во избежание мутно-чтений кода ими злоупотребляща и последующих сквернословий в адрес мараки-автора. Да и точка с запятой финальная в дефайне зело злобно порой кусает аки гадюка седалища наши - попробуй ка за-OR-ить да хотя-бы вот так: STATUS_LED | STATUS_LED. Что, братия, выкусим? ;-) Так отож...

А для наглядности да консистентности ко писаниям даташитным черти заморские так и вообще сдвигом маски определяють:

Код: Выделить всё

#define STATUS_LED (1 << 7) // 7-ой пинъ, ога ...

PORTB |= STATUS_LED; // включить 

...

PORTB &= ~STATUS_LED; //выключить

А вообще, ИМХО, к коду требования как к хорошей книжке - чтобы читать можно было да глазом не спотыкаться о ошибки, чтобы строчки не по бычьим струям ровнялись и чтобы не раскрывалось в каждом абзаце про "конструкционный элемент силикатно-песчаной смеси формы правильного параллелепипеда цветом близким к белому" а писалось по-простому, по-пролетарски "КИРПИЧ". Собираемся строить дом -> определяемся с терминологией -> строим дом не отвлекаясь на хим.состав стройматериалов. Так что дефайны в разумном количестве сильно упрощают жизнь, поддержку и усовершенствование наших продуктов. :-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 193
Зарегистрирован: Пн апр 15, 2013 21:25:00
Откуда: Россия, Киров

Сообщение Cyber-master »

Про точку с запятой в дефайне согласен, маху дал-с... проглядел, одним словом.

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

У меня вопрос то собственно чуть шире. Здесь же на формух читал темы, где люди пытаются структурировать обращение к пинам, такх структур/макросов/ООП/бабушкиных огородов городят что к концу страницы напрочь мозг взрывается. И называют это "удобным", хех. ИМХО понятнее битовой маски вряд ли чего придумаешь. Тем более что насколько я понимаю, аппаратно (ну то бишь на выходе у ккомпилятора) что-то похожее и бывает... Да и в асме так же дела выглядят.
Красивость кода, конечно же, дело зело нужное, но свое-то время нужно беречь! К чему столько лишних сущностей?
Придумать бы, ЧТО создавать, остальное - дело техники
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 48
Зарегистрирован: Вс янв 20, 2008 19:44:22

Сообщение Noblako »

bob1 писал(а):Шпак Ю.А. - Программирование на языке С для AVR и PIC микроконтроллеров
Самая гавенная книга! Беглый справочник, в котором автор захотел в четырехстах страницах описать PIC и AVR архитектуры, все среды программирования, и основы языка Си - получилась невнятная каша!
Встал на лапы
Сообщения: 90
Зарегистрирован: Вс июн 14, 2009 22:28:30

Сообщение vasylll »

Я не спец, я только пытаюсь с очередного захода ...
Вот попадалась не похожих темах ... советы с чего ...
Некоторые высказывались, что с Кернигана&Ричи нельзя начинать.
Что это уже для более подготовленных. И что в качестве первой книги даже вредно.
Другие высказываются, что это библия №1.
Проясните если не так.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Если у вас вообще нет никакого опыта в программировании, то я бы советовал для начала почитать что-то по алгоритмизации (правда сам я хороших книг об этом не встречал).
Если же есть хоть какой-то опыт и термины "подпрограмма", " память", "порт", " бит-байт", "хекс" у вас ступора не вызывают, я могу посоветовать пройти моим путём: взять любую книгу, в которой есть справочник по функциям Си, и читать про эти функции, попутно волей-неволей вы будете привыкать к синтаксису, а встречающиеся в описаниях незнакомые вещи в той же книге находить и усваивать...

Можете попробовать почитать мои статьи про WinAVR, там я и про Си чуток рассказывал, и про функции, и ещё много про что... До Кернигана мне как до Пекина раком, но самое важное старался не упустить. Во всяком случае старался писать в расчёте именно на непрофессионала.

Статьи можете найти на моём сайте http://www.simple-devices.ru первой строкой среди популярного
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

ARV писал(а):Если у вас вообще нет никакого опыта в программировании, то я бы советовал для начала почитать что-то по алгоритмизации (правда сам я хороших книг об этом не встречал).
Хакерские трюки на с++(не уверен в названии), имхо, стоящая книженция
еще есть книга "С++ практикум" в двух книгах.
Но самая офигенная книга - взять какую либо задачу и решить её на интересующем языке :)Когда не знаешь что лучше или хуже вопросов не возникает
ARV писал(а): как с моей точки зрения - плохой стиль программирования.
Возможно. Мне тоже удобнее и более читаемо, как LEDPORT &=1<<REDLED, больше управляемости и наглядности.
Однако REDLED = 1 пишется быстрее.
Это всё дело привычки и поддержки.

Код: Выделить всё

#define PORT_HALL 	PORTD
#define pPIN_HALL	PIND
	#define PIN_HALL	2
#define PORT_LED	PORTB
	#define PIN_LED		3
#define PORT_IGNIT	PORTB
	#define PIN_IGNIT	4
и где то в коде

Код: Выделить всё

	PORT_IGNIT&=(~(1<<PIN_IGNIT));		//çàðÿæàåì êàòóøêó
Хотя

Код: Выделить всё

	IGNIT = ENIGNIT;		//çàðÿæàåì êàòóøêó
более человечно :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 193
Зарегистрирован: Пн апр 15, 2013 21:25:00
Откуда: Россия, Киров

Сообщение Cyber-master »

Извините за ИМХО, если нет никакого опыта в программировании, то на мой взгляд, не с С надо начинать - сложОн он для этого. Чего уж не на асме алгоритмы-то изучать...
Я вот в девяностолохматых еще годах начинал с бейсика на БК-0010, потом пересел на турбо, потом на паскаль, и потом только на С. Начинать надо с языка попроще, а потом уже, действительно, просто "словарь" функций следующего языка перечитываешь и готово.
Придумать бы, ЧТО создавать, остальное - дело техники
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

pcb писал(а):Хакерские трюки на с++(не уверен в названии), имхо, стоящая книженция
Если в названии C++ то уже не катит. Ну разные это языки, разные подходы к программированию. И "трюки", как мне кажется, заточены будут на особенности языка. C++ надо использовать только тогда, когда назрела потребность в ООП, иначе бессмысленно.
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Как оказалось, она называется "Алгоритмические трюки для программистов" :)
Изображение
вот так выглядит
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Модератор
Аватара пользователя
Сообщения: 10740
Зарегистрирован: Пн июл 07, 2008 10:46:09
Откуда: Россия

Сообщение Света »

Если хотите, чтобы жизнь улыбалась вам, подарите ей своё хорошее настроение
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 193
Зарегистрирован: Пн апр 15, 2013 21:25:00
Откуда: Россия, Киров

Сообщение Cyber-master »

Света, Спасибо!
Придумать бы, ЧТО создавать, остальное - дело техники
Контактная информация:
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

Viper115 писал(а):Желательно, чтобы изложение было доступно для гуманитария
у меня на сцайте есть некоторый материал, но не для гуманитариев, т.к. это ошибочный термин
нету никаких гуманитариев
есть 95%, которые мыслят логическим левым полушарием и им дается легко матан и программирование и есть илита, которая мыслит альтернативно
для таких 95% книг - макулатура и приходится использовать альтернативные методы и подачу материала

такие дела :tea:
тематические ответы только в форуме, в приват не пишите
Ответить

Вернуться в «Разные вопросы по МК»