Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS на LPC2888
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
steelfantom
Пытаюсь запустить FreeRTOS на LPC2888. Из GettingStarted для EWARM взял код генерирующий прерывания по таймеру. Как только разрешаю прерывания управление передается по адресу 0x58 (я так понимаю при переходе процессора в IRQ режим управление должно сразу передаваться на 0x18 - туда не попадает), тем не менее процессор в режиме IRQ. Посмотрел map-файл - непонятно откуда генерируется код, находящийся с 0x58 по 0x80. Может кто-нибудь подсказать в чем тут дело?
zltigo
QUOTE (steelfantom @ Jul 23 2010, 16:30) *
Пытаюсь запустить FreeRTOS на LPC2888. Из GettingStarted для EWARM взял код генерирующий прерывания по таймеру.

Что-то я не понял, Вы что лихим copy-paste решили сделать порт для LPC2888?
QUOTE
Посмотрел map-файл - непонятно...

Есть такое слово startup. Вот его изучения и начните.

steelfantom
Лихим - не лихим, но... для LPC2xxx FreeRTOS есть, периферию я пока не трогаю, кое-каких результатов добился (планировщик запускает первую задачу, приостановить ее можно), проблема сейчас в генерации прерываний по таймеру. Читал User Manual LPC2888. Не очень понял с какого startup'а Вы мне советуете начать разбираться.
zltigo
QUOTE (steelfantom @ Jul 23 2010, 18:10) *
Не очень понял с какого startup'а Вы мне советуете начать разбираться.

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

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

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

Вот и думайте, что у Вас в startup. В RTOS, там свой обработчик, а что Вы там накопмпастили из примера неведомо.
QUOTE
У меня же в PC оказывается 0x58.

Это уже в процессе исполнения неведомого кода. Переход, естественно, на 0x18. Там так или иначе должна быть разборка с контроллером прерывания из которого считывается адрес перехода на обработчик. Степени дибилизма писателей того, что запускается с 0х18 адреса бывают самые различные - каких только безумных оберток туда не вешают sad.gif, хотя там должна быть всего одна команда. Что там у Ввс - разбирайтесь, ибо сору-paste до добра точно не доводит.

steelfantom
Код
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 не попадает вообще.
zltigo
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

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

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

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


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.