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

 
 
 
Reply to this topicStart new topic
> FreeRTOS на LPC2888, Проблема с прерываниями
steelfantom
сообщение Jul 23 2010, 13:30
Сообщение #1





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



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


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
steelfantom
сообщение Jul 23 2010, 15:10
Сообщение #3





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



Лихим - не лихим, но... для LPC2xxx FreeRTOS есть, периферию я пока не трогаю, кое-каких результатов добился (планировщик запускает первую задачу, приостановить ее можно), проблема сейчас в генерации прерываний по таймеру. Читал User Manual LPC2888. Не очень понял с какого startup'а Вы мне советуете начать разбираться.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 23 2010, 17:12
Сообщение #4


Гуру
******

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



QUOTE (steelfantom @ Jul 23 2010, 18:10) *
Не очень понял с какого startup'а Вы мне советуете начать разбираться.

Сишного, естественно. Только на мой вопрос Вы не ответили, хотя теперь у меня больше информации для догадок - операционка ни причем? Просто отдельный (не системный тик) обработчик?



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
steelfantom
сообщение Jul 23 2010, 17:31
Сообщение #5





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



Цитата(zltigo @ Jul 24 2010, 00:12) *
Просто отдельный (не системный тик) обработчик?

От обработчика ничего не зависит - до него выполнение даже не доходит. Я же говорю - в книгах написано, что при поступлении irq-прерывания процессор переходит в IRQ режим и в program counter загружается 0x18(это как раз в cstartup), оттуда вызывается обработчик прерываний. У меня же в PC оказывается 0x58. А в IAR'овской демке для LPC2888 все работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 23 2010, 18:31
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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 адреса бывают самые различные - каких только безумных оберток туда не вешают sad.gif, хотя там должна быть всего одна команда. Что там у Ввс - разбирайтесь, ибо сору-paste до добра точно не доводит.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
steelfantom
сообщение Jul 23 2010, 18:49
Сообщение #7





Группа: Участник
Сообщений: 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 не попадает вообще.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 23 2010, 19:44
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
steelfantom
сообщение Jul 23 2010, 20:03
Сообщение #9





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



Цитата(zltigo @ Jul 24 2010, 02:44) *
...вектор потом через заднепроходное отверстие ( например, какая-нибудь pragma ) патчится и устанавливается на какой-то дивный обработчик...

А можно поподробнее, как например это может быть? Заранее спасибо
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 23 2010, 20:17
Сообщение #10


Гуру
******

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



QUOTE (steelfantom @ Jul 23 2010, 23:03) *
А можно поподробнее, как например это может быть? Заранее спасибо

Понятия не имею, как сделан порт LPC2888 которым Вы пользуетесь. Если дадите ссылку, где Вы его взяли - посмотрю. Кстати, посмотрел на LPC2888 - там "самодельный" контролер не как у LPC2100 и не такой, как у LPC23/2400 прерываний - требуется софтом разбираться с приоритетами и брать адреса из таблицы в памяти. Зачем сделали "отличный" (от других) котнролер не понятно sad.gif




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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