|
Прикручиваю ось к LPC2478, Есть и будут вопросы) |
|
|
|
Aug 21 2012, 06:22
|

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

|
Добрый день, коллеги!
Скачал последнюю версию порта для LPC2xxx. К сожалению, на LPC2478 код не запускается, пришлось маленько пофиксить инициализацию периферии, немного ассемблера в одном из файлов ОСи. Вроде дело пошло. Задачи запускаются. Я не уверен в надежности и стабильности, пока тестирую.
Пока первый вопрос.
Как я понял, планировщик может вызываться из прерывания системного таймера и по софтовому прерыванию. Это задается опцией scmRTOS_CONTEXT_SWITCH_SCHEME. Мне кажется, что для LPC2478 софтовое прерывание не нужно. Достаточно таймерного. Я правильно понимаю? Т.е. можно использовать scmRTOS_CONTEXT_SWITCH_SCHEME = 0?
Гм... скажем так, я, прочитав документацию, так и не понял, чем отличаются два метода вызова планировщика, и какой когда использовать?
Спасибо!
--------------------
Выбор.
|
|
|
|
|
 |
Ответов
|
Sep 28 2012, 12:06
|

Познающий...
     
Группа: Свой
Сообщений: 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, то программа работает без нареканий. Картинка, конечно, выводится с артефактами. Посмотрел, что линкер ложит массив "по середине" прошивки. У меня гипотеза. Я плохо знаю ассемблер, поэтому не очень ясно понимаю код переключения контекста. Но не может ли из за того, что в коде получилась солидная "дыра" в виде не кода, а данных, переключатель контекста отрабатывает не совсем верно. Ну например, перескакивает не на задачу, а на эти данные. Т.е. мы не может перейти "далеко" на код. Правда, как объяснить, что после первой задержки, все остальные отрабатывают нормально?! Спасибо! Извините, если немного сумбурно...
--------------------
Выбор.
|
|
|
|
|
Sep 28 2012, 16:25
|

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

|
Цитата(haker_fox @ Sep 28 2012, 18:06)  Посмотрел, что линкер ложит массив "по середине" прошивки. Попробуйте изменить имя массива на z_logoImg - ляжет в конец  На самом деле сильно вряд ли, что недопрыгивает. Думаю, что начав выполнять код картинки, проц бы уже ни за что не вернулся к нормальному выполнению программы. Посмотрите размерности индексных переменных при обращении к массиву. Вдруг где не хватает?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 29 2012, 00:39
|

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

|
QUOTE (AHTOXA @ Sep 29 2012, 01:25)  Попробуйте изменить имя массива на z_logoImg - ляжет в конец  На самом деле сильно вряд ли, что недопрыгивает. Думаю, что начав выполнять код картинки, проц бы уже ни за что не вернулся к нормальному выполнению программы. Посмотрите размерности индексных переменных при обращении к массиву. Вдруг где не хватает? Теперь массив объявле так 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 } Массив упорно ложится ну не совсем по середине, конечно, но реже прошивку на лапопам При обращении к массиву используется цикл CODE uint32_t* dst = ( uint32_t* )0xa0000000;
for( int i = 0; i < 480 * 272; i++ ) *dst++ = z_logoImg[ i ]; Вроде с индексами все в порядке В общем такое ощущение, что размер массива сильно мешает. Но из расределения памяти видно, что никаким образмо область FLASH не может затереть область RAM, т.к. между ними 4 метра... Блин, загадка!
--------------------
Выбор.
|
|
|
|
|
Sep 29 2012, 04:53
|

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

|
Цитата(haker_fox @ Sep 29 2012, 06:39)  Массив упорно ложится ну не совсем по середине, конечно, но реже прошивку на лапопам  Странно. Если он в 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; Узнаем, кто виноват. Может видеобуфер тормозит.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
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    haker_fox QUOTE (AHTOXA @ Sep 29 2012, 13:53) Узнае... Sep 29 2012, 06:12     Сергей Борщ QUOTE (haker_fox @ Sep 29 2012, 09:12) В ... Sep 29 2012, 08:31      haker_fox QUOTE (Сергей Борщ @ Sep 29 2012, 17:31) ... Sep 29 2012, 09:22
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|