-
- Знаете, почему я на асме остановился на этом варианте программных таймеров? Нет ничего лишнего. Хватает почти на все. В моем случае значение просто декрементируется. Если мы берем другие варианты таймеров, то нужно класть в ОЗУ значение для 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)
- Вовсе необязательно синонимы. Например, можно создать 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)
- А смысл? Получится тот же ассемблер, только на Си. Надобно Си использовать как ЯВУ (язык высокого уровня). Да, на первых порах сложно, 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