- 
	- Знаете, почему я на асме остановился на этом варианте программных таймеров? Нет ничего лишнего. Хватает почти на все. В моем случае значение просто декрементируется. Если мы берем другие варианты таймеров, то нужно класть в ОЗУ значение для  mazur(104 знак., 24.08.2013 23:47)fk0
			- Лично я использовал отдельные таймеры на "каждый чих" только в самом первом своем проекте. В дальнейшем везде использовал один таймер, отсчитывающий время в мс (меньше 1мс интервалов времени никогда не требовалось). - rezident(25.08.2013 00:10)
					- Да, меньше 1 мс программные таймеры и не требуются. Тут уже разброс в несколько мкс, даже десяток-другой, вообще роли не играют. Потому что эти временные рамки - человеко-интерфейс.  mazur(509 знак., 25.08.2013 00:50 - 00:52)
							- Опять эти байты. Что, в этих ваших атмелах так туго с памятью? А ёжики плакали, кололись, но продолжали его есть. SciFi(198 знак., 25.08.2013 09:50)
- Вам уже не раз указывали на зашоренность ваших взглядов в отношении программирования. Нужно учиться рассматривать задачу на разных (в т.ч. и более высоких) уровнях абстракций.  rezident(621 знак., 25.08.2013 01:07)
									- Вы не поверите, я даже config.sys и autoexec.bat оптимизировал. Тогда я вообще программированием не занимался. Так, баловался с DOS и html. mazur(107 знак., 25.08.2013 01:35)
 
- У меня рассуждения были такие: раз нас не интересует разброс в несколько мс (а если критично, то уже подход другой), то и пусть это будет в одном месте. Чем в каждой задаче каждый раз проверять на каждый таймер на N-ое количество тактов дольше mazur(194 знак., 25.08.2013 01:03)
- Подразумевалось, что есть некая функция получения текущего времени timer(). И всё, больше ничего нет. Программа крутится в цикле, проверяет значение timer(), и когда подойдёт -- что-то делает. И так может несколько программ (псевдо)параллельно fk0(491 знак., 25.08.2013 00:56)
 
 
- Да, меньше 1 мс программные таймеры и не требуются. Тут уже разброс в несколько мкс, даже десяток-другой, вообще роли не играют. Потому что эти временные рамки - человеко-интерфейс.  mazur(509 знак., 25.08.2013 00:50 - 00:52)
							
- Если хватает на всё, то нафига учить Си (нет, серьёзно)? А вот эти вот "2 байта" - это та самая "преждевременная оптимизация" (на самом деле эти два слова должны звучать жутко неприлично, типа "черножопый ниггер" для наших американских партнёров).  SciFi(307 знак., 24.08.2013 23:55 - 25.08.2013 00:05)
					- 2 байта на 1 таймер. А таймеров на модуль может быть несколько. - mazur(24.08.2013 23:56)
							- 2 байта, 10 байт - пофиг. Я говорю про вред преждевременной оптимизации (не надо его недооценивать, он имеет ужасающие масштабы). Простой вопрос: если бы эти таймеры жрали в 2 раза больше ОЗУ, пришлось бы вам взять более жирный чип хотя бы для SciFi(16 знак., 25.08.2013 00:04)
- Не понимая смысл этих таймеров, вообще сложно что-то советовать. - Vladimir Ljaschko(24.08.2013 23:58)
 
 
- 2 байта на 1 таймер. А таймеров на модуль может быть несколько. - mazur(24.08.2013 23:56)
							
 
- Лично я использовал отдельные таймеры на "каждый чих" только в самом первом своем проекте. В дальнейшем везде использовал один таймер, отсчитывающий время в мс (меньше 1мс интервалов времени никогда не требовалось). - rezident(25.08.2013 00:10)
					
- Про указатели:  Ксения(2326 знак., 24.08.2013 20:46 - 21:52)
			- Нужно не else после continue выкинуть, а изменить проверку условия на противоположную и выкинуть continue, иначе до ptr++ дело не дойдёт. Или так for( cnt = 0, ptr = Sys_Timers_Queue; cnt < ST_QUANTITY; cnt++, ptr++ ) Ну и ; после for() убрать, а  зануда(16 знак., 24.08.2013 23:52,  ) )
- Да, возможно вас что-то будет раздражать, но! Поймите, это для вас сейчас элементарщина. Для меня же все в си в новинку. Сейчас мне на асме проще реализовать многое. Но раз уж перехожу, поэтому... - mazur(24.08.2013 21:31)
					- Ещё раз напоминаю, что переписывать ассемблерный код на Си - пустая трата времени. Убить в себе драконаассемблер - архиважная задача. - SciFi(24.08.2013 21:55)- Я держу в памяти ваши слова и пытаюсь шагнуть в другое измерение, скажем так. Но! На данный момент чего-то недостает. Какого-то кусочка информации. Вам это может показаться элеметарщиной, потому никто и не говорит. Примеры да, но чего-то еще не  mazur(9 знак., 24.08.2013 22:03)
									- Давате сюда ващ файл и хидер, а то уже надоело вашими руками поправлять - на одно исправление рождается две новых ощибки. - Ксения(24.08.2013 22:45)
											- Вот весь проект.  mazur(24.08.2013 22:51)
													- Ошибки:  Ксения(166 знак., 24.08.2013 23:51 - 23:55)
															- Спасибо! Скомпилировалось. Пока буду дальше разбираться. - mazur(25.08.2013 01:30)
- А зачем там переменная cnt? Может так?  Скрипач(141 знак., 25.08.2013 00:04)
																	- Счетчик cnt однобайтный, а указатель двухбайтный. Сравнение указателей обойдется дороже, чем счетчика с константой. - Ксения(25.08.2013 00:10)
																			- Инкремент+сравнение VS двухбайтное сравнение. - Скрипач(25.08.2013 00:13)
																					- У Мазура в ассемблере счетчик был отдельно от указателя. Пусть так и будет, чтобы он заценил аналогию. - Ксения(25.08.2013 00:17)
																							- Я уже думал о том, чтобы сравнивать значение указателя с кол-вом счетчиком, то бишь, TMRS_QUANTITY. В примере Скрипача так сделано? - mazur(25.08.2013 01:51)
																									- Да, так. Только можно чуть понятнее написать: Ксения(1941 знак., 25.08.2013 02:01 - 02:26)
 
 
- Я уже думал о том, чтобы сравнивать значение указателя с кол-вом счетчиком, то бишь, TMRS_QUANTITY. В примере Скрипача так сделано? - mazur(25.08.2013 01:51)
																									
 
- У Мазура в ассемблере счетчик был отдельно от указателя. Пусть так и будет, чтобы он заценил аналогию. - Ксения(25.08.2013 00:17)
																							
 
- Инкремент+сравнение VS двухбайтное сравнение. - Скрипач(25.08.2013 00:13)
																					
 
- Счетчик cnt однобайтный, а указатель двухбайтный. Сравнение указателей обойдется дороже, чем счетчика с константой. - Ксения(25.08.2013 00:10)
																			
 
 
- Ошибки:  Ксения(166 знак., 24.08.2013 23:51 - 23:55)
															
 
- Вот весь проект.  mazur(24.08.2013 22:51)
													
 
- Давате сюда ващ файл и хидер, а то уже надоело вашими руками поправлять - на одно исправление рождается две новых ощибки. - Ксения(24.08.2013 22:45)
											
 
- Я держу в памяти ваши слова и пытаюсь шагнуть в другое измерение, скажем так. Но! На данный момент чего-то недостает. Какого-то кусочка информации. Вам это может показаться элеметарщиной, потому никто и не говорит. Примеры да, но чего-то еще не  mazur(9 знак., 24.08.2013 22:03)
									
 
- Ещё раз напоминаю, что переписывать ассемблерный код на Си - пустая трата времени. Убить в себе 
- Вот результат на данный момент:  mazur(24.08.2013 21:27)
					- Не очень понимаю зачем typedef  Скрипач(114 знак., 24.08.2013 21:47)
							- Затем, чтобы не писать каждый раз  Bill(24 знак., 25.08.2013 16:53)
									- А фиг его знает, этот GCC. "Большие" компиляторы (под x86) слово struct не требуют, относясь к имени структуры, как к самодельному типу данных. По крайней мере, в C++ это всегда так, но так ли это всегда в обычном C, сказать трудно. Многое зависит  Ксения(117 знак., 25.08.2013 17:11)
											- Дело в том, что структуры/объединения могут и не иметь имен (ярлыков). Тогда как? - Bill(25.08.2013 17:29)
													- Тогда выход только один - заводить объекты в том же месте, где объявлена структура. Но тогда описание таких объектов нельзя будет вынести в хидер, т.к. в хидере заводить объекты запрещено (хотя компилятор иногда можно обмануть). Других решений я  Ксения(56 знак., 25.08.2013 22:22)
															- typedef - механизм объявления новых типов данных вообще. Структуры - всего лишь частный случай. Кстати,  Bill(88 знак., 26.08.2013 06:12 - 06:49)
																	- Это юнионы и структуры механизм объявления новых типов. А typedef для объявления синонимов для существующих типов. - Юра(26.08.2013 08:29,  ) )- Вовсе необязательно синонимы. Например, можно создать  Bill(60 знак., 26.08.2013 09:53)
																					- Так еще и не разрешит. Разрешит typedef char string[ 255 ]; или на худой конец typedef  char* string; Типичные синонимы. - Юра(27.08.2013 00:18,  ) )
- Компилятор не отличает два типа с разным (через typedef) именем, но одинаковой декларацией. Поэтому синоним. А структуры (unions, классы) -- всегда отличает. - fk0(26.08.2013 10:30)
 
- Так еще и не разрешит. Разрешит typedef char string[ 255 ]; или на худой конец typedef  char* string; Типичные синонимы. - Юра(27.08.2013 00:18, 
 
- Вовсе необязательно синонимы. Например, можно создать  Bill(60 знак., 26.08.2013 09:53)
																					
 
- Это юнионы и структуры механизм объявления новых типов. А typedef для объявления синонимов для существующих типов. - Юра(26.08.2013 08:29, 
 
- typedef - механизм объявления новых типов данных вообще. Структуры - всего лишь частный случай. Кстати,  Bill(88 знак., 26.08.2013 06:12 - 06:49)
																	
 
- Тогда выход только один - заводить объекты в том же месте, где объявлена структура. Но тогда описание таких объектов нельзя будет вынести в хидер, т.к. в хидере заводить объекты запрещено (хотя компилятор иногда можно обмануть). Других решений я  Ксения(56 знак., 25.08.2013 22:22)
															
 
- Дело в том, что структуры/объединения могут и не иметь имен (ярлыков). Тогда как? - Bill(25.08.2013 17:29)
													
 
- А фиг его знает, этот GCC. "Большие" компиляторы (под x86) слово struct не требуют, относясь к имени структуры, как к самодельному типу данных. По крайней мере, в C++ это всегда так, но так ли это всегда в обычном C, сказать трудно. Многое зависит  Ксения(117 знак., 25.08.2013 17:11)
											
 
- Затем, чтобы не писать каждый раз  Bill(24 знак., 25.08.2013 16:53)
									
- Вам же русским языком сказали, а на примерах показали, что указатель должен быть ТОГО ЖЕ САМОГО ТИПА, что и структура, на которую он указует. Почему же у вас указатель не на  структуру, а на массив из u16??? Замените  "u16 *ptr" на "struct  Ксения(18 знак., 24.08.2013 21:41 - 21:45)
							- Я тогда думал, что раз X, Y, Z двухбайтные указатели, значит u16. - mazur(25.08.2013 01:32)
- ->  mazur(24.08.2013 22:07)
									- ---> - Скрипач(24.08.2013 22:33 - 22:43)
											- struct tmrs_queue *p_tmrs_queue = Timers_Queue; - Ксения(24.08.2013 22:34)
 
- if( sys_tick & (1<<SYS_TICK_FLG)) // уберите == 1, т.к. это может быть только при SYS_TICK_FLG=0 Ксения(123 знак., 24.08.2013 22:39 - 22:42)
- Тоже покритикую: комментарии типа "заводим указатель на структуру blah-blah" бесполезны, так как и без комментария сей факт очевиден. Убейте в себе ещё и Капитана Очевидность SciFi(213 знак., 24.08.2013 22:41)
- Дважды заводите ptr, уберите дубль. Используейте в цикле именно его, а не какую-то ерунду вроде p_tars_queue, которая невесть где определена. Я же вам написала код, какого хрена вы его уродуете? - Ксения(24.08.2013 22:29)
											- Хорошо, почему ptr, а не p_tmrs_queue? - mazur(24.08.2013 22:30)
													- Можно и p_tmrs_queue имя дать указателю, но тогда определите его, так, как определили ptr. - Ксения(24.08.2013 22:32)
															- Я бы и сама написала, но не могу скопировать с ваших картинок. - Ксения(24.08.2013 22:34)
 
 
- Можно и p_tmrs_queue имя дать указателю, но тогда определите его, так, как определили ptr. - Ксения(24.08.2013 22:32)
															
 
- Хорошо, почему ptr, а не p_tmrs_queue? - mazur(24.08.2013 22:30)
													
- extern struct tmrs_queue Timers_Queue[]; - Скрипач(24.08.2013 22:24)
 
- ---> - Скрипач(24.08.2013 22:33 - 22:43)
											
 
 
- Не очень понимаю зачем typedef  Скрипач(114 знак., 24.08.2013 21:47)
							
- В данный момент для меня трудности во всех приведенных примерах и материалах по указателям имена чего-то там. Если на асме я просто указал начальный адрес Timers_Queue и смещение элемента скажем, EL_SIZE, статус+счетчик, 1+2=3, то в материалах и  mazur(480 знак., 24.08.2013 21:13)
					- Если в C вы новичок, но не советую использовать typedef. Пользуйтесь объявлением структуры. Вот так: Ксения(736 знак., 24.08.2013 21:33 - 21:37)
- Ну и на C тоже самое только, только к указателю добавляет на байтовое смещение, а смещение, выраженное числом элементов. А в байтовое смещение переведет сам компилятор. - Ксения(24.08.2013 21:24)
 
 
- Нужно не else после continue выкинуть, а изменить проверку условия на противоположную и выкинуть continue, иначе до ptr++ дело не дойдёт. Или так for( cnt = 0, ptr = Sys_Timers_Queue; cnt < ST_QUANTITY; cnt++, ptr++ ) Ну и ; после for() убрать, а  зануда(16 знак., 24.08.2013 23:52, 
- А смысл? Получится тот же ассемблер, только на Си. Надобно Си использовать как ЯВУ (язык высокого уровня). Да, на первых порах сложно,  SciFi(70 знак., 16.08.2013 17:09 - 17:13)
			- Насколько я увидел, у многих (я не про вас) есть проблемы с таймерами. С программными тем более. На форумах не только у новичков есть вопросы по большому кол-ву таймеров. А так у меня есть готовая наработка по программным таймерам. - mazur(16.08.2013 17:13)
					- Предлагаю обернуть отлаженный ассемблерный код красивыми сишными функциями и больше его не трогать. Переписывать имеет смысл только для радикальных улучшений. SciFi(106 знак., 16.08.2013 17:15)
- это детский велосипедик с торчащим клаксоном и дополнительными маленькими колесиками:) - Vit(16.08.2013 17:16)
							- Не, это просто универсальный клаксон:) Без обид, mazur. Программные таймеры обычно являются неотъемлемыми частями более сложных объектов и я не слышал про какие-нибудь трудности. Я не использую универсальные таймеры программные таймеры, у  Vladimir Ljaschko(52 знак., 16.08.2013 17:21)
									- Никаких обид. Вы еще тогда что-то мне показывали. Просто этих таймеров мне было достаточно практически для любых проектов. Пока перенесу на си и буду их использовать. Возможно на С мне понравятся другие реализации. Кстати, можно поглядеть на ваши  mazur(98 знак., 16.08.2013 17:28)
											- Говна не жалко :) Модуль для управления 1, 2 или 4 моторами на AVR M32 или M128. Много препроцессора. Функции этого уровня - запустить мотор на заданное время с заданной мощностью. Плавное наращивание ШИМ. Драйвер 6201  Vladimir Ljaschko(16.08.2013 17:56)
													- Сброс битов в TIFR подправьте. Вдруг чего. Вдруг кто Ваш модуль в свой проект не глядя сунет. - Юра(25.08.2013 20:54,  ) )- А что именно подправить? Уже пару лет с AVR не работаю, забылось все. - Vladimir Ljaschko(26.08.2013 10:41)
																	- Вам повезло, а мне приходится его изучать. Проект блин за проектом)) Думал минует меня атмел. Хорошо коллеги помогают. К делу: для TIFR RMW-операцию "|=" применять нельзя. Ее надо заменить на операцию присваивания "=" . Ведь в регистре TIFR  Юра(252 знак., 26.08.2013 18:30,  ) )- Все правильно с точностью до наоборот. - Bill(27.08.2013 11:38)
																					- Интересно. Поясните. - Petrovich(27.08.2013 11:44,  ) )- А что тут пояснять? Присваивание - оно и есть присваивание. Запись  Bill(456 знак., 27.08.2013 11:56 - 12:00)
																									- Абсолютно не согласен. Разряды TIFR  сбрасываются записью в них 1 и абсолютно нечувствительны к записи в них 0. Это классика. - Petrovich(27.08.2013 12:02,  ) )- Если иметь в виду именно TIFR, то да. Я же имел в виду вообще работу с битами. А что касается именно TIFR, то  Bill(127 знак., 27.08.2013 12:09)
																													- Разговор шел ТОЛЬКО о TIFR. И кроме сбрасываемой "группы флажков" в этом TIFR есть "группы флажков" от других таймеров. Которые, может быть, ждут что их опросят. А после операции |= и не дождутся. - Petrovich(27.08.2013 12:14,  ) )- Почитал внимательней и понял, что я был неправ. - Bill(27.08.2013 12:38)
 
 
- Разговор шел ТОЛЬКО о TIFR. И кроме сбрасываемой "группы флажков" в этом TIFR есть "группы флажков" от других таймеров. Которые, может быть, ждут что их опросят. А после операции |= и не дождутся. - Petrovich(27.08.2013 12:14, 
 
- Если иметь в виду именно TIFR, то да. Я же имел в виду вообще работу с битами. А что касается именно TIFR, то  Bill(127 знак., 27.08.2013 12:09)
																													
 
- Абсолютно не согласен. Разряды TIFR  сбрасываются записью в них 1 и абсолютно нечувствительны к записи в них 0. Это классика. - Petrovich(27.08.2013 12:02, 
 
- А что тут пояснять? Присваивание - оно и есть присваивание. Запись  Bill(456 знак., 27.08.2013 11:56 - 12:00)
																									
 
- Интересно. Поясните. - Petrovich(27.08.2013 11:44, 
- Спасибо. Собственно по одной этой строке можно было понять, что биты управляются "ненормально". У меня максимум при инициализации этого модуля произойдет потеря системного тика, что не влияет ни на что. - Vladimir Ljaschko(27.08.2013 06:51)
 
- Все правильно с точностью до наоборот. - Bill(27.08.2013 11:38)
																					
 
- Вам повезло, а мне приходится его изучать. Проект блин за проектом)) Думал минует меня атмел. Хорошо коллеги помогают. К делу: для TIFR RMW-операцию "|=" применять нельзя. Ее надо заменить на операцию присваивания "=" . Ведь в регистре TIFR  Юра(252 знак., 26.08.2013 18:30, 
 
- А что именно подправить? Уже пару лет с AVR не работаю, забылось все. - Vladimir Ljaschko(26.08.2013 10:41)
																	
 
- Сброс битов в TIFR подправьте. Вдруг чего. Вдруг кто Ваш модуль в свой проект не глядя сунет. - Юра(25.08.2013 20:54, 
 
- Говна не жалко :) Модуль для управления 1, 2 или 4 моторами на AVR M32 или M128. Много препроцессора. Функции этого уровня - запустить мотор на заданное время с заданной мощностью. Плавное наращивание ШИМ. Драйвер 6201  Vladimir Ljaschko(16.08.2013 17:56)
													
- +1. На первых порах изобретал какую-то такую фигню. Потом пришёл к тому, что от глобального таймера нужно только текущее время - дальше каждый модуль сам разберётся. Сразу стало сухо и комфортно. - SciFi(16.08.2013 17:27)
 
- Никаких обид. Вы еще тогда что-то мне показывали. Просто этих таймеров мне было достаточно практически для любых проектов. Пока перенесу на си и буду их использовать. Возможно на С мне понравятся другие реализации. Кстати, можно поглядеть на ваши  mazur(98 знак., 16.08.2013 17:28)
											
 
- Не, это просто универсальный клаксон:) Без обид, mazur. Программные таймеры обычно являются неотъемлемыми частями более сложных объектов и я не слышал про какие-нибудь трудности. Я не использую универсальные таймеры программные таймеры, у  Vladimir Ljaschko(52 знак., 16.08.2013 17:21)
									
 
 
- Насколько я увидел, у многих (я не про вас) есть проблемы с таймерами. С программными тем более. На форумах не только у новичков есть вопросы по большому кол-ву таймеров. А так у меня есть готовая наработка по программным таймерам. - mazur(16.08.2013 17:13)
					
- Edit. Как указать размер элемента структуры? Если я неправильно выразился, поправьте. Скажем, есть:  mazur(326 знак., 16.08.2013 15:17 - 15:32)
			- 1) за u08, u16 и т.п. сжигать нужно -- используй стандартные типы данных. 2) заморачиваться и не нужно -- для размера любого типа есть sizeof(type name or variable name), размер массива можно узнать как sizeof(array)/sizeof(array[0]), смещение  fk0(116 знак., 16.08.2013 16:12)
					- За использование типов данных, размер которых не гарантирован нужно, перед созжением, долго-долго пытать калёным железом :) - Скрипач(16.08.2013 19:53)
							- А я считаю, что сжигать нужно за экстремизм и за призывы к сожжению. Рекурсия, есличо :-) - SciFi(16.08.2013 20:33)
									- А чо про "пытки каленым железом" забыли? Я считаю, нужны :) - Скрипач(16.08.2013 20:39)
											- А еще вырывание ногтей для особо забывчивых (см. 37 сек) :) - rezident(16.08.2013 20:43, youtube)
 
 
- А чо про "пытки каленым железом" забыли? Я считаю, нужны :) - Скрипач(16.08.2013 20:39)
											
 
- А я считаю, что сжигать нужно за экстремизм и за призывы к сожжению. Рекурсия, есличо :-) - SciFi(16.08.2013 20:33)
									
- Твое возмущение понятно. Потому что на разных платформах разная разрядность. Не помню, чего именно. Но меня это сейчас не трогает, пока я пробую на AVR. Да и в лом писать каждый раз и искать, чтобы скопипастить unsigned char, unsigned int. Быстро  mazur(26 знак., 16.08.2013 17:55)
							- Выражение "unsigned int" бессмысленно и сокращается до "unsigned". Либо до "int". Смотря что нужно. А вот с char аккуратнее! Либо всегда сам пиши "unsigned char", либо "signed char". Либо всегда помни, что по-умолчанию на данной платформе (если fk0(652 знак., 16.08.2013 18:00 - 18:03)
- Развивайте моторику пальцев. Если не можете набрать "unsigned" за 2 секунды, то откладывайте программирование и тренируйте навыки машинистки. - SciFi(16.08.2013 18:00)
									- пока набираешь, можно подумать о том, что набираешь :) - Vladimir Ljaschko(16.08.2013 18:13)
 
 
- в стандарте написано что размеры short, int и long имеют не убывающую последовательность, те могут быть 8-16-32, а могут и 32-32-32. так что uint8_t, uint16_t, uint32_t и сжигай сколько хочешь. - Nikolay801_(16.08.2013 17:39)
- avrlibtypes.h:  mazur(2233 знак., 16.08.2013 16:52)
							- Забей  - юзай что удобно. А если перейдёшь на Cortex, то тогда и посмотришь, что от этого и проблем-то нет - Vit(16.08.2013 17:04)
									- Я указал выше какие проблемы. Они есть. - fk0(16.08.2013 17:08)
											- бред там - Vit(16.08.2013 17:10)
													- Научись обосновывать свои утверждения. А сказанное мною здесь попросту многим не понятно. - fk0(16.08.2013 17:20)
															- не выделывайся - Vit(16.08.2013 17:21)
 
 
- Научись обосновывать свои утверждения. А сказанное мною здесь попросту многим не понятно. - fk0(16.08.2013 17:20)
															
 
- бред там - Vit(16.08.2013 17:10)
													
 
- Я указал выше какие проблемы. Они есть. - fk0(16.08.2013 17:08)
											
- Я тоже могу какую-нибудь ерунду запостить из недр /usr/include -- её там мегабайты. Вот видишь написано unsigned int, signed long и т.п. -- вот их и используй и не морочь мозги. - fk0(16.08.2013 17:00)
 
- Забей  - юзай что удобно. А если перейдёшь на Cortex, то тогда и посмотришь, что от этого и проблем-то нет - Vit(16.08.2013 17:04)
									
- 1) и CMSIS сжечь - Vit(16.08.2013 16:16)
							- Однозначно!  Я уже писал. Как, например, u32 в printf отправлять (%d, %ld -- что ему нужно?), scanf аналогично, (не)эффективности кода опять же (лишние команды на 32-битном ARM для u16, например). А как узнать максимальное/минимальное значение для  fk0(210 знак., 16.08.2013 16:21)
									- а какие ссылки у Профессионалов. У нас только указатели :-). - abivan(16.08.2013 16:57)
											- Паскаль лучше, чем C. - fk0(16.08.2013 17:03)
 
- всё это наносное - при портировании наоборот заостряет вопросы несовместимости архитектур/либ, иначе огрести из-за разной величины int как нефиг делать. - Vit(16.08.2013 16:36)
											- Нужно нормально писать код, чтоб не огрести. Все средства для этого есть. int специально так сделан, чтоб писать код работающий без изменений на любой архитектуре. А с u16 и т.п. -- нужно всё переписывать при смене платформы. Что точно является  fk0(258 знак., 16.08.2013 16:40)
													- и как на 8-ми разрядном int использовать для счетчика циклов до 255? оверхед и замедление предлагаешь? на проце с 24мя байтами озу и 512 флэша. - abivan(16.08.2013 17:06)
- Ерунда. Дважды делал проекты для MSP430 в паре с двумя разными программистами. Оба писали/отлаживали отдельные программные модули (не привязанные к "железу") на ПК под Windows. Типы данных были свои собственные переопределяемые под конкретную  rezident(81 знак., 16.08.2013 17:02)
															- Типичный пример "УМВР". Из частного никак не следует общего. А вот для доказательства обратного достаточно единичного примера, и они есть. Волшебные константы в коде (ибо свой limits.h для своих типов никто не написал). Тип стал шире. Не  fk0(408 знак., 16.08.2013 17:16)
																	- ну и намешал мух с котлетами. буэ - Vit(16.08.2013 17:38)
- Я же указал, что именованные типы переопределялись под конкретную платформу. Т.е. поросту говоря, uint16_t был именно 16-и разрядным (подбирался именной такой тип) на всех используемых платформах. - rezident(16.08.2013 17:28)
 
- А вот с использованием int, заточенного на 32-х разрядность ARM, нахлебался достаточно (чужой исходник пришлось в свой код имплементировать). - rezident(16.08.2013 17:10)
																	- Та же самая проблема, только наоборот. Исходник с гвоздям прибитым u16 точно так же способен выдать массу приключений на ARM -- во всех местах, где он соприкасается с внешним миром, в котором ожидают int. И заметно проиграть по-скорости в  fk0(19 знак., 16.08.2013 17:25)
																			- Не стоит обобщать на ровном месте. Именованные типы определенной разрядности используются преимущественно в выровненных структурах, предназначенных для передачи и обработки данных. Локальные переменные затачивать на разрядность никто и не  rezident(11 знак., 16.08.2013 17:32)
																					- Ещё раз сжигать. Жечь напалмом. За не пойми какую ендианность, за классные грабли на ARM7/PIC24 с ошибкой BUS ERROR и/или непредвиденным выравниванием... (Де)сериализаторы нужно писать руками, остальное грязный хак. Кортексы развращают. Сделать их  fk0(257 знак., 16.08.2013 17:56)
																							- Ну и облейте себя бензином, коль уж хотите до конца честным быть. Это ведь вы исключительно библиотечные функции пользуете, а мы по-старинке - "вручную" разгребаем :) - rezident(16.08.2013 20:29)
- +1. Вот за это точно сжигать - Vit(16.08.2013 17:58)
 
 
- Ещё раз сжигать. Жечь напалмом. За не пойми какую ендианность, за классные грабли на ARM7/PIC24 с ошибкой BUS ERROR и/или непредвиденным выравниванием... (Де)сериализаторы нужно писать руками, остальное грязный хак. Кортексы развращают. Сделать их  fk0(257 знак., 16.08.2013 17:56)
																							
 
- Не стоит обобщать на ровном месте. Именованные типы определенной разрядности используются преимущественно в выровненных структурах, предназначенных для передачи и обработки данных. Локальные переменные затачивать на разрядность никто и не  rezident(11 знак., 16.08.2013 17:32)
																					
 
- Та же самая проблема, только наоборот. Исходник с гвоздям прибитым u16 точно так же способен выдать массу приключений на ARM -- во всех местах, где он соприкасается с внешним миром, в котором ожидают int. И заметно проиграть по-скорости в  fk0(19 знак., 16.08.2013 17:25)
																			
 
- Типичный пример "УМВР". Из частного никак не следует общего. А вот для доказательства обратного достаточно единичного примера, и они есть. Волшебные константы в коде (ибо свой limits.h для своих типов никто не написал). Тип стал шире. Не  fk0(408 знак., 16.08.2013 17:16)
																	
- даже спорить не хочу - не только с пиками имею дело:). пишешь явно о чём-то виртуальном... "любое переписывание", "принципиально невозможна компиляция" - вааще набор страшилок - Vit(16.08.2013 16:51)
															- Да, с K&R сложно поспорить. Идея об отсутствии типов с гвоздями прибитой разрядностью -- именно их. - fk0(16.08.2013 17:01)
																	- они точно C11 не придумывали. - Vit(16.08.2013 17:06)
																			- Я вообще-то про C89 или даже более старый. int всю жизнь не имел жёстко заданной ширины. - fk0(16.08.2013 17:17)
																					- а я о невозможности предать переменную библиотечной функции - Vit(16.08.2013 17:21)
																							- Указатель на неё не передашь. И даже warning можешь не получить. Саму переменную тоже: printf("%d", U32) при переезде с 32-бит на 16 бит. В лучшем случае компилятор умеет парсить формат printf и давать warning. А если vprintf, то не факт, что fk0(438 знак., 16.08.2013 17:31)
 
 
- а я о невозможности предать переменную библиотечной функции - Vit(16.08.2013 17:21)
																							
 
- Я вообще-то про C89 или даже более старый. int всю жизнь не имел жёстко заданной ширины. - fk0(16.08.2013 17:17)
																					
 
- они точно C11 не придумывали. - Vit(16.08.2013 17:06)
																			
 
- Да, с K&R сложно поспорить. Идея об отсутствии типов с гвоздями прибитой разрядностью -- именно их. - fk0(16.08.2013 17:01)
																	
 
 
- Нужно нормально писать код, чтоб не огрести. Все средства для этого есть. int специально так сделан, чтоб писать код работающий без изменений на любой архитектуре. А с u16 и т.п. -- нужно всё переписывать при смене платформы. Что точно является  fk0(258 знак., 16.08.2013 16:40)
													
 
- а какие ссылки у Профессионалов. У нас только указатели :-). - abivan(16.08.2013 16:57)
											
 
- Однозначно!  Я уже писал. Как, например, u32 в printf отправлять (%d, %ld -- что ему нужно?), scanf аналогично, (не)эффективности кода опять же (лишние команды на 32-битном ARM для u16, например). А как узнать максимальное/минимальное значение для  fk0(210 знак., 16.08.2013 16:21)
									
 
- За использование типов данных, размер которых не гарантирован нужно, перед созжением, долго-долго пытать калёным железом :) - Скрипач(16.08.2013 19:53)
							
- Размер элемента массива Timers_Queue определяется его типом tmrs_queue. sizeof (tmrs_queue) даст вам размер элемента массива (размер структуры) в байтах. Или нужно что-то другое? - rezident(16.08.2013 15:50)
- Размер указать нельзя, но можно оставить в структуре резерв. Например, так: Ксения(179 знак., 16.08.2013 15:24 - 15:39)
- Если я правильно понял суть ваших затруднений, то обратите внимание на union. - rezident(16.08.2013 15:32, ссылка)
- ну ты спросил. уже 3 ответа на 3 разных вопроса - abivan(16.08.2013 15:28)
- где у Вас элемент размером 3 байта? для определения размеров используйте sizeof и offsetof - abivan(16.08.2013 15:26)
					- Пример можно? Выше поправил. - mazur(16.08.2013 15:33)
							- все равно неясно в чем заморочка? в определении кол-ва элементов в массиве Timers_Queue или еще что. - abivan(16.08.2013 15:43)
									- offsetof - пока так, пока вопрос не пойму abivan(592 знак., 16.08.2013 15:45)
 
 
- все равно неясно в чем заморочка? в определении кол-ва элементов в массиве Timers_Queue или еще что. - abivan(16.08.2013 15:43)
									
 
- Пример можно? Выше поправил. - mazur(16.08.2013 15:33)
							
- эээ, а вопрос то в чем? ты объявляешь тип переменной - на основании объявленного типа под нее выделится нужный объем памяти. по большому счету неважно объявил ты ее отдельно или внутри структуры.  Snaky(126 знак., 16.08.2013 15:24)
					- Ну смотрите. В данный момент, массив из: байт статус, два байта счетчик. Хочу сделать следующее (в начале топика асмовская подпрограмма). Переменная счетчик. Указатель на массив. Указатель должен складываться со счетчиком, считывать байт статус.  mazur(147 знак., 16.08.2013 15:29)
							- реально раз 10 прочитал пока не начал что-то понимать. зачем так словами жонглировать? похоже у тебя проблемы с пониманием как обращаться к элементам структуры. у тебя массив структур, вот и обращайся сначала к нужной структуре из массива по  Snaky(278 знак., 16.08.2013 15:53)
									- А как нужно? - mazur(16.08.2013 15:56)
											- ну st_flags - это же член структуры, следовательно надо к нему по полному имени обращаться. Snaky(421 знак., 16.08.2013 16:04)
 
 
- А как нужно? - mazur(16.08.2013 15:56)
											
- в Си запись arr[index] эквивалентна index[arr], потому что эквивалентна *(arr + index). Указатель в Си это не только адрес переменной, но и инфа для компилятора о размере типа - она нужна именно для расчета смещения. т.е. размер массива структур  Vit(106 знак., 16.08.2013 15:44)
									- array[index] == *(typeof(array))((char*)array + sizeof(array[0])*index) - fk0(16.08.2013 16:15 - 16:25)
											- Тогда уж array[index] == *(array + index), зачем множить? - Ксения(16.08.2013 16:19)
 
- То есть, мне не нужно заморачиваться о размере элемента из байт-статус+счетчик? - mazur(16.08.2013 15:51)
											- Компилятор сам разберётся. Мне кажется, что для начала нужно устаканить один момент  Vit(315 знак., 16.08.2013 16:04)
													- Лучше ему пока не знать от typedef -- запутается в конец. Пусть пишет вручную struct, так нагляднее. - fk0(16.08.2013 16:17)
															- считаю, что как раз с ним нагляднее. struct вручную чревато мурашками - где описание, а где объявление, сами компиляторописатели не очень-то разбираются - Vit(16.08.2013 16:26)
																	- Не понимаю проблемы с компиляторами, их нет. А typedef вокруг каждого struct неудобен тем, что мы не видим, что это struct и можем подумать, что это скалярный тип данных. Потом, например, пытаться передавать по-значению. И даже работать будет, но  fk0(22 знак., 16.08.2013 16:38)
																			- есть. с профессиональными особенно. а скалярные типы давно все помнят наизусть:) - Vit(16.08.2013 16:42)
																					- Это из стандартных. А через что сделан MySuperDataType -- х.з. - fk0(16.08.2013 16:44)
																							- правильная IDE подскажет. или прыгнуть на определение поможет на крайняк. а в блокноте да, надо помнить. - Snaky(16.08.2013 16:54)
- ну дык и читать (хедеры) иногда нужно - Vit(16.08.2013 16:52)
 
 
- Это из стандартных. А через что сделан MySuperDataType -- х.з. - fk0(16.08.2013 16:44)
																							
 
- есть. с профессиональными особенно. а скалярные типы давно все помнят наизусть:) - Vit(16.08.2013 16:42)
																					
 
- Не понимаю проблемы с компиляторами, их нет. А typedef вокруг каждого struct неудобен тем, что мы не видим, что это struct и можем подумать, что это скалярный тип данных. Потом, например, пытаться передавать по-значению. И даже работать будет, но  fk0(22 знак., 16.08.2013 16:38)
																			
 
- считаю, что как раз с ним нагляднее. struct вручную чревато мурашками - где описание, а где объявление, сами компиляторописатели не очень-то разбираются - Vit(16.08.2013 16:26)
																	
 
- Лучше ему пока не знать от typedef -- запутается в конец. Пусть пишет вручную struct, так нагляднее. - fk0(16.08.2013 16:17)
															
- не нужно. Я понял тебе нужен цикл по всем элементам массива, т.е. проверить статусы во всех таймерах. можешь указатель ++, а можешь и индех массива ++ - abivan(16.08.2013 15:57)
 
- Компилятор сам разберётся. Мне кажется, что для начала нужно устаканить один момент  Vit(315 знак., 16.08.2013 16:04)
													
- +1 вообще не нужно оперировать быйтами. А только элементами массива и полями структуры. А если еще вырвнивание начнется ... - abivan(16.08.2013 15:47)
 
- array[index] == *(typeof(array))((char*)array + sizeof(array[0])*index) - fk0(16.08.2013 16:15 - 16:25)
											
 
- реально раз 10 прочитал пока не начал что-то понимать. зачем так словами жонглировать? похоже у тебя проблемы с пониманием как обращаться к элементам структуры. у тебя массив структур, вот и обращайся сначала к нужной структуре из массива по  Snaky(278 знак., 16.08.2013 15:53)
									
 
- Ну смотрите. В данный момент, массив из: байт статус, два байта счетчик. Хочу сделать следующее (в начале топика асмовская подпрограмма). Переменная счетчик. Указатель на массив. Указатель должен складываться со счетчиком, считывать байт статус.  mazur(147 знак., 16.08.2013 15:29)
							
 
- 1) за u08, u16 и т.п. сжигать нужно -- используй стандартные типы данных. 2) заморачиваться и не нужно -- для размера любого типа есть sizeof(type name or variable name), размер массива можно узнать как sizeof(array)/sizeof(array[0]), смещение  fk0(116 знак., 16.08.2013 16:12)
					
- объявление с выделением места struct {u08 st_flags; u16 st_cnt} Sys_Timers_Queue [ST_QUANTITY]; делается не в хедере  Vit(1756 знак., 12.08.2013 23:12 - 23:19)
			- Ага, а память под timer перед вызовом Sys_Timer_Append динамически выделять ? Для всяких там AVR и MSP - это не гуд. Да и вообще, для серьезных встраиваемых систем лучше на этапе компиляции знать, хватит ли оперативки.  tesla(243 знак., 13.08.2013 00:29 - 00:44)
					- я для 18-го и 24-го пика использую динамическое выделение памяти. Просто DMS нужно правильный использовать. Если логика работы подразумевает выделение памяти то беру и использую. У Вас есть опыт использования динамического выделения памяти? или Вы  abivan(285 знак., 14.08.2013 11:51)
							- Я - про другое. Одно дело, когда в автомобиле нафигатор зависнет, другое дело - система управления двигателем. - tesla(24.08.2013 21:15)
- +2 - fk0(14.08.2013 12:42)
 
- так понимаю, что Ваш колоссальный опыт позволяет вольно рассуждать насчет "вообще", "серьезных"... - Vit(13.08.2013 00:45)
							- Я вроде объяснил свою точку зрения. Ветка-то AVR, а не Андроид. А если Вас интересует мой опыт - это в личку. - tesla(13.08.2013 01:01)
									- Не ругайтесь, плиз, без надобности в тематической конфе - снёс. "Динамически выделять" сами придумали и все остальные Ваши рассуждения о том, как же это невкусно. Я предложил модульность, никакого динамического выделения памяти при этом не Vit(233 знак., 14.08.2013 09:32)
- Считаю, что Вы высказали глубоко ошибочные тезисы, не подкрепленные ничем, кроме Вашей точки зрения. Ваше кунфу круче - Vit(13.08.2013 01:09)
 
 
- Я вроде объяснил свою точку зрения. Ветка-то AVR, а не Андроид. А если Вас интересует мой опыт - это в личку. - tesla(13.08.2013 01:01)
									
- нет. их дцать для каждой из реально используемых дцати задач заводить (а не массив высосанного из пальца размера, причем не для задач, а для службы), но в список добавлять через Sys_Timer_Append. - Vit(13.08.2013 00:38)
							- А зачем Apтём(291 знак., 13.08.2013 00:46)
 
 
- я для 18-го и 24-го пика использую динамическое выделение памяти. Просто DMS нужно правильный использовать. Если логика работы подразумевает выделение памяти то беру и использую. У Вас есть опыт использования динамического выделения памяти? или Вы  abivan(285 знак., 14.08.2013 11:51)
							
- Проще и быстрее проверить флаг, чем проверка на ноль. Я делал и большей разрядности  таймеры. Таймерная служба только перебирае, проверяет флаг блокировки, декрементирует, и выставляет флаг таймаута, если отщелкало. Так как мне и этого хватило для  mazur(86 знак., 12.08.2013 23:25)
					- А я делаю так:  tesla(202 знак., 13.08.2013 00:09)
							- так "делаем что-то" начинается на один тик позже последнего декремента - Vit(13.08.2013 00:17)
									- Я об этом знаю. Если хочется совсем красиво, пишем функцию SetTimer(timer* t, unsigned int n){ *t = n+1;} tesla(158 знак., 13.08.2013 00:56)
 
 
- так "делаем что-то" начинается на один тик позже последнего декремента - Vit(13.08.2013 00:17)
									
- это только кажется, что проще - Vit(12.08.2013 23:32)
 
- А я делаю так:  tesla(202 знак., 13.08.2013 00:09)
							
 
- Ага, а память под timer перед вызовом Sys_Timer_Append динамически выделять ? Для всяких там AVR и MSP - это не гуд. Да и вообще, для серьезных встраиваемых систем лучше на этапе компиляции знать, хватит ли оперативки.  tesla(243 знак., 13.08.2013 00:29 - 00:44)
					
- Непонятно зачем у вас локальная переменная volatile ? Apтём(367 знак., 12.08.2013 22:08)
- На данный момент мне нечем вас отблагодарить. Могу выложить пробное баловство. Там на ассемблере работа с моей таймерной службой, клавиатурой, дисплеем с видеопамятью (1 раз в мс в дисплей выплевывается символ, обновление экрана за 84 мс). Видео ->  mazur(12.08.2013 21:48, youtube)
			- А где прога-то? Одни инклюды вижу. - Ксения(12.08.2013 22:03)
 
- Значит, вы доросли до массива структур :) Ксения(143 знак., 12.08.2013 21:43)
 
- Знаете, почему я на асме остановился на этом варианте программных таймеров? Нет ничего лишнего. Хватает почти на все. В моем случае значение просто декрементируется. Если мы берем другие варианты таймеров, то нужно класть в ОЗУ значение для  mazur(104 знак., 24.08.2013 23:47)fk0