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

 
 
> Программная задержка перед стартом ОС
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
Ответов (1 - 8)
Demeny
сообщение Nov 12 2010, 10:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Pavel V. @ Nov 12 2010, 13:08) *
Приводит к бесконечным рестартам устройства. Причем, поведение зависит от величины задержки.

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


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 12 2010, 10:18
Сообщение #3


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

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



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

Скорее всего, дело в TimerB_Init();
Наверно, какой-то таймаут срабатывает.
Может, его перед стартом ОС повторить?


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


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Не успевает ли срабоатть обработчик тикового прерывания ОС. А еще не запущена ОС, следовательно обработчик может там дел натворить. От чего работает тиковый таймер?
Go to the top of the page
 
+Quote Post
Pavel V.
сообщение Nov 12 2010, 10:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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
ReAl
сообщение Nov 12 2010, 11:37
Сообщение #8


Нечётный пользователь.
******

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



Если я что-то в чём-то понимаю, то разрешать прерывания перед стартом ОС не нужно.
Конструктор процесса инициализирует образ регистра состояния на стеке процесса значением, разрешающим прерывания.
В конце «восстановления» контектса первого процесса на старте ОС прерывания автоматически будут разрешены.
Неужели для Вашего контроллера не так?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Nov 12 2010, 12:50
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(Pavel V. @ Nov 12 2010, 14:16) *
Видимо, прерывание возникало сразу же после разрешения прерываний и система уходила в астрал из-за того, что ядро еще не стартануло..

Ставиться флаг от таймера мог в любой момент и до разрешения прерывания, а само прерывание, действительно, возникало только после разрешения.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:26
Рейтинг@Mail.ru


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