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

 
 
> Программная задержка перед стартом ОС
Pavel V.
сообщение Nov 12 2010, 10:08
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Портирую одно устройство на scmRTOS и все шло хорошо, пока не начал заниматься датчиками, висящими на шине 1-Wire.

После долгих разборок удалось локализовать проблему, и вот что получилось:
Код
void main() {
    WDTCTL = WDTPW + WDTHOLD;
    TimerB_Init();

    __enable_interrupt();
        OS::Run();
}


Этот код работает, ОС запускается, задачи переключаются.

А вот этот:
Код
void main() {
    WDTCTL = WDTPW + WDTHOLD;
    TimerB_Init();

        for(volatile uint16_t i = 0; i < 5000; i++);

    __enable_interrupt();
        OS::Run();
}


Приводит к бесконечным рестартам устройства. Причем, поведение зависит от величины задержки. Если написать:
Код
for(volatile uint16_t i = 0; i < 1000; i++);

ОС запускается..

Компилятор - IAR.

Видимо, я не понимаю какие-то фундаментальные вещи, но своим умом понять не могу sad.gif

К сообщению прикладываю тестовый проект.
Прикрепленные файлы
Прикрепленный файл  scmrtos.zip ( 172.07 килобайт ) Кол-во скачиваний: 16
 


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Pavel V.
сообщение Nov 12 2010, 10:43
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Инициализация таймера:
Код
/*
* Init Timer B
*/
void TimerB_Init() {
    TBCTL = TBSSEL_2 + ID_3 + MC_1;    // SMCLK, /8, Up Mode, Interrupt Enable
    TBCCR0 = 1382 - 1;
    TBCCTL0 = CCIE;
}


Цитата
А смысл этой задержки?

В данном тестовом примере смысла нет, в боевом же софте в этот момент производится сканирование шины 1-wire, при этом сумма задержек приводит к таким же последствиям.

Цитата
Видимо, срабатывает watchdog

В первой строчке сторожевой таймер отключается.

Цитата
Не успевает ли срабоатть обработчик тикового прерывания ОС. А еще не запущена ОС, следовательно обработчик может там дел натворить. От чего работает тиковый таймер?

По идее не должен, т.к. прерывания разрешаются непосредственно перед стартом ОС. До этого они запрещены по умолчанию.

Системный таймер работает от Timer B.


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 12 2010, 11:02
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Pavel V. @ Nov 12 2010, 13:43) *
По идее не должен, т.к. прерывания разрешаются непосредственно перед стартом ОС. До этого они запрещены по умолчанию.
Системный таймер работает от Timer B.

Ну так перезапустите его перед OS::Run()


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Pavel V.
сообщение Nov 12 2010, 11:16
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Цитата(MrYuran @ Nov 12 2010, 14:02) *
Ну так перезапустите его перед OS::Run()

Да, действительно wassat.gif

Видимо, прерывание возникало сразу же после разрешения прерываний и система уходила в астрал из-за того, что ядро еще не стартануло..

Вопрос можно считать закрытым. А я целый день мучился понять причины такого поведения.

Спасибо всем за помощь! smile.gif


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:29
Рейтинг@Mail.ru


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