|
Обсуждение из scmRTOS ветки, вынесено |
|
|
|
 |
Ответов
|
Jan 11 2008, 16:20
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 7-06-06
Пользователь №: 17 841

|
Выкачал порт avr-gcc 3.00.
Раньше пользовался 1.10. Системой очень доволен, за что спасибо авторам и поддерживающим её людям.
Мега 128. Тик системного таймера ~4.4 мс. Если время выполнения процесса превышает это время, происходит сбой.
Установил scmRTOS_CONTEXT_SWITCH_SCHEME равным 0. Хотя рекомендуют оставить 1. Не помню в какой ветке читал.
Если установить 1, то непонятно назначение следующего фрагмента. Нужен ли он? #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1 // Setup analog comparator as software interrupt source #if PORT_TOGGLE_BY_PIN_WRITE ACSR = (1 << ACBG); // Ref ON, interrupt on both edges #else ACSR = (1 << ACBG) | (1 << ACIS1); // Ref ON, falling edge #endif DRIVER(RAISE_PIN,OUT); // AIN1 - output // analog comparator propagation and synchronization delay _delay_us(2); ACSR |= (1 << ACI); ACSR |= (1 << ACIE); // ACIE ON, ACI OFF #endif
а также этот код DRIVER(TIMER_HOOK,OUT); DRIVER(IDLE_HOOK,OUT); // DRIVER(ISR_ENTER_PIN,OUT); DRIVER(ISR_EXIT_PIN,OUT);
У себя все это удалил, работает при scmRTOS_CONTEXT_SWITCH_SCHEME=0. Можно выполнение процесса впихнуть в 4.4 мс. Это нормальная работа системы? Раньше с такой ситуацией не приходилось иметь дело.
|
|
|
|
|
Jan 11 2008, 21:59
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Neyron @ Jan 11 2008, 18:20)  Мега 128. Тик системного таймера ~4.4 мс. Если время выполнения процесса превышает это время, происходит сбой. Это действительно непонятно. В смысле непонятно, что означают эти слова. Цитата Установил scmRTOS_CONTEXT_SWITCH_SCHEME равным 0. Хотя рекомендуют оставить 1. Не помню в какой ветке читал. При 0 переключение осуществляется немнооожечко быстрее, но больше пиковое использование стека. При 1 - наоборот. Тестовый проект 1-EventFlag проверялся в железе с осциллографом при всех комбинациях (включая TISRW/TISRW_SS).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 12 2008, 08:07
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 7-06-06
Пользователь №: 17 841

|
(Neyron @ Jan 11 2008, 18:20) * Мега 128. Тик системного таймера ~4.4 мс. Если время выполнения процесса превышает это время, происходит сбой.
Использую TCCR0 = 0x06 при кварце 14,74560. Т.е. таймер переполняется при 256(макс TCNT0)*256(делительTCCR0 )* 1/14.7456 МГц = 4.(4) мс
Теперь о времени выполнения процесса. main.cpp
uint8_t sec_tik; uint8_t WaitFilter; namespace OS { template<> OS_PROCESS void TTechnolog::Exec() { DDRB |= 1 << PB6; - Нога по которой вычисляется время выполнения процесса WaitFilter=2; - ожидание фильтрации for(;;) { PORTB &= ~(1 << PB6); - Старт процесса по осциллографу if((!(OS::GetTick200ms())) && (!(OS::GetTick1s()))) sec_tik=0; else sec_tik=0xff; - служебная переменная. если sec_tik=0, то пришла новая секунда. См. ниже. if(!WaitFilter) { Work_drv();- собственно работа. Здесь выполняется алгоритм поиска циклом for. } else if(!sec_tik) WaitFilter--;
PORTD ^= (1<<PD7); - сброс собаки PORTB |= 1<<PB6;- Стоп процесса по осциллографу Sleep(9);//40 ms } }
} // namespace OS
В Work_drv() задаю поиск по индексу от 0 до 127. На PB6 визуально наблюдаю время выполнения процесса. Без поиска оно составляет 25 мкс... Потом включаю поиск... С увеличением индекса время выполнения процесса растет (см. PB6). При достижении величины в 4.4 мс (тик системного таймера) идет сбой. Зависание на ноге PD7, потом возобновление работы... и так циклически.
P.S. По исходниках понял, что SysTickCount в ОС не используется... Можно ли безопасно использовать следующие доработки.. В верси 1.10 все работает без проблем. Для засекания секундных и 200м-секундных интервалов использую следующий код в OS_Kernel.h: void OS::TKernel::SystemTimer() .... #if scmRTOS_SYSTEM_TICKS_ENABLE == 1 SysTickCount++; if(SysTickCount>8) //40ms множитель 9 { SysTickCount = 0; SysTick200ms++; if(SysTick200ms>4)//200ms { SysTick200ms = 0; SysTick1s++; if(SysTick1s>4)//1s { SysTick1s = 0; } } } #endif .....
#if scmRTOS_SYSTEM_TICKS_ENABLE == 1 volatile dword SysTickCount; - счетчик системных тиков volatile dword SysTick200ms; - счетчик 200мс тиков (поездка регулятором) volatile dword SysTick1s; - считчик 1с тиков (посекундная отработка по технологогии) #endif
И соответственно, функции... #if scmRTOS_SYSTEM_TICKS_ENABLE == 1 INLINE inline dword GetTickCount() { TCritSect cs; return Kernel.SysTickCount; } INLINE inline dword GetTick200ms() { TCritSect cs; return Kernel.SysTick200ms; } INLINE inline dword GetTick1s() { TCritSect cs; return Kernel.SysTick1s; } #endif
|
|
|
|
|
Jan 12 2008, 22:16
|
Группа: Участник
Сообщений: 13
Регистрация: 23-10-04
Пользователь №: 968

|
Цитата(Neyron @ Jan 12 2008, 12:07)  PORTD ^= (1<<PD7); - сброс собаки А период собаки какой ?
|
|
|
|
Сообщений в этой теме
Clavyan Обсуждение из scmRTOS ветки Jan 5 2008, 06:24 spf Цитата(Clavyan @ Jan 5 2008, 11:24) Кто-н... Jan 5 2008, 07:09 ReAl Цитата(Clavyan @ Jan 5 2008, 08:24) Кто-н... Jan 5 2008, 12:03 Clavyan Спасибо за ответы, хотя я и впрямь написал не в ту... Jan 5 2008, 12:30 Сергей Борщ Цитата(Neyron @ Jan 11 2008, 18:20) DRIVE... Jan 11 2008, 16:51   Сергей Борщ Цитата(Neyron @ Jan 12 2008, 10:07) А у в... Jan 12 2008, 10:20    Neyron Цитата(Сергей Борщ @ Jan 12 2008, 14:20) ... Jan 12 2008, 10:56   ReAl Цитата(Neyron @ Jan 12 2008, 10:07) P.S. ... Jan 12 2008, 10:54    Neyron Цитата(solosh @ Jan 13 2008, 02:16) А пер... Jan 14 2008, 07:40 ReAl Ой, это даже не заметил - не надо снаружи никаких ... Jan 12 2008, 11:00 Сергей Борщ Цитата(ReAl @ Jan 12 2008, 13:00) Ой, это... Jan 12 2008, 18:46 Neyron Похоже я не прав... Это у меня где-то процесс улет... Jan 12 2008, 13:48 ReAl Цитата(Neyron @ Jan 12 2008, 15:48) Снача... Jan 12 2008, 17:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|