07.03.2017, 19:26
|
|
Заблокирован
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,715
Сказал спасибо: 189
Сказали Спасибо 3,199 раз(а) в 2,074 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от NewWriter
|
whattafakatimer.preset
|
и охота те было столько букаф писать.......
|
|
|
|
07.03.2017, 21:24
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Запутался с volatile...
Ну а че б и не написать, мне букаф не жалко...
Сообщение от MikhailSh
|
несколько видов с разным количеством
|
мне кажется, здесь что-то не так вообще с самой задачей. Несколько видов таймеров с разным количеством... количеством "чего"? Быть может, можно как-то проще решить, без перемудривания?
|
|
|
|
09.03.2017, 10:23
|
|
Временная регистрация
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Запутался с volatile...
Поясню для чего нужен был указатель на программные таймеры, возможно есть другой способ обойтись без указателя.
Например объявлены 2 группы (могут быть и другие) программных таймеров с разными единицами счета:
Код:
|
typedef struct
{
unsigned int Count; //Текущее значение таймера
unsigned int Preset; //Конечное значение таймера для определения события
unsigned char Mode; //Режим таймера
unsigned char Status; //Состояние таймера
} T_TIM;
typedef struct
{
unsigned char NumTim;
T_TIM * ptrTim;
} T_TIM_GROUP;
#define NUM_1 5
#define NUM_2 20
volatile T_TIM_GROUP TIM_TimGroup_1; //10ms
volatile T_TIM TIM_Tim_1[NUM_1 ];
volatile T_TIM_GROUP TIM_TimGroup_2; //100ms
volatile T_TIM TIM_Tim_1[NUM_2 ]; |
В обработчике прерывания от таймера происходит вызов ф-и обработки программых таймеров (одна для всех):
Код:
|
void TIM4_IRQHandler(void)
{
...
//Обработка программных таймеров с единицей счета 10 мс
TIM4_Count_1++;
if (TIM4_Count_1 == 10) //10*1ms=10ms
{
TIM4_Count_1 = 0;
TIM_Work(&TIM_TimersGroup_1); //Ф-я обработки
}
//Обработка программных таймеров с единицей счета 100 мс
TIM4_Count_2++;
if (TIM4_Count_2 == 100) //100*1ms=100ms
{
TIM4_Count_2 = 0;
TIM_Work(&TIM_TimersGroup_2); //Ф-я обработки
}
... |
В самой ф-и обработки перебираются все прог. таймеры из текущей группы:
Код:
|
void TIM_Work(volatile T_TIM_GROUP *TIM_GroupTimers)
{
unsigned short i = 0;
volatile TIM_STRUCT *TIM_Timer;
unsigned char NumTimers;
TIM_Timer = TIM_GroupTimers-›ptrTimers;
NumTimers = TIM_GroupTimers-›NumTimers;
for (i = 0; i ‹ NumTimers; i++)
{
if (TIM_Timer-›Mode == TIM_MODE_EMPTY)
{
TIM_Timer++;
continue;
}
if (TIM_Timer-›Mode == TIM_MODE_ON_DELAY) //Если таймер на задержку включения
{
...
} |
Не хотел я передавать в эту ф-ю доп. параметр - как количество таймеров в группе (просто не нравится такая запись). А передать указатель на массив типа:
volatile T_TIM TIM_Tim_ХХХ[NUM_ХХХ ];
то нет данных о числе прог. таймеров в группе для цикла FOR(). Делать одинаковым количество во всех группах тож не хочу, они могут значительно отличаться. А так же самих групп может быть несколько. Поэтому нашел выше приведенный способ.
|
|
|
|
09.03.2017, 11:08
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Запутался с volatile...
Мдяяя.... Конечно же, вовсе не обязательно накручивать столь хитрозапутанную систему с излишними параметрами типа режима, начального и конечного значения счета. Ведь что нужно от таймера? Чтобы он отсчитал от начального значения до 0 и каким-либо образом оповестил о завершении счета. Это и будет являться истечением заданного интервала.
Вполне достаточно того, что использовать один таймер SysTick с периодом счета 1 мс. И 32-битной переменной в счетчике миллисекунд вам уж точно хватит, чтобы отсчитать любой интервал времени от 1 мс до чето около полутора месяцев непрерывной работы. Хватит? Вот. Поэтому группы таймеров с разной единицей счета сразу отпадают.
Конечное состояние - удобнее всего =0. Посему, потребуется только начальное состояние, от которого будет считать вниз.
Флаг состояния - да, нужен. Режимы работы - хм? типа однократный/циклический? Хм.
Не пытайтесь создать универсальный на все случаи жизни код. Делайте только то, что действительно необходимо в конкретной задаче.
|
|
|
|
09.03.2017, 14:51
|
|
Временная регистрация
Регистрация: 06.05.2007
Сообщений: 75
Сказал спасибо: 18
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Запутался с volatile...
Да, возможно так лучше будет.
Режимов пока всего два: задержка включения и выключения может еще добавлю...
https://habrahabr.ru/post/273077/
|
|
|
|
09.03.2017, 15:31
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
|
Re: Запутался с volatile...
Где-то на просторах инета (ссылки на текущий момент нет; кажется, на форуме радиокот )
попадался красивейший пример реализации программного таймера от ЛИ (участник форума).
Практически полный программный аналог general-purpose timer-а STM32, базируется на СисТик-е
и не требует прерываний. Приведенный фрагмент кода был написан на C++ для обработки
ввода от энкодера, но ведь тут важна сама идея
Организовывается необходимое количество таймеров без вмешательства в кристалл )
Если посчастливится найти - то, как говорится, must have.
|
|
|
|
09.03.2017, 16:28
|
|
Вид на жительство
Регистрация: 07.01.2007
Адрес: Ленинградская обл
Сообщений: 428
Сказал спасибо: 147
Сказали Спасибо 71 раз(а) в 56 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от MikhailSh
|
Вопрос разве volatile на структуру не передается на все ее переменные?
|
Вот Вы экспериментально и изучаете, что передаётся
Передаваться может что угодно. Стандарта нет. Есть "понятия" той или иной C среды для группы микропроц.
volatile - это не значит "так, как представляется мне"
Судя по нескольким таймерам, задача ещё не продумана
По моему опыту - даже один аппаратный таймер не работает как надо (пр-ммы - в кодах). Даже так. Не стоит на это рассчитывать...
|
|
|
|
09.03.2017, 18:52
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Запутался с volatile...
Если аппаратный таймер работает как-то не так, значит, вы делаете что-то не так.
Сообщение от j-Roger
|
Организовывается необходимое количество таймеров без вмешательства в кристалл
|
Это, простите, как - "без вмешательства в кристалл"? В "кристалл" никто отверткой и паяльником не лезет и без того.
Сообщение от j-Roger
|
базируется на СисТик-е и не требует прерываний.
|
Нууу как же это не требует? Хоть какое-то прерывание быть должно хоть как. Иначе грош цена такому таймеру, он будет считать что угодно, только не желаемый интервал времени.
Сообщение от j-Roger
|
на C++ для обработки
ввода от энкодера
|
Для этого предназначен аппаратный таймер в режиме работы с энкодером. Тут даже мудрить ничего не надо.
Кто такой этот ЛИ (китаец, чтоль? или индус?) я не знаю, но видно, что он че-то недоперемудрил, эт точняк. Ибо для энкодера больше подходят внешние прерывания, нежели программный таймер.
Сообщение от j-Roger
|
красивейший
|
Скорее - глупейший и жутко прожорливый на ресурсы ЦП.
|
|
|
|
09.03.2017, 22:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от j-Roger
|
Практически полный программный аналог general-purpose timer-а STM32, базируется на СисТик-е
|
Разрешение такого таймера не будет выше чем 1мС. Так что до general-purpose ему далековато.
|
|
|
|
09.03.2017, 23:04
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 748
Сказал спасибо: 365
Сказали Спасибо 822 раз(а) в 386 сообщении(ях)
|
Re: Запутался с volatile...
Сообщение от NewWriter
|
Это, простите, как - "без вмешательства в кристалл"?
|
Вы не процитировали последний символ в строке - символ ")"
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:13.
|
|