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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
haker_fox
сообщение Sep 29 2012, 06:12
Сообщение #31


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (AHTOXA @ Sep 29 2012, 13:53) *
Узнаем, кто виноват. Может видеобуфер тормозит.

Нет, видеобуфер точно не тормозит. Система виснет до вывода картинки. Извините, что не пояснил этот момент сразу. Сама картинка выводится "влет" rolleyes.gif А до вывода картинки происхоид основательная задержка в sleep, затем все sleep'ы отрабатываются правильно. Программа работает сутками, никаких ошибок...

Если обращение к массиву переместить в другое место к коду - проблема остается...

Кажется, я просчитался:
Если прошивка ложится с адреса 0xa0200000, а массив лежит с 0xa0222160, то он лежит после прошивки (она занимает 145760 байт). Т.е. после секции .text. Но все равно, последний адрес в map-файле это
CODE
text.align     0xa02a3188        0x0
                0xa02a3188                . = ALIGN (0x8)
                0xa02a3188                _etext = .
                0xa02a3188                _data_image = _etext

.data           0xa0600000      0x8d0 load address 0xa02a3188
                0xa0600000                . = ALIGN (0x4)
                0xa0600000                _data = .

Как я понимаю, это фрагмент нам позволяет убедится в том, что секция .data лежит очень далеко после секции .text Т.е. переменные и стек не могут затираться?!

Вставил в оську отладочный код
CODE
void TBaseProcess::sleep(timeout_t timeout)
{
    TCritSect cs;

    FHAL::halPrintf( "\r\nSleep 0" );
    Kernel.ProcessTable[Kernel.CurProcPriority]->Timeout = timeout;
    FHAL::halPrintf( "\r\nSleep 1" );
    Kernel.set_process_unready(Kernel.CurProcPriority);
    FHAL::halPrintf( "\r\nSleep 2" );
    Kernel.scheduler();
    FHAL::halPrintf( "\r\nSleep 3" );
}

На злосчастной функции выводится
CODE
Sleep 0
Sleep 1
Sleep 2

Т.е. висим прилично в шедулере, пока не знаю где.

Затем быстренько через положенный таймаут выводится то, что надо
CODE
Sleep 0
Sleep 1
Sleep 2
Sleep 3.
Sleep 0
Sleep 1
Sleep 2
Sleep 3.
Sleep 0
Sleep 1
Sleep 2
Sleep 3.
Sleep 0
Sleep 1
Sleep 2
Sleep 3.

Точка после тройки, это точка, изображающая диаграммку) т.е. как и должно быть. Интересно, что на шедулере вся оська виснет... Таймаут функции sleep передается без искажений...

В шедулере висим на этом
CODE
os_context_switcher(Curr_SP_addr, Next_SP);

Причем, если отладочного дебага добавить/убавить, то иногда не висим! Дело в выравнивании? Но, как мне кажется, в скрипте все настроено... Да и каким образом массив в конце может влиять на что-то за несколько строк кода до его чтения? Блин, я уже заинтригован blush.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 29 2012, 08:31
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (haker_fox @ Sep 29 2012, 09:12) *
В шедулере висим на этом
CODE
os_context_switcher(Curr_SP_addr, Next_SP);
Какой метод передачи управления используется? Если по прерыванию, то, возможно, какое-то прерывание на это большое время блокирует остальные и до вызова обработчика переключения контекста дело просто не доходит. Хотя, тогда висели бы в этом обработчике а не в переключении контекста. В общем надо копать в эту сторону - почему не вызывается прерывание переключателя контекста. И почему оно потом вдруг вызывается.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 29 2012, 09:22
Сообщение #33


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Сергей Борщ @ Sep 29 2012, 17:31) *
Какой метод передачи управления используется? Если по прерыванию, то, возможно, какое-то прерывание на это большое время блокирует остальные и до вызова обработчика переключения контекста дело просто не доходит. Хотя, тогда висели бы в этом обработчике а не в переключении контекста. В общем надо копать в эту сторону - почему не вызывается прерывание переключателя контекста. И почему оно потом вдруг вызывается.

У меня так
CODE
#define  scmRTOS_CONTEXT_SWITCH_SCHEME          0

Да уж... загадка на выходные... 1111493779.gif

По очень злой причине счетчик таймера был не в нулевом положении. И обработчик прерывания стартовал не сразу с необходимым периодом, а с солидной задержкой...
Пришлось в инициализацию добавить это
CODE
T0TC = 0;


Сергей Борщ, долгих лет и счастья! Ваша наводка мне очень помогла! Теперь все работает прекрасно!

Очень интересно, как это связано с длинной массива? wacko.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

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

 


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


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