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

 
 
> 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
 
Start new topic
Ответов
steelfantom
сообщение Jul 23 2010, 18:49
Сообщение #2





Группа: Участник
Сообщений: 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
Сообщение #3


Гуру
******

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





Группа: Участник
Сообщений: 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
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 18th August 2025 - 06:12
Рейтинг@Mail.ru


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