Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 30.10.2017, 23:00   #1
Disall
Junior Member
 
Аватар для Disall
 
Регистрация: 08.09.2010
Возраст: 46
Сообщений: 19
Вес репутации: 100/30
Disall will become famous soon enoughDisall will become famous soon enough
По умолчанию Нужен опыт по началу программированию на С.

Здравствуйте!
Все время программировал на ассемблере для микроконтроллеров. Теперь просто необходимость научиться программировать на С. Кто какую среду разработки использует и какие компиляторы? Я все время использовал MPLAB. Есть ICD3. Есть железка на 16F690, для нее надо написать программу. Что почитать/посмотреть по теории?
Спасибо.
__________________
Если с проблемой не переспать, то решение не родится...
Disall вне форума   Ответить с цитированием
Старый 31.10.2017, 01:31   #2
CERGEI
Senior Member
 
Аватар для CERGEI
 
Регистрация: 11.07.2009
Возраст: 36
Сообщений: 526
Вес репутации: 183/39
CERGEI has a spectacular aura aboutCERGEI has a spectacular aura about
По умолчанию Re: Нужен опыт по началу программированию на С.

Вы сильно отстали,как и я.
stm32+keil к примеру.
CERGEI вне форума   Ответить с цитированием
Старый 31.10.2017, 10:03   #3
_WIL_
Senior Member
 
Регистрация: 26.11.2009
Адрес: Беларусь
Сообщений: 689
Вес репутации: 1181/49
_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Disall Посмотреть сообщение
Что почитать/посмотреть по теории?
"Язык программирования C" Брайан У. Керниган, Деннис М. Ритчи
_WIL_ вне форума   Ответить с цитированием
Старый 31.10.2017, 10:17   #4
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,745
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Disall
Кто какую среду разработки использует и какие компиляторы? - среда - eclipse, mplabx или вообще просто vim, если нет смысла отлаживаться с аппаратным отладчиком.

из тех что вообще сталкивался последние месяцы.
компиляторы pic14/pic16/stm8 - sdcc. pic24/pic32 - xc32.

начать что-либо делать, ознакомившись с примерами - C и asm очень похожи, так что вряд-ли потребуется какое-либо детальное ознакомление с литературой.
besogon вне форума   Ответить с цитированием
Старый 31.10.2017, 10:45   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,745
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

в предыдущем посте ошибка.
pic24 - xc16. xc16, как и xc32 суть gcc.
besogon вне форума   Ответить с цитированием
Старый 31.10.2017, 19:20   #6
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 768
Вес репутации: 1355/51
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Disall Посмотреть сообщение
Есть железка на 16F690, для нее надо написать программу. Что почитать/посмотреть по теории?
Спасибо.
для этой железки 8-го мрлаба и компилятора hi-tech picc 9.60std выше крыши , ну или ХС8 .
из почитать справочник по Си и мануал на компилятор . И и все, этого достаточно.
DmitrijVDN вне форума   Ответить с цитированием
Старый 27.01.2018, 09:13   #7
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Ребята, подскажите. Я только начинаю писать на Си. Моя проблема: есть main файл, есть куча переменных, массивы по 64 байта. Моё понятие - делаю их все(переменные и массивы) глобальными (extern) в main и они (должны быть видны, по моему мнению) в, допустим, 20 других файлах. Из main последовательно вызываются функции обработки буфера данных из написанных в 20 файлах. То есть, 1-ый файл обработал буфер, вывел данные во внешний мир, возвращаемся в main, затем буфер обрабатывается функциями из 2-го файла, и так все 20 файлов. Потом снова с 1-го и по циклу. Но так не работает! Нашёл пример в книге: описываю переменные в main, а в 20 файлах их снова описываю как EXTERN... блин, это ж куча кода. Посмотрел на демо примере в MPLAB X, там переменная пишется в Хедер файле, он в свою очередь include в main, далее переменная видится в других файлах... Вроде так... Может я ошибаюсь. Помогите разобраться...
Aleksey_ вне форума   Ответить с цитированием
Старый 27.01.2018, 10:04   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,745
Вес репутации: 3274/71
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Aleksey_
в Си обычно пытаются реализовать задачу с помощью модулей.
Вот берется какая-то крупная задача, в ней выделяются какие-то подзадачи, они в свою очередь содержат модули.

Модуль это какой-то самодостаточный объект, с которым можно иметь дело другим модулям.

например
Код:
/** workarea for ssd1331 entry
 */
typedef struct cc110l_e {
        rft_t rft;
	u16 packet_size;
	u16 max_packet_size;
	u8 channel;
	u8 channel_max;
	u16 byterate;			/* byterate is shifter, not real value */
	pthread_cond_t waitint_cond;
        spi_entry_t* spi;
        pic32mx_port_t* cs_port;
        u16 cs_mask;
        u16 spi_mtu;
        u8 int0;
        u8 int1;
        u8 baud;
        u8 access_delay;
	b8 varlength;
} cc110l_e_t;
...

/**
 * init cc110l
 * @param entry
 * @param config
 * @return true, if success
 */
void cc110l_init(cc110l_e_t* restrict rb,
		 const cc110l_config_t* restrict conf)
{
	cc110l_status_t chip_stat;
	u8 zero_reg_burst_write;

	/*init spi*/
	rb->spi = conf->spi;
	rb->cs_port = conf->cs_port;
	rb->cs_mask = 1 << conf->cs_port_bit;
...

...
/**
 * tx data packet throw radio module
 * @param rb		- radio backend
 * @param data		- data pointer
 * @param count		- data count in data pointer,
 * 			data over packet size is ignored,
 * 			data under packet size is zero-extended
 * @param msecs		- msecs to transmit
 * @return 		- true if success
 */
b8 cc110l_transmit(cc110l_e_t * restrict rb,
		   const u8* restrict data,
		   u32 count,
		   u32 msecs)
{
	b8 result;
	u8 cnt;
...
иначе говоря, стараются свести к минимуму содержание переменных в файлах.

если у Вас что-то там где-то работает с буфером каким-то там образом, то самый логичный способ, это делать функции, которые принимают указатель на буфер.

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

я ответил на вопрос?
besogon вне форума   Ответить с цитированием
Старый 27.01.2018, 10:49   #9
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 149
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Моя проблема: есть main файл, есть куча переменных, массивы по 64 байта. Моё понятие - делаю их все(переменные и массивы) глобальными (extern) в main и они (должны быть видны, по моему мнению) в, допустим, 20 других файлах.
Глобальные переменные - зло. Иногда неизбежное. Если один буфер требуется в 20 модулях - значит неверно разбиение проекта на модули. Каждый модуль должен заниматься своим делом и своими данными. Наружу торчит (публикуется в .h-интерфейсе модуля) только то, что необходимо другим модулям. И чем меньше торчит - тем защищённее модуль от воздействия извне. Человек может удерживать в голове единовременно три факта максимум, а программист - один файл кода, впрочем как и компилятор. Программисту легче сконцентрироваться на проблеме если всё находится в одном месте, а компилятору - оптимизировать. Однажды обильно политый потом и слезами, покрытый матюками модуль можно после всего этого [в идеале] таскать из проекта в проект не опасаясь что в нём что-то развалится под давлением [,типа,] "непредсказуемых" обстоятельств.
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Из main последовательно вызываются функции обработки буфера данных из написанных в 20 файлах. То есть, 1-ый файл обработал буфер, вывел данные во внешний мир, возвращаемся в main, затем буфер обрабатывается функциями из 2-го файла, и так все 20 файлов. Потом снова с 1-го и по циклу. Но так не работает!
ЧТД [Дадим каждому риторическому вопросу риторический ответ! :-D]
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Нашёл пример в книге: описываю переменные в main, а в 20 файлах их снова описываю как EXTERN... блин, это ж куча кода.
Извините за троллинг, в детском садике нас заставляли мыть руки после туалета и прогулок - но это-же куча воды тратится! :-)
Модуль - единица компиляции, компилятор при работе видит только то, что подключено (#include) в этот модуль. Он не имеет понятия ни что содержится в других модулях ни о бродящих в нашей голове мыслях. И чем больше у компилятора информации о том, с чем он работает - тем больше наших ошибок он сможет отловить ещё на этапе компиляции, а не в железе короткими бессонными ночами накануне сдачи заказчику.
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Посмотрел на демо примере в MPLAB X, там переменная пишется в Хедер файле, он в свою очередь include в main, далее переменная видится в других файлах...
Всякий "компилятор" имеет в багажнике что-то мумифицированное - поэтому изучение вопроса хорошо-бы начинать с чтения теоретических книжек про то, как оно должно быть правильно - и вложившись таким образом в базовые знания поимеете больший контроль над происходящим - стандартное поведение они все уже худо-бедно отрабатывают.
siarzhuk вне форума   Ответить с цитированием
Старый 27.01.2018, 17:58   #10
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,727
Вес репутации: 5285/161
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Ребята, подскажите. Я только начинаю писать на Си. Моя проблема: есть main файл, есть куча переменных, массивы по 64 байта. Моё понятие - делаю их все(переменные и массивы) глобальными (extern) в main и они (должны быть видны, по моему мнению) в, допустим, 20 других файлах. Из main последовательно вызываются функции обработки буфера данных из написанных в 20 файлах. То есть, 1-ый файл обработал буфер, вывел данные во внешний мир, возвращаемся в main, затем буфер обрабатывается функциями из 2-го файла, и так все 20 файлов. Потом снова с 1-го и по циклу. Но так не работает! Нашёл пример в книге: описываю переменные в main, а в 20 файлах их снова описываю как EXTERN... блин, это ж куча кода. Посмотрел на демо примере в MPLAB X, там переменная пишется в Хедер файле, он в свою очередь include в main, далее переменная видится в других файлах... Вроде так... Может я ошибаюсь. Помогите разобраться...
очень полезно сказать, какой у вас пик (серия).
Greg вне форума   Ответить с цитированием
Старый 27.01.2018, 18:09   #11
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от besogon Посмотреть сообщение
Aleksey_
в Си обычно пытаются реализовать задачу с помощью модулей.
Вот берется какая-то крупная задача, в ней выделяются какие-то подзадачи, они в свою очередь содержат модули.
Это я понимаю. Ребят, я не гуру в программировании и ни одного PIC не запустил. Реально я пробовал писать для себя простенькие задачки на Си лет 6 назад(тогда думал стать компьютерным программистом, изучал Дельфи). Года 4 назад увидел светодиодный куб и тогда узнал о существовании PIC и AVR. Вот тогда и уперся в АСМ(пример программы был на АСМ по нему и учился). А вот сейчас на Си думаю писать, так как пришло понятие, что на Си можно написать более универсальную программу.
Цитата:
Сообщение от besogon Посмотреть сообщение
иначе говоря, стараются свести к минимуму содержание переменных в файлах.

если у Вас что-то там где-то работает с буфером каким-то там образом, то самый логичный способ, это делать функции, которые принимают указатель на буфер.

глобалок должно быть минимум и обычно они по большей части дружно сидят в неком файле с глобалками
прислушаюсь к советам. Просто друзей нет подсказать по телефону или так, при общении, а в книге или инете сразу не поймёшь что к чему(как начинающему)
Aleksey_ вне форума   Ответить с цитированием
Старый 27.01.2018, 18:15   #12
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от siarzhuk Посмотреть сообщение

ЧТД [Дадим каждому риторическому вопросу риторический ответ! :-D]

Извините за троллинг, в детском садике нас заставляли мыть руки после туалета и прогулок - но это-же куча воды тратится! :-)
Модуль - единица компиляции, компилятор при работе видит только то, что подключено (#include) в этот модуль. Он не имеет понятия ни что содержится в других модулях ни о бродящих в нашей голове мыслях. И чем больше у компилятора информации о том, с чем он работает - тем больше наших ошибок он сможет отловить ещё на этапе компиляции, а не в железе короткими бессонными ночами накануне сдачи заказчику.
Неправильно описал проблему. Из-за незнания синтаксиса и что-где вставить или наисать(extern допустим переменную), у меня ошибки выдаёт, которые я пока непонимаю и пока поймёшь, куча времени уходит.
Aleksey_ вне форума   Ответить с цитированием
Старый 27.01.2018, 18:17   #13
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от siarzhuk Посмотреть сообщение
поэтому изучение вопроса хорошо-бы начинать с чтения теоретических книжек про то, как оно должно быть правильно - и вложившись таким образом в базовые знания поимеете больший контроль над происходящим - стандартное поведение они все уже худо-бедно отрабатывают.
да, теперь книжки сначала почитаю, просто хотел простенькие функции написать для начала... ) невтерпёж ведь )
Aleksey_ вне форума   Ответить с цитированием
Старый 27.01.2018, 18:46   #14
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Давайте по другому задам вопрос(чтоб на верный путь сразу направили). Когда я писал на ассемблере, у меня было 9 буферов по 64 байта и куча разных переменных, которые применялись почти во всех файлах с функциями обработки буферами(буферы обрабатывались во всех). Плюс куча констант, массивов данных, которые были в PSV области. Мне нужна видимость всех этих переменных(если писать на Си) и буферов и констант для всех файлов ***.с. Конкретнее: пишу про светодиодный куб, буфер 64 байта, каждый бит байта это LED. Допустим файл Effect_1.c обработал буфер, вывел его наружу, больше его не трогает. Далее Effect_2.c свой эффект создаёт. И так далее. Мне нужна в каждом Effect_Х.c видимость переменных и прочего. Могу ли я создать всё(переменные) в *.h, инклудить к Майну, и от него уже все Effect_Х.c видят это. Или я инклудю *.h во все Effect_Х.c?
Или как по другому?

Последний раз редактировалось Aleksey_; 27.01.2018 в 18:57.
Aleksey_ вне форума   Ответить с цитированием
Старый 27.01.2018, 19:47   #15
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 149
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Могу ли я создать всё(переменные) в *.h, инклудить к Майну, и от него уже все Effect_Х.c видят это. Или я инклудю *.h во все Effect_Х.c? Или как по другому?
Нет. Да. Тоже вариант.

И *.h и *.c это всего лишь тексты и ничего более. Их объединяет принадлежность к проекту. Проект в простейшем случае это т.н. makefile в котором перечислены файлы проекта и зависимости между ними [и ещё много чего всякого]. Запускается make -> для каждого из *.с файлов запускается компилятор, который для начала пропускает этот *.с файл через т.н. препроцессор. Препроцессор - это "интерпретатор" макроязыка - #include #define и т.п. - это команды этого макроязыка. На выходе препроцессора - огромный текстовый файл на С в который уже включены все *.h которые были явно прописаны в исходном *.с. Этот С файл обрабатывается компилятором на выходе которого получается файл [в двоичном коде] с объектами *.о. На этом миссия компилятора закончена. После того как все *.с файлы обработаны компилятором, make запускает линкер - который собирает воедино все объектные *.о файлы и лепит из них окончательный код программы - настраивает связи и указывает где коду отдельных функций из разных *.о файлов искать глобальные объекты.
Отсюда вывод - если вы объявите глобальные переменные в одном *.h и включите его только в main.c то компилятор при обработке других *.с файлов обругает вас за то, что вы ему не рассказали про эти переменные. Если вы включите этот *.h во все *.c файлы проекта то уже линкер резонно спросит вас какого чёрта в вашем проекте N переменных с одинаковым именем [где N это количество *.с файлов в прокете]. Для решения проблемы придуман модификатор extern - предупреждающий компилятор о наличии [где-то] такой переменной. Вы прописываете все глобальные переменные в *.h файлах как extern, собираете проект - и [ну что за напасть] опять линкер недоволен, что все ссылаются на переменные а ни в одном *.о файле этих переменных нету. Выход - дополнительно объявить переменные в одном [и только одном!] из *.с файлов уже без extern.

Вкратце:
Код:
*.h
extern int i;  // объявление "без выделения места" под переменную
Код:
*.c
int i;   // объявление "с выделением места"
Впрочем, выше описана стандартная картинка - "на земле" в зависимости от реализации тулчейна возможны как нюансы так и послабления. К примеру хс8 ЕМНИП работает через стадию общей ассемблерной портянки для лучшей оптимизации [типа выяснения, в частности, возможностей оптимизации кода printf] - и пяток одинаковых объявлений вроде как ему не вредит и не мешает. Но оформлять код в любом случае следует универсально - у "мигранта" проблеми и так выше крыши, но от какой-то части из них можно обезопаситься заблаговременно.
siarzhuk вне форума   Ответить с цитированием
Старый 27.01.2018, 21:42   #16
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Спасибо огромное за ответ на мой вопрос! По 1-му абзацу я примерно понял... Теперь про глобальные переменные. Сейчас попробую написать как я понимаю:
Код:
*.h
        
extern unsigned int buffer_draw_1 [8][8];
// ... ещё буферы
extern unsigned int buffer_draw_9 [8][8];
extern unsigned int var1;
extern unsigned int var2;
// ... ещё куча всех переменных
extern unsigned int var50; // 50 как для примера
Код:
Effect_1.с
#include "*.h"

// переменные из Хэдер файла
unsigned int buffer_draw_1 [8][8];
// ... ещё буферы
unsigned int buffer_draw_9 [8][8];
unsigned int var1;
unsigned int var2;
// ... ещё куча всех переменных
unsigned int var50; // 50 как для примера

//теперь переменные видимые только в Effect_1
int var_1;
int var_2;

void Effect_1(void)
{
    // код обработки буферов и вывода его во внешний мир
}
далее ещё файлы Effect_X...

Код:
main.c
/*здесь какие-либо переменные и ещё чего-нибудь
 * используемые в МАЙНе
*/        

void main(void)        
{
    Effect_1();
    Effect_2();
    Effect_3();
    // вызов Effect_X как для примера
}
как бы так?
Ещё, нашёл человека, который сказал что есть С и С++, они немного разные. Что скажите? То есть я после этого заметил нюанс, что при создании проекта в MPLAB X можно создать *.с и *.срр. В чём разница?
Прошу ответ как для чайника с простыми словами и определениями.
Спасибо!

Извиняюсь, всё написал, отправил, и потом заметил в прошлом сообщении :
**** Выход - дополнительно объявить переменные в одном [и только одном!] из *.с файлов уже без extern. *****

А я в примере во всех Effect_X инклудил *.h ...

Последний раз редактировалось Aleksey_; 27.01.2018 в 21:54.
Aleksey_ вне форума   Ответить с цитированием
Старый 28.01.2018, 01:43   #17
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 149
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Код:
Effect_1.с
//теперь переменные видимые только в Effect_1
int var_1;
int var_2;
как бы так?
Да, с замечанием, что переменные видимые только в этом*.с файле желательно объявлять static - чтобы уж гарантированно линкер их не видел и никто из других модулей не добрался до них. Да и компилятор, будучи уверенным, что эта переменная используется только в этом файле мог её лучше отоптимизировать при возможности.

Ешё замечание по подходу - функция Effect() у вас не принимает параметров - т.е. глядя на её объявление совершенно невозможно предсказать что она ворочает некими данными - всё идёт помимо "главного входа". Кроме того вы теряете возможность применять функцию к разным наборам данных. Передавайте указатели на буфер данных параметром этой функции. Потеряв копейки на затратах вызова функции выиграете в гибкости. И сможете использовать код повторно в другом проекте. Заодно и выкосите часть глобальных переменных.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Ещё, нашёл человека, который сказал что есть С и С++, они немного разные. Что скажите? То есть я после этого заметил нюанс, что при создании проекта в MPLAB X можно создать *.с и *.срр. В чём разница?
Как по мне - это недозачищеный рудимент Нетбинсов на базе которых Микрочип свою ИДЕ строит. хс8 насколько помню с++ не понимает.
С с плюсами можно рассматривать как дальнейшее развитие в направлении защищённости данных по сравнению с модульной концепцией из С. Ну и на порядки более изощрённая возможность по созданию пользовательских типов данных, их свойств и даже поведения этих [как их там обзывают] объектов. Плюс элементы мета-программирования с введением шаблонов.
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Прошу ответ как для чайника с простыми словами и определениями.
К сожалению удовлетворить интерес в таком ключе вряд-ли получится уложившись в допустимое количество времени, вы уж простите. Расхожее мнение, что с++ оправдан для решения более сложных задач, чем может предложить сфера ваших текущих интересов. В любом случае наработку опыта с модульным программированием на С вам перепрыгнуть вряд-ли удастся. Не сочтите за снобизм - но по личным ощущениям - плюсы тащат на МК кто из-за синтаксических плюшек, кто из-за возможностей шаблонов. Выстраивание же там классической ООП иерархии с гроздьями виртуальных функций - представить затрудняюсь.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
**** Выход - дополнительно объявить переменные в одном [и только одном!] из *.с файлов уже без extern. *****

А я в примере во всех Effect_X инклудил *.h ...
Всё верно сделали - в *.h у вас они "объявлены", но не "определены" - т.е. все *.с файлы будут их видеть [через #include подключение], но место под них выделяется только в Effect.c.
siarzhuk вне форума   Ответить с цитированием
Старый 28.01.2018, 10:41   #18
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от siarzhuk Посмотреть сообщение
Да, с замечанием, что переменные видимые только в этом*.с файле желательно объявлять static - чтобы уж гарантированно линкер их не видел и никто из других модулей не добрался до них. Да и компилятор, будучи уверенным, что эта переменная используется только в этом файле мог её лучше отоптимизировать при возможности.

Ешё замечание по подходу - функция Effect() у вас не принимает параметров - т.е. глядя на её объявление совершенно невозможно предсказать что она ворочает некими данными - всё идёт помимо "главного входа". Кроме того вы теряете возможность применять функцию к разным наборам данных. Передавайте указатели на буфер данных параметром этой функции. Потеряв копейки на затратах вызова функции выиграете в гибкости. И сможете использовать код повторно в другом проекте. Заодно и выкосите часть глобальных переменных.
Спасибо! Буду рад знать все нюансы программирования! Про указатели чуть позже вопрос. Объясните пожалуйста смысл выражения "выкосить часть глобальных переменных"... Какой нюанс применения этих переменных в этом случае?
Цитата:
Сообщение от siarzhuk Посмотреть сообщение
Всё верно сделали - в *.h у вас они "объявлены", но не "определены" - т.е. все *.с файлы будут их видеть [через #include подключение], но место под них выделяется только в Effect.c.
Теперь вопрос. Понимаю, МК работает быстро и мои буферы-массивы по 64 байта мелочь по сравнению с памятью МК. А то, что память под них в Effect_ах постоянно выделяется при каждом новом заходе в функции файла Effect_X, как это смотрится со стороны стиля программирования(я про то, что говорят в книжках, мол пишите красивый код). Или я что не так понимаю?
Aleksey_ вне форума   Ответить с цитированием
Старый 28.01.2018, 11:34   #19
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 47
Сообщений: 149
Вес репутации: 1161/26
siarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud ofsiarzhuk has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Объясните пожалуйста смысл выражения "выкосить часть глобальных переменных"... Какой нюанс применения этих переменных в этом случае?
Функции принимают указатель на данные, которые должны обработать. Следовательно им не требуется больше [прямая] видимость этого буфера как глобальной переменной - они получают доступ к нему через параметр функции.
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
Теперь вопрос. Понимаю, МК работает быстро и мои буферы-массивы по 64 байта мелочь по сравнению с памятью МК.
Прогресс, конечно, неизбежен © но вопрос кто вымрет раньше - восьмибитники или их фанаты я бы не считал закрытым. :-) Впрочем, более компетентные соратники меня поправят - увы, не стратег.
Цитата:
Сообщение от Aleksey_ Посмотреть сообщение
А то, что память под них в Effect_ах постоянно выделяется при каждом новом заходе в функции файла Effect_X, как это смотрится со стороны стиля программирования(я про то, что говорят в книжках, мол пишите красивый код). Или я что не так понимаю?
Если речь об объявлении функции как:
Код:
void Effect(char ax[256]);
то освежим для начала в памяти соглашение о вызовах функций в С - а) заталкиваем в стек параметры; б) заталкиваем в стек адрес возврата; в) скачем по адресу начала кода функции. По завершению функции ю) скачем на адрес возврата и я) очищаем стек.
Таким образом - параметр ах в функции - такая-же локальная переменная на стеке, как и те, что объявляем в самой функции. Её можно модифицировать и работать с ней, но живёт она только пока функция исполняется. Отсюда вы уже наверное сделали ещё один дополнительный вывод - исходные данные массива никоим образом не меняются, поскольку функция работает с их копией. Это ещё называется "передачей параметров по значению". Для того, чтобы менялись исходные данные - в функцию нужно передавать указатель на них.
Код:
void Effect(char* data, int width, int height);
И стека потратим не [скажем] 256/sizeof(int) a 3 * sizeof(int), что снимает и первый ваш вопрос.
Впрочем передавать массив по значению мне за 20 лет так ни разу не было необходимости - потому суждение выше носит некоторый оттенок теоретичности - лучше проверьте его по .lst ассемблерному листингу в папке с промежуточными файлами компилятора.
И да, соглашение по вызову функций в С лишь одно из многих - мной описан канонический случай - в реальности может иметь место и передача [части] параметров через регистры и стек, вычисляемый во время компиляции и ещё чего-нибудь экзотичного.
siarzhuk вне форума   Ответить с цитированием
Старый 28.01.2018, 12:46   #20
Aleksey_
Member
 
Регистрация: 12.12.2012
Адрес: Пермь, Чайковский
Возраст: 39
Сообщений: 31
Вес репутации: 100/22
Aleksey_ will become famous soon enoughAleksey_ will become famous soon enough
По умолчанию Re: Нужен опыт по началу программированию на С.

большое спасибо за доходчивое объяснение в 1 и 3 разъяснении! не во всех книжках пишут так понятно с первого раза! конечно нужно самому додумываться до этого по своему коду, но когда сидишь день над изучением синтаксиса объявления extern переменных, а кроме этого ещё есть дела... Спасибо!
Хотел бы чуть поправится: мои буферы не 64 байта, а 64 16-ти разрядных слов (PIC24F). А то опять заведётся тема 8-ми битников, как прошлый век )
Aleksey_ вне форума   Ответить с цитированием
Старый 08.02.2018, 14:54   #21
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 858
Вес репутации: 1266/61
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
Question Re: Нужен опыт по началу программированию на С.

на асме этот код задавал статическое распределение памяти для переменных
Код:
COM UDATA_ACS 40H;    переменные для ком-порта
CHKSUM        RES 1    ; Checksum accumulator
COUNTER     RES 1    ; General counter
RXDATA        RES 1
TXDATA        RES 1
как в С привязать переменную к конкретному адресу для PIC24 на ХС16?
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 08.02.2018, 15:15   #22
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,395
Вес репутации: 4688/107
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от siargy Посмотреть сообщение
на асме этот код задавал статическое распределение памяти для переменных
Код:
COM UDATA_ACS 40H;    переменные для ком-порта
CHKSUM        RES 1    ; Checksum accumulator
COUNTER     RES 1    ; General counter
RXDATA        RES 1
TXDATA        RES 1
как в С привязать переменную к конкретному адресу для PIC24 на ХС16?
а зачем? какая в том необходимость мешаться линкеру?
ampersant вне форума   Ответить с цитированием
Старый 09.02.2018, 08:29   #23
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 858
Вес репутации: 1266/61
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

програмка с пк читает кусок памяти из мк и разбирает на переменные.
соответственно при перекомпиляции и доработки по, переменные должны иметь фиксированные адреса.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 09.02.2018, 10:28   #24
_WIL_
Senior Member
 
Регистрация: 26.11.2009
Адрес: Беларусь
Сообщений: 689
Вес репутации: 1181/49
_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

Цитата:
Сообщение от siargy Посмотреть сообщение
програмка с пк читает кусок памяти из мк и разбирает на переменные.
А читает то она как, тоже с помощью какой то функции , ели функция на си то компилятор сам с адресами разберется ,если функсия на асме можно через указатели, да и на си тоже.
Если это однотипные данные можно использовать массив и функции передать указатель, указатель и будет адрес начала массива.
Если данные разных типов то можно использовать структуры.

Последний раз редактировалось _WIL_; 09.02.2018 в 10:44.
_WIL_ вне форума   Ответить с цитированием
Старый 09.02.2018, 11:52   #25
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 38
Сообщений: 858
Вес репутации: 1266/61
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: Нужен опыт по началу программированию на С.

протокол из бутлоадера к пик18, думаю его и оставить.
Код:
; In:    <STX><NOK>[<0x08><DLEN><ADDRL><ADDRH>]<CHKSUM><ETX>
; OUT:    <STX><NOK>[<0x08><DLEN><ADDRL><ADDRH><DATA>...]<CHKSUM><ETX>
ReadRAM
    MOVFF    POSTINC1,POSTINC0
    decfsz    COUNTER, F
    BRA ReadRAM
    movf    DATA_COUNT, W        ; Setup packet length
    addlw    0x05
    bra    WritePacket        ; Send acknowledge
а это описание регистра к тестовой програме

Код:
    <Variable>
        <shift>168</shift>
        <size>2</size>
        <min>0</min>
        <max>80</max>
        <name>temp_H</name>
        <koef>0.0625</koef>
        <refr>30</refr>
        <type>shex</type>
        <del></del>
        <descr>C</descr>
    </Variable>
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Электропривод NSS Источники питания и силовая электроника 32 29.01.2012 14:17
MAX232 и USART, отсутствует сигнал на выходе. EviL_LaugH Общетехнические вопросы 15 31.01.2011 00:40
Проблема с прерыванием PIC 16F877A . chiraevevgenii Вопросы начинающих 8 13.01.2011 20:13
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00


Часовой пояс GMT +3, время: 00:23.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot