Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2478 FreeRTOS port никто не видел/делал?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sergik_vrn
Перешел на новый проц (с STR710 на LPC2478), компиляю проект под IAR, FreeRTOS порт втупую не собирается, судя по всему, изменились регистры, и прилично изменились (для иар порт называется LPC2000, судя по хидерам он даже для LPC23хх не сгодится). Прежде чем самому разбираться, хотелось бы узнать, может не стоит изобретать велосипед?
meister
Цитата(sergik_vrn @ Dec 16 2008, 18:48) *
Перешел на новый проц (с STR710 на LPC2478), компиляю проект под IAR, FreeRTOS порт втупую не собирается, судя по всему, изменились регистры, и прилично изменились (для иар порт называется LPC2000, судя по хидерам он даже для LPC23хх не сгодится). Прежде чем самому разбираться, хотелось бы узнать, может не стоит изобретать велосипед?


Какая разница? Ядро то же самое - ARM7TDMI-S, придется поменять настройку контроллера прерываний и таймера. И только. Я так с 2146 на 2366 "перешел".
sergik_vrn
Цитата(meister @ Dec 16 2008, 17:56) *
Какая разница? Ядро то же самое - ARM7TDMI-S, придется поменять настройку контроллера прерываний и таймера. И только. Я так с 2146 на 2366 "перешел".

логика понятна, но у каждого процессора своя небольшая специфика. просто не очень хочется терять время на разбирательство сперва со "старым" контроллером прерываний, потом с новым - хотелось срубить "по-легкому" smile.gif не получится, значит не судьба
zltigo
Цитата(sergik_vrn @ Dec 17 2008, 00:33) *
просто не очень хочется терять время на разбирательство сперва со "старым" контроллером прерываний, потом с новым

Вот в первом приближении, достаточном для большинства случаев, разница:
Код
int install_irq( uint inum, void *handler, uint priority, int irq_enable )
{
    if( ( inum >= 32 )||( (priority ) >= VIC_SIZE ) )
        return( -1 );

    VICIntEnClear = (1<<inum);          // Disable Interrupt
    VICIntSelect &= (~(1<<inum));     // Classifies as IRQ
#if defined LPC2400
    *(ulong *)(&VICVectAddr0 + inum) = (ulong)handler;    // Set Handler
    *(ulong *)(&VICVectPriority0 + inum) = priority;
#else
    *(ulong *)(&VICVectAddr0 + priority ) = (ulong)handler;
    *(ulong *)(&VICVectCntl0 + priority ) = ( 0x20 | inum );    // Enable vector interrupt
#endif
    if( irq_enable )
        VICIntEnable = (1<<inum);    // Enable Interrupt
    return( 0 );
}
sergik_vrn
Цитата(zltigo @ Dec 17 2008, 01:19) *
Вот в первом приближении, достаточном для большинства случаев, разница:

еще раз большое спасибо!
sergik_vrn
вдогонку. кстати, о птичках. разобрался с векторами, порт переделал, все собралось, запускаю я свой урезанный проект под FreeRTOS, он успешно зависает в момент старта операционки. начинаю разбираться, обнаруживаю любопытный факт

Код
portRESTORE_CONTEXT MACRO

[..]
; Restore all system mode registers for the task.                 
    LDMFD    LR, {R0-R14}^
    NOP

; Restore the return address.                                     
    LDR        LR, [LR, #+60]

; And return - correcting the offset in the LR to obtain the     
; correct address.                                                 
    SUBS    PC, LR, #4

    ENDM

данный код используется для переключения задач, в том числе при старте. для первого запуска, разумеется, значения регистров в стеке забиваются фейковыми значениями. при выполнении LDMFD LR, {R0-R14}^ регистр LR (он же R14) восстанавливается из стека, значение его теряется, после чего
Код
    LDR    LR, [LR, #+60]
    SUBS    PC, LR, #4

отправляет PC в аут. любопытно, что в STR710 этот код прекрасно себе работает. никто с этим не сталкивался? или я опять туплю? и как лучше избавляться от этого, не восстанавливать R14 из стека? а как тогда быть с переключением контекста?...
aaarrr
Запускать просто нужно из режима SVC, а не SYS/USER.
sergik_vrn
Цитата(aaarrr @ Dec 17 2008, 13:55) *
Запускать просто нужно из режима SVC, а не SYS/USER.

спасибо, понял. пришлось повозиться с cstartup, но вроде ОС заработала. если кому-то вдруг понадобится рабочий порт под IAR 4.41, могу выложить
Hermes
я бы поковырялся бы... выложи пожалуйста на форум или на файлообменник wink.gif beer.gif
sergik_vrn
выкладываю. собственно, небольшие изменения в исходниках порта плюс cstartup'ы для IAR 4.x и 5.x
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.