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

 
 
> Прикручиваю ось к LPC2478, Есть и будут вопросы)
haker_fox
сообщение Aug 21 2012, 06:22
Сообщение #1


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

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



Добрый день, коллеги!

Скачал последнюю версию порта для LPC2xxx. К сожалению, на LPC2478 код не запускается, пришлось маленько пофиксить инициализацию периферии, немного ассемблера в одном из файлов ОСи. Вроде дело пошло. Задачи запускаются. Я не уверен в надежности и стабильности, пока тестирую.

Пока первый вопрос.

Как я понял, планировщик может вызываться из прерывания системного таймера и по софтовому прерыванию. Это задается опцией scmRTOS_CONTEXT_SWITCH_SCHEME. Мне кажется, что для LPC2478 софтовое прерывание не нужно. Достаточно таймерного. Я правильно понимаю? Т.е. можно использовать scmRTOS_CONTEXT_SWITCH_SCHEME = 0?

Гм... скажем так, я, прочитав документацию, так и не понял, чем отличаются два метода вызова планировщика, и какой когда использовать?

Спасибо!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Sep 28 2012, 12:06
Сообщение #2


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

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



Новое интересное поведение)
Программа работает великолено. Решил на LCD вывести картинку 480x272x24. На Питоне написал скрипт, который конвертнул картинку в const const
CODE
uint32_t logoImg[] = { ... }
. На каждый пиксель, естественно, 4 байта. Получил размер массива 272 * 480 * 4 = 522 240 байт. Массив находится в хидере, который цепляется к программе. Вот тут-то начинается интересный эффект...

При вызове функции OS::sleep или любой другой, вызывающий переключение контекста, программа виснет на время, много превышающее заданный таймаут. Затем, продолжает нормально работать. Причем на sleep у меня построен небольшой цикл, который выводит каждый 15 мс на экран точку (типа линейка, показывающая процесс). Так вот, одна точка висит вместо 15 мс около минуты, затем дорисовываются все точки с необходимой скоростью. Что интересно, если массив маленько урезать, килобайт этак на 30, то программа работает без нареканий. Картинка, конечно, выводится с артефактами.

Посмотрел, что линкер ложит массив "по середине" прошивки.

У меня гипотеза. Я плохо знаю ассемблер, поэтому не очень ясно понимаю код переключения контекста. Но не может ли из за того, что в коде получилась солидная "дыра" в виде не кода, а данных, переключатель контекста отрабатывает не совсем верно. Ну например, перескакивает не на задачу, а на эти данные. Т.е. мы не может перейти "далеко" на код.

Правда, как объяснить, что после первой задержки, все остальные отрабатывают нормально?!

Спасибо! Извините, если немного сумбурно...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 28 2012, 16:25
Сообщение #3


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

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



Цитата(haker_fox @ Sep 28 2012, 18:06) *
Посмотрел, что линкер ложит массив "по середине" прошивки.

Попробуйте изменить имя массива на z_logoImg - ляжет в конец sm.gif
На самом деле сильно вряд ли, что недопрыгивает. Думаю, что начав выполнять код картинки, проц бы уже ни за что не вернулся к нормальному выполнению программы.
Посмотрите размерности индексных переменных при обращении к массиву. Вдруг где не хватает?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 29 2012, 00:39
Сообщение #4


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

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



QUOTE (AHTOXA @ Sep 29 2012, 01:25) *
Попробуйте изменить имя массива на z_logoImg - ляжет в конец sm.gif
На самом деле сильно вряд ли, что недопрыгивает. Думаю, что начав выполнять код картинки, проц бы уже ни за что не вернулся к нормальному выполнению программы.
Посмотрите размерности индексных переменных при обращении к массиву. Вдруг где не хватает?

Теперь массив объявле так
CODE
const uint32_t z_logoImg[] = {

Вот, что видим в map-файле
CODE
.rodata._ZL9z_logoImg
                0xa0222160    0x7f800 ./obj/FDesktop.o

Секции в скрипте линкера объявлены так (все во внешней SDRAM)
CODE
MEMORY
{
    RAM (rw)    : ORIGIN = 0xA0600000, LENGTH = 512k
    FLASH (rx)    : ORIGIN = 0xA0200000, LENGTH = 1024k
}


Массив упорно ложится ну не совсем по середине, конечно, но реже прошивку на лапопам rolleyes.gif

При обращении к массиву используется цикл
CODE
        uint32_t* dst = ( uint32_t* )0xa0000000;

        for( int i = 0; i < 480 * 272; i++ )
            *dst++ = z_logoImg[ i ];


Вроде с индексами все в порядке rolleyes.gif

В общем такое ощущение, что размер массива сильно мешает. Но из расределения памяти видно, что никаким образмо область FLASH не может затереть область RAM, т.к. между ними 4 метра...

Блин, загадка! crying.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 29 2012, 04:53
Сообщение #5


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

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



Цитата(haker_fox @ Sep 29 2012, 06:39) *
Массив упорно ложится ну не совсем по середине, конечно, но реже прошивку на лапопам rolleyes.gif

Странно. Если он в rodata, то всяко должен лежать после .text:
Код
        *(.text)                   /* remaining code */
        *(.text.*)                 /* remaining code */
        *(.rodata)                 /* read-only data (constants) */
        *(.rodata*)

Попробуйте убрать из цикла обращение к logoImg:
Код
        uint32_t* dst = ( uint32_t* )0xa0000000;
    for( int i = 0; i < 480 * 272; i++ )
            *dst++ = i;

Узнаем, кто виноват. Может видеобуфер тормозит.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Sep 29 2012, 06:12
Сообщение #6


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

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


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #8


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

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

Сообщений в этой теме
- haker_fox   Прикручиваю ось к LPC2478   Aug 21 2012, 06:22
- - Сергей Борщ   QUOTE (haker_fox @ Aug 21 2012, 09:22) Ка...   Aug 21 2012, 08:02
- - haker_fox   Спасибо за остоятельный ответ! К сожалению, я ...   Aug 21 2012, 12:48
|- - _Артём_   Цитата(haker_fox @ Aug 21 2012, 15:48) У ...   Aug 21 2012, 13:33
|- - haker_fox   QUOTE (_Артём_ @ Aug 21 2012, 22:33) А чт...   Aug 21 2012, 13:55
|- - _Артём_   Цитата(haker_fox @ Aug 21 2012, 16:55) Мн...   Aug 21 2012, 15:13
|- - haker_fox   QUOTE (_Артём_ @ Aug 22 2012, 00:13) То е...   Aug 21 2012, 15:19
|- - _Артём_   Цитата(haker_fox @ Aug 21 2012, 18:19) Да...   Aug 21 2012, 15:35
|- - haker_fox   QUOTE (_Артём_ @ Aug 22 2012, 00:35) А ап...   Aug 21 2012, 16:05
|- - _Артём_   Цитата(haker_fox @ Aug 21 2012, 19:05) В ...   Aug 21 2012, 16:15
|- - haker_fox   QUOTE (_Артём_ @ Aug 22 2012, 01:15) И чт...   Aug 22 2012, 04:52
|- - Сергей Борщ   QUOTE (haker_fox @ Aug 22 2012, 07:52) Да...   Aug 22 2012, 05:21
|- - haker_fox   QUOTE (Сергей Борщ @ Aug 22 2012, 14:21) ...   Aug 22 2012, 07:37
- - haker_fox   В общем остановился на scmRTOS_CONTEXT_SWITCH_SCHE...   Aug 23 2012, 02:52
- - haker_fox   Ну вот и следующий вопрос. Хочу сделать оговорку, ...   Aug 26 2012, 06:53
|- - _Артём_   Цитата(haker_fox @ Aug 26 2012, 09:53) Не...   Aug 26 2012, 18:44
||- - haker_fox   QUOTE (_Артём_ @ Aug 27 2012, 02:44) Если...   Aug 27 2012, 03:04
|- - shreck   Цитата(haker_fox @ Aug 26 2012, 13:53) На...   Aug 27 2012, 06:55
|- - haker_fox   QUOTE (shreck @ Aug 27 2012, 14:55) А что...   Aug 27 2012, 12:40
- - shreck   Порт lwIP 1.4.0 c использованием scmRTOS. ipnet_c...   Aug 28 2012, 03:02
- - shreck   Обнаружил досадную ошибку в порте, перекочевавшую ...   Aug 31 2012, 07:51
- - shreck   Цитата(haker_fox @ Sep 28 2012, 19:06) Но...   Sep 28 2012, 12:48
|- - haker_fox   QUOTE (shreck @ Sep 28 2012, 21:48) Наско...   Sep 28 2012, 12:54
|- - _Артём_   Цитата(shreck @ Sep 28 2012, 15:48) Наско...   Sep 28 2012, 12:57
|- - haker_fox   QUOTE (_Артём_ @ Sep 28 2012, 21:57) У ha...   Sep 28 2012, 13:02
|- - shreck   Цитата(_Артём_ @ Sep 28 2012, 19:57) У ha...   Sep 28 2012, 13:04


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

 


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


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