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

 
 
> Проблема с Sleep
_Артём_
сообщение Dec 19 2011, 16:56
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Добрый день.
Попробовал собрать тестовый проект с scmRTOS.
Вроде всё работало, и вдруг...
Обнаружил что простейший код не работает
Код
PORTG|=(1<<3); // зажёчь led
OS::Sleep(1);
PORTG&=~(1<<3);// потушить led


Процесс засыпает как положено и ... всё - больше не просыпается.
Подскажите что можно (нужно) смотреть смотреть.
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
AHTOXA
сообщение Dec 19 2011, 17:07
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А нет ли у вас рядом более приоритетного процесса, который не отдаёт управление?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 19 2011, 17:19
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ Dec 19 2011, 19:07) *
А нет ли у вас рядом более приоритетного процесса, который не отдаёт управление?


Нажал в AVRStudio Break: программа выполняет
Код
IdleProcessUserHook


Получается что нет более приоритетного.
А где можно посмотреть текущее значение SysTimer(или как том правильно называется).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 19 2011, 20:12
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Хм. Тогда похоже не запущен системный таймер.
(Текущее значение счётчика : OS::get_tick_count() для версии 4.00 или OS::GetTickCount() для 3.10)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 19 2011, 21:11
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ Dec 19 2011, 22:12) *
Хм. Тогда похоже не запущен системный таймер.
(Текущее значение счётчика : OS::get_tick_count() для версии 4.00 или OS::GetTickCount() для 3.10)


Да, похоже на: прочитал значение с интервалом несколько секунд вернуло 0.

Но в файле scmRTOS_CONFIG.h
Код
#define  scmRTOS_SYSTEM_TICKS_ENABLE        1


Думал этого достаточно. Нет?
Как тогда его запустить?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 19 2011, 21:48
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Как-то так (это в main()):
Код
    // Start System Timer
    TIMER0_CS_REG = (1 << CS01) | (1 << CS00); // clk/64
    TIMER0_IE_REG |= (1 << TOIE0);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 19 2011, 22:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ Dec 19 2011, 23:48) *
Как-то так (это в main()):
Код
    // Start System Timer
    TIMER0_CS_REG = (1 << CS01) | (1 << CS00); // clk/64
    TIMER0_IE_REG |= (1 << TOIE0);


Наверное был неправ с такой заменой:

Код
void timer1_init(void)
/*
TIMER1 initialize - prescale:1
WGM: 4) CTC, TOP=OCRnA
desired value: 1000Hz
actual value: 1000,090Hz (0,0%)
*/
{
    TCCR1B = 0x00; //stop
    TCNT1H = 0xD4; //setup
    TCNT1L = 0xCF;
    OCR1AH = 0x2B;
    OCR1AL = 0x31;
    OCR1BH = 0x2B;
    OCR1BL = 0x31;
    OCR1CH = 0x2B;
    OCR1CL = 0x31;
    ICR1H  = 0x2B;
    ICR1L  = 0x31;
    TCCR1A = 0x00;
    TCCR1B = 0x09; //start Timer
}
int main()
{    timer1_init();
    external_uart_init();
    TIMSK |=  (1 << OCIE1A);   //




    OS::Run();
}
#pragma vector=TIMER1_COMPA_vect
OS_INTERRUPT void Timer1_period_ISR()
{
    OS::TISRW_SS ISRW;
    if (ExtTxPtr.BufferNotEmpty())
    StartExtUartTx();

    ENABLE_NESTED_INTERRUPTS();
    
    Event1ms.SignalISR();
    PORTB |= (1 << 4);
}


Как-то показалось что при использовании Timer1 миллисекунда будет миллисекунднее, вот где-то что-то напортачил...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 20 2011, 03:58
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, этого недостаточно. В scmRTOS_TARGET_CFG.h определены макросы
Код
SYSTEM_TIMER_VECTOR
LOCK_SYSTEM_TIMER()
UNLOCK_SYSTEM_TIMER()

, которые отвечают за то, какое прерывание будет использоваться в качестве прерывания системного таймера.
(Обработчик этого прерывания определен в OS_Target_cpp.cpp). Если хотите делать что-то ещё по прерыванию системного таймера, то используйте хук:
Определите в scmRTOS_CONFIG.h
Код
scmRTOS_SYSTIMER_HOOK_ENABLE 1

и заведите функцию
Код
void OS::system_timer_user_hook()

. Она будет вызываться из обработчика системного таймера.
И ещё одно соображение. Первый таймер сильно круче нулевого, его жалко на тики (имхо конечно).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 20 2011, 07:48
Сообщение #9


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(AHTOXA @ Dec 20 2011, 05:58) *
И ещё одно соображение. Первый таймер сильно круче нулевого, его жалко на тики (имхо конечно).

Если нулевому отведена роль часов реального времени, то никуда не денешься.
Go to the top of the page
 
+Quote Post

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

 


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


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