реклама на сайте
подробности

 
 
> Временные интервалы
Andruxa-1
сообщение Jun 21 2010, 08:55
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Я задействовал таймер1, прерывание по переполнению. Таймер служит для подсчета тиков ну и вычисления системного времени. Внешний кварц на 20 Мгц. Можно ли оптимизировать вычисления.
CODE
#include <avr\io.h>
#include <avr\interrupt.h>

uint32_t ulSystemTime = 0;
uint32_t ulTmp;

void SistemTimerInit(){
TCCR1A = 0;
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10);
}

uint32_t GetSystemTimeMS(){
cli();

ulTmp = (ulSystemTime<<16) + TCNT1;

sei();

return (ulTmp);
}

SIGNAL(SIG_OVERFLOW1)
{
cli();

ulSystemTime++;

sei();
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Jun 21 2010, 09:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



По какому критерию Вы бы хотели провести оптимизацию? Можно предложить:
CODE
#include <avr\io.h>
#include <avr\interrupt.h>

uint16_t uSystemTime = 0;

void SistemTimerInit(){
TCCR1A = 0;
TIMSK |= (1<<TOIE1);
TCCR1B |= (1<<CS10);
}

uint32_t GetSystemTimeMS(){
uint32_t ulTmp;
cli();
ulTmp = ((uint32_t)uSystemTime<<16) + TCNT1;
sei();
return (ulTmp);
}

SIGNAL(SIG_OVERFLOW1)
{
cli();
uSystemTime++;
sei();
}


Ещё: в процедуре обработки прерывания команды запрета/разрешения прерываний - излишни - они и так запрещены.
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 21 2010, 10:22
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



этот кусок занимает 22 команды в дизасме ulTmp = ((uint32_t)uSystemTime<<16) + TCNT1;
Поскольку uSystemTime и ulTmp это 4-ч байтовые, думаю можно оптимизировать вычисление, только, честно говря, я не знаю как sad.gif

Я формирую ШИМ с высокой длительностью 1 млс и низкий 10 млс, на фронтах погрешность в 31 мкс. Вот как я формирую ШИМ:
CODE

for(unsigned char i = 0; i < MAX_CHANEL; i++)
{
if(endis & (1<<i)) //Канал вкл/Выкл?
{
tt = GetSystemTimeMS() - ms[i];

if(curate & (1<<i)) //Текущий уровень высокий
{
if(tt > tTiming[1][i])
{
PORTC |= (1<<i);
curate &= ~(1<<i);
ms[i] = GetSystemTimeMS();
}
}

if((curate & (1<<i)) == 0)
{
if(tt > tTiming[0][i])
{
PORTC &= ~(1<<i);
curate |= (1<<i);
ms[i] = GetSystemTimeMS();
}
}
}//if(endis & (1<<i))
}//for(unsigned char i = 0; i < MAX_CHANEL; i++)


Сообщение отредактировал Andruxa-1 - Jun 21 2010, 10:26
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 21 2010, 10:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Andruxa-1 @ Jun 21 2010, 14:22) *
думаю можно оптимизировать вычисление, только, честно говря, я не знаю как sad.gif

Сделать ассемблерную вставку или написать GetSystemTimeMS на ассемблере. Процедура возвращает результат на регистрах. Фактически всё, что надо сделать в этой процедуре - положить uSystemTime на регистры (старшие байты - посмотреть в документации - на какие?) и считать в нужные регистры TCNT1 (два младших байта). Плюс команды cli и sei, да ещё команда возврата... Процедуру, короче описанной здесь - не придумать.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Andruxa-1   Временные интервалы   Jun 21 2010, 08:55
|- - MrYuran   Цитата(Andruxa-1 @ Jun 21 2010, 14:2...   Jun 21 2010, 10:28
||- - Andruxa-1   Цитата(MrYuran @ Jun 21 2010, 13:28) ...   Jun 21 2010, 10:32
||- - MrYuran   Цитата(Andruxa-1 @ Jun 21 2010, 14:3...   Jun 21 2010, 10:55
|- - Палыч   Цитата(Andruxa-1 @ Jun 21 2010, 14:2...   Jun 21 2010, 11:07
||- - Andruxa-1   Многоканальный генератор электрических импульсов п...   Jun 21 2010, 11:41
||- - MrYuran   Цитата(Andruxa-1 @ Jun 21 2010, 15:4...   Jun 21 2010, 11:47
|||- - Andruxa-1   Цитата(MrYuran @ Jun 21 2010, 14:47) Посч...   Jun 21 2010, 12:00
|||- - MrYuran   Цитата(Andruxa-1 @ Jun 21 2010, 16:0...   Jun 21 2010, 12:19
||- - Andruxa-1   ATMega8   Jun 21 2010, 12:36
||- - Палыч   Цитата(Andruxa-1 @ Jun 21 2010, 16:3...   Jun 21 2010, 12:51
||- - MrYuran   Цитата(Палыч @ Jun 21 2010, 16:51) Восемь...   Jun 21 2010, 15:23
|- - =GM=   Можно вот так оптимизировать Кодtt=GetSystemTimeMS...   Jun 21 2010, 15:26
|- - Andruxa-1   Цитата(=GM= @ Jun 21 2010, 18:26) Можно в...   Jun 22 2010, 10:02
|- - Палыч   Цитата(Andruxa-1 @ Jun 22 2010, 14:0...   Jun 22 2010, 11:00
|- - =GM=   Совершенно верно. Андрукса, какой у вас джиттер п...   Jun 22 2010, 11:26
|- - Andruxa-1   Цитата(=GM= @ Jun 22 2010, 14:26) Соверше...   Jun 22 2010, 12:32
|- - demiurg_spb   Цитата(Andruxa-1 @ Jun 22 2010, 16:3...   Jun 22 2010, 12:33
|- - =GM=   Цитата(Andruxa-1 @ Jun 22 2010, 11:3...   Jun 22 2010, 12:58
|- - Andruxa-1   Цитата(=GM= @ Jun 22 2010, 15:58) Похоже,...   Jun 22 2010, 13:13
|- - =GM=   Сути чего?   Jun 22 2010, 13:32
|- - Andruxa-1   Цитата(=GM= @ Jun 22 2010, 16:32) Сути че...   Jun 22 2010, 13:35
|- - =GM=   Ну, при программном подходе джиттер будет всегда, ...   Jun 22 2010, 15:24
- - xemul   Завести таймер на 5 мкс, в его прерывании делать т...   Jun 22 2010, 16:18
|- - singlskv   Цитата(xemul @ Jun 22 2010, 20:18) uint24...   Jun 23 2010, 18:26
|- - =GM=   Цитата(xemul @ Jun 22 2010, 15:18) Завест...   Jun 24 2010, 22:35
|- - xemul   Цитата(=GM= @ Jun 25 2010, 02:35) Тогда у...   Jun 25 2010, 10:07
|- - =GM=   Из поста #26. 1) Ну смотрите, объясняю конструкци...   Jun 25 2010, 11:30
|- - xemul   Цитата(=GM= @ Jun 25 2010, 15:30) Из пост...   Jun 25 2010, 12:46
|- - =GM=   Немного повергло в шок, как компилятор WinAVR тран...   Jun 25 2010, 15:56
|- - xemul   Цитата(=GM= @ Jun 25 2010, 19:56) Но по з...   Jun 25 2010, 16:26
||- - =GM=   А зачем орить? После std сразу brne ... Но это не ...   Jun 25 2010, 21:05
||- - =GM=   Вот, немного переделал алгоритм if(sysTime>end...   Jun 28 2010, 12:12
|- - demiurg_spb   Цитата(=GM= @ Jun 25 2010, 19:56) Немного...   Jun 28 2010, 17:14
|- - =GM=   Цитата(demiurg_spb @ Jun 28 2010, 16:14) ...   Jun 28 2010, 22:08
|- - demiurg_spb   Цитата(=GM= @ Jun 29 2010, 02:08) Где ж н...   Jun 29 2010, 11:48
|- - =GM=   Това-а-рищ Иванов, не надо настаивать на глупости ...   Jun 29 2010, 12:13
|- - demiurg_spb   Для волатильных объектов компилятор фактически не ...   Jul 1 2010, 10:07
- - Andruxa-1   Спасибо за ответы и подсказки, буду пробовать.   Jun 24 2010, 14:33
- - singlskv   Кстати, задачка на самом деле очень интересная, и ...   Jun 24 2010, 21:04
|- - Палыч   Цитата(singlskv @ Jun 25 2010, 01:04) Кст...   Jun 25 2010, 05:57
|- - singlskv   Цитата(Палыч @ Jun 25 2010, 09:57) Вот и ...   Jun 25 2010, 07:08
|- - MrYuran   Цитата(singlskv @ Jun 25 2010, 11:08) Вид...   Jun 25 2010, 07:18
|- - singlskv   Цитата(MrYuran @ Jun 25 2010, 11:18) Вы в...   Jun 25 2010, 07:24
- - MrYuran   В общем, если отбросить чисто академические изыски...   Jun 25 2010, 06:07
|- - =GM=   Цитата(MrYuran @ Jun 25 2010, 05:07) -В о...   Jun 25 2010, 09:12
- - XVR   ЦитатаЕстественно, можно было оптимизировать и не ...   Jul 2 2010, 06:22
- - demiurg_spb   Цитата(XVR @ Jul 2 2010, 10:22) Если комп...   Jul 2 2010, 12:45


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016