|
|
  |
FreeRTOS на LPC2888, Проблема с прерываниями |
|
|
|
Jul 23 2010, 13:30
|
Группа: Участник
Сообщений: 13
Регистрация: 23-07-10
Пользователь №: 58 574

|
Пытаюсь запустить FreeRTOS на LPC2888. Из GettingStarted для EWARM взял код генерирующий прерывания по таймеру. Как только разрешаю прерывания управление передается по адресу 0x58 (я так понимаю при переходе процессора в IRQ режим управление должно сразу передаваться на 0x18 - туда не попадает), тем не менее процессор в режиме IRQ. Посмотрел map-файл - непонятно откуда генерируется код, находящийся с 0x58 по 0x80. Может кто-нибудь подсказать в чем тут дело?
|
|
|
|
|
Jul 23 2010, 14:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (steelfantom @ Jul 23 2010, 16:30)  Пытаюсь запустить FreeRTOS на LPC2888. Из GettingStarted для EWARM взял код генерирующий прерывания по таймеру. Что-то я не понял, Вы что лихим copy-paste решили сделать порт для LPC2888? QUOTE Посмотрел map-файл - непонятно... Есть такое слово startup. Вот его изучения и начните.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 23 2010, 15:10
|
Группа: Участник
Сообщений: 13
Регистрация: 23-07-10
Пользователь №: 58 574

|
Лихим - не лихим, но... для LPC2xxx FreeRTOS есть, периферию я пока не трогаю, кое-каких результатов добился (планировщик запускает первую задачу, приостановить ее можно), проблема сейчас в генерации прерываний по таймеру. Читал User Manual LPC2888. Не очень понял с какого startup'а Вы мне советуете начать разбираться.
|
|
|
|
|
Jul 23 2010, 17:31
|
Группа: Участник
Сообщений: 13
Регистрация: 23-07-10
Пользователь №: 58 574

|
Цитата(zltigo @ Jul 24 2010, 00:12)  Просто отдельный (не системный тик) обработчик? От обработчика ничего не зависит - до него выполнение даже не доходит. Я же говорю - в книгах написано, что при поступлении irq-прерывания процессор переходит в IRQ режим и в program counter загружается 0x18(это как раз в cstartup), оттуда вызывается обработчик прерываний. У меня же в PC оказывается 0x58. А в IAR'овской демке для LPC2888 все работает.
|
|
|
|
|
Jul 23 2010, 18:31
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (steelfantom @ Jul 23 2010, 20:31)  и в program counter загружается 0x18(это как раз в cstartup) Вот и думайте, что у Вас в startup. В RTOS, там свой обработчик, а что Вы там накопмпастили из примера неведомо. QUOTE У меня же в PC оказывается 0x58. Это уже в процессе исполнения неведомого кода. Переход, естественно, на 0x18. Там так или иначе должна быть разборка с контроллером прерывания из которого считывается адрес перехода на обработчик. Степени дибилизма писателей того, что запускается с 0х18 адреса бывают самые различные - каких только безумных оберток туда не вешают  , хотя там должна быть всего одна команда. Что там у Ввс - разбирайтесь, ибо сору-paste до добра точно не доводит.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 23 2010, 18:49
|
Группа: Участник
Сообщений: 13
Регистрация: 23-07-10
Пользователь №: 58 574

|
Код MODULE ?cstartup ;; Forward declaration of sections. SECTION IRQ_STACK:DATA:NOROOT(3) SECTION ABT_STACK:DATA:NOROOT(3) SECTION SVC_STACK:DATA:NOROOT(3) SECTION UND_STACK:DATA:NOROOT(3) SECTION FIQ_STACK:DATA:NOROOT(3) SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN vPortYieldProcessor
ARM __vector: ldr pc,[pc,#+24] ;; Reset ldr pc,[pc,#+24] ;; Undefined instructions ldr pc,[pc,#+24] ;; Software interrupt (SWI/SVC) ldr pc,[pc,#+24] ;; Prefetch abort ldr pc,[pc,#+24] ;; Data abort __vector_0x14 DC32 0 ;; RESERVED ldr pc,[pc,#+24] ;; IRQ ldr pc,[pc,#+24] ;; FIQ
DC32 __iar_program_start ;; Reset DC32 undef_handler ;; Undefined instructions DC32 swi_handler ;; Software interrupt (SWI/SVC) DC32 prefetch_handler ;; Prefetch abort DC32 data_handler ;; Data abort DC32 0 ;; RESERVED DC32 irq_handler ;; IRQ DC32 fiq_handler ;; FIQ
undef_handler b undef_handler
swi_handler b vPortYieldProcessor prefetch_handler b prefetch_handler
data_handler b data_handler
irq_handler b irq_handler
fiq_handler b fiq_handler Пробовал менять так, по логике должно произойти зацикливание на irq_handler, однако в PC каким-то образом все равно оказывается 0x58. Отсюда я и сделал вывод, что обработчик не при чем, и в 0x18 не попадает вообще.
|
|
|
|
|
Jul 23 2010, 19:44
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (steelfantom @ Jul 23 2010, 21:49)  Отсюда я и сделал вывод, что обработчик не при чем, и в 0x18 не попадает вообще. Отсюда вывод, что данный cstartup муть и вектор потом через заднепроходное отверстие ( например, какая-нибудь pragma ) патчится и устанавливается на какой-то дивный обработчик. Ищите в исходниках и цепляйте дополнительный обработчик по заданным в нем правилам. Но лучше всю ту ботву за ненадобностью выкинуть - глянул официальный FreeRTOS порт IAR/LPC2100 там все вполне по-человечески сделано: CODE __vector: ;; ldr pc,[pc,#+24];; Reset ldr pc,[pc,#+24];; Undefined instructions ;; ldr pc,[pc,#+24];; Software interrupt (SWI/SVC) b vPortYieldProcessor ldr pc,[pc,#+24];; Prefetch abort ldr pc,[pc,#+24];; Data abort __vector_0x14 DC32 0 ;; RESERVED ldr pc, [PC, #-0xFF0];; IRQ Вот в его стиле и делайте. Потом пишите свой обработчик, программируете контроллер прерываний и все.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 23 2010, 20:03
|
Группа: Участник
Сообщений: 13
Регистрация: 23-07-10
Пользователь №: 58 574

|
Цитата(zltigo @ Jul 24 2010, 02:44)  ...вектор потом через заднепроходное отверстие ( например, какая-нибудь pragma ) патчится и устанавливается на какой-то дивный обработчик... А можно поподробнее, как например это может быть? Заранее спасибо
|
|
|
|
|
Jul 23 2010, 20:17
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (steelfantom @ Jul 23 2010, 23:03)  А можно поподробнее, как например это может быть? Заранее спасибо Понятия не имею, как сделан порт LPC2888 которым Вы пользуетесь. Если дадите ссылку, где Вы его взяли - посмотрю. Кстати, посмотрел на LPC2888 - там "самодельный" контролер не как у LPC2100 и не такой, как у LPC23/2400 прерываний - требуется софтом разбираться с приоритетами и брать адреса из таблицы в памяти. Зачем сделали "отличный" (от других) котнролер не понятно
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|