Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FreeRTOS + LPC2378
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
3.14
Решил подправить пример freertos на lpc2129 под кейл-ом на сабжевый чип.
Втставил в родной startup.s часть касаюшуюся настроек тактирования, успешно пересобрал.
Запускаю дебагер, дебагер впадает в вечный цикл с ошибкой выбора инструкции по адресу 0xC ?!
Причем в оригинале, как полагается, после сброса в PC грузится 0х40.
3.14
Вобщем, не понял почему в данном случае у симулятора крыша едет ... если переключить чип (на 2129) при тех же исходниках то стартап оживает ...
Далее, главное в железе запускается.
Ну как и следовало ожидать, ничего сходу не вышло, стал выяснять на каком месте встает.
Успешно проходят функции:
prvSetupHardware();
vStartIntegerMathTasks( tskIDLE_PRIORITY );
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
vStartDynamicPriorityTasks();
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );

Далее входит в vTaskStartScheduler() в которой выполняется настройка таймера а после выполняется vPortISRStartFirstTask().
Так вот в это самой vPortISRStartFirstTask выполняется только один макрос (portRESTORE_CONTEXT()):
Цитата
#define portRESTORE_CONTEXT() \
{ \
extern volatile unsigned portLONG ulCriticalNesting; \
extern volatile void * volatile pxCurrentTCB; \
\
__asm{ LDR R1, =pxCurrentTCB };/* Set the LR to the task stack. The location was ... */ \
__asm{ LDR R0, [R1] }; /* ... stored in pxCurrentTCB. */ \
__asm{ LDR LR, [R0] }; \
\
__asm{ LDR R0, =ulCriticalNesting }; /* The critical nesting depth is the first item on ... */ \
__asm{ LDMFD LR!, {R1 } } /* ... the stack. Load it into the ulCriticalNesting var. */ \
__asm{ STR R1, [R0] } \
\
__asm{ LDMFD LR!, {R0} }; /* Get the SPSR from the stack. */ \
__asm{ MSR SPSR_CXSF, R0 }; \
\
__asm{ LDMFD LR, {R0-R14}^ }; /* Restore all system mode registers for the task. */ \
__asm{ NOP }; \
\
__asm{ LDR LR, [LR, #+60] }; /* Restore the return address. */ \
\
/* And return - correcting the offset in the LR to obtain ... */ \
__asm{ SUBS PC, LR, #4 }; /* ... the correct address. */ \
}
Где то здесь все и встает sad.gif
Alex03
Цитата(3.14 @ Jan 29 2007, 14:23) *
Решил подправить пример freertos на lpc2129 под кейл-ом на сабжевый чип.
Втставил в родной startup.s часть касаюшуюся настроек тактирования, успешно пересобрал.
Запускаю дебагер, дебагер впадает в вечный цикл с ошибкой выбора инструкции по адресу 0xC ?!
Причем в оригинале, как полагается, после сброса в PC грузится 0х40.

Так поди ж, в том же дебагере при этом можно поглядеть регистры.
Например r14_abt, и локализовать место.
Можно тут почитать.
3.14
Похоже что то с вычислением адреса возврата в portRESTORE_CONTEXT() макросе, если закоментарить последнюю строчку (__asm{ SUBS PC, LR, #4 }), то он завершается без зависонов.
3.14
Похоже что собака зарылась в настройках контроллера прерываний.
Для начала я во freertos-ном обработчике прерывания вставил дрыгание IO пина, увидеть который так и не смог.
Потом создал свой обработчик таймера, в котором только пин IO дергается, обработчик не выполняется.
Дальше пошли варианты ... екперименты ... безрезультатно, обрабочики прерываний не вызываются (пробовал еще I2C).
Функции инициализации VIC и инсталляции обработчиков перетащил из своих рабочих примеров.
Странно, но в самой rtos я не нашел инициализации VIC.
3.14
Блин, уперся обеими рогами.
Никак немогу заставить работать прерывания.
Все облазил, даже доку прочитал smile.gif, не помогло.
Гляньте плиз на стартап, может что заметите.
В main-е после инициализации железа ставлю вечный цикл.
Код
// *** Startup Code (executed after Reset) ***
// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
        Mode_USR  EQU      0x10
        Mode_FIQ  EQU      0x11
        Mode_IRQ  EQU      0x12
        Mode_SVC  EQU      0x13
        Mode_ABT  EQU      0x17
        Mode_UND  EQU      0x1B
        Mode_SYS  EQU      0x1F
        I_Bit     EQU      0x80    /* when I bit is set, IRQ is disabled */
        F_Bit     EQU      0x40    /* when F bit is set, FIQ is disabled */
/*
// <h> Stack Configuration (Stack Sizes in Bytes)
//   <o0> Undefined Mode      <0x0-0xFFFFFFFF>
//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF>
//   <o2> Abort Mode          <0x0-0xFFFFFFFF>
//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF>
//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF>
//   <o5> User/System Mode    <0x0-0xFFFFFFFF>
// </h>
*/
        UND_Stack_Size  EQU     0x00000008
        SVC_Stack_Size  EQU     0x00000100;
        ABT_Stack_Size  EQU     0x00000008
        FIQ_Stack_Size  EQU     0x00000100
        IRQ_Stack_Size  EQU     0x00000300
        USR_Stack_Size  EQU     0x00000200
AREA   STACK, DATA, READWRITE, ALIGN=2
        DS   (USR_Stack_Size+3)&~3 ; Stack for User/System Mode
        DS   (IRQ_Stack_Size+3)&~3 ; Stack for Interrupt Mode
        DS   (FIQ_Stack_Size+3)&~3 ; Stack for Fast Interrupt Mode
        DS   (ABT_Stack_Size+3)&~3 ; Stack for Abort Mode
        DS   (SVC_Stack_Size+3)&~3 ; Stack for Supervisor Mode
        DS   (UND_Stack_Size+3)&~3 ; Stack for Undefined Mode
Top_Stack:
// Starupt Code must be linked first at Address at which it expects to run.
AREA   STARTUPCODE, CODE, AT CODE_BASE   // READONLY, ALIGN=4
       PUBLIC  __startup
       EXTERN  CODE32 (?C?INIT)
__startup       PROC    CODE32
// Pre-defined interrupt handlers that may be directly
// overwritten by C interrupt functions
EXTERN CODE32 (Undef_Handler?A)
EXTERN CODE32 (vPortYieldProcessor?A)
EXTERN CODE32 (PAbt_Handler?A)
EXTERN CODE32 (DAbt_Handler?A)
EXTERN CODE32 (IRQ_Handler?A)
EXTERN CODE32 (FIQ_Handler?A)
// Exception Vectors
// Mapped to Address 0.
// Absolute addressing mode must be used.
Vectors:        LDR     PC,Reset_Addr        
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
;                NOP                            /* Reserved Vector */
                DD      0xB9205F80
;               LDR     PC,IRQ_Addr
;                LDR     PC,[PC, #-0x0FF0]      /* Vector from VicVectAddr */
                LDR     PC,[PC, #-0x0120]      /* Vector from VicVectAddr */
                LDR     PC,FIQ_Addr
Reset_Addr:     DD      Reset_Handler
Undef_Addr:     DD      Undef_Handler?A
SWI_Addr:       DD      vPortYieldProcessor?A
PAbt_Addr:      DD      PAbt_Handler?A
DAbt_Addr:      DD      DAbt_Handler?A
                DD      0xB9205F80                      /* Reserved Address */
IRQ_Addr:       DD      IRQ_Handler?A
FIQ_Addr:       DD      FIQ_Handler?A

Reset_Handler:  
// Setup Stack for each mode
                LDR     R0, =Top_Stack
// Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size
// Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size
// Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size
// Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size
// Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size
// Enter S Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SYS
                MOV     SP, R0
// Start in supervisor mode
                MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit
// Enter the C code
                LDR     R0,=?C?INIT
                TST     R0,#1      ; Bit-0 set: INIT is Thumb
                LDREQ   LR,=exit?A ; ARM Mode
                LDRNE   LR,=exit?T ; Thumb Mode
                BX      R0
                ENDP
PUBLIC exit?A
exit?A          PROC    CODE32
                B       exit?A
                ENDP
PUBLIC exit?T
exit?T          PROC    CODE16
exit:           B       exit?T
                ENDP
                END


А-а-а вот она зараза-а ...
Пока стартап форматировал обратил внимание на I_Bit, и то что он устанавливается во всех режимах, как думаете насколько корректно убрать его из юзерского режима?
Сергей Борщ
Цитата(3.14 @ Feb 1 2007, 13:20) *
Пока стартап форматировал обратил внимание на I_Bit, и то что он устанавливается во всех режимах, как думаете насколько корректно убрать его из юзерского режима?
Подумайте сами логично - Reset_Handler выполняется при старте процессора. Если вы уберете I_Bit, вы тем самым разрешите прерывания IRQ. То, что разрешение прерываний происходит до настройки VIC может и не приведет ни к чему плохому, но я бы не рискнул. Но кроме этого в обработчиках прерываний могут вызываться сервисы ОС, а в этот момент ОС еще не проинициализирована. Вот тут точно ничего хорошего не получится.
Цитата
если закоментарить последнюю строчку (__asm{ SUBS PC, LR, #4 }), то он завершается без зависонов.
Вообще-то это ARMовский аналог reti. Интересно, если оно не висло, то куда же его уносило?
sergik_vrn
Цитата(Сергей Борщ @ Feb 1 2007, 15:24) *
Цитата(3.14 @ Feb 1 2007, 13:20) *

Пока стартап форматировал обратил внимание на I_Bit, и то что он устанавливается во всех режимах, как думаете насколько корректно убрать его из юзерского режима?
Подумайте сами логично - Reset_Handler выполняется при старте процессора. Если вы уберете I_Bit, вы тем самым разрешите прерывания IRQ. То, что разрешение прерываний происходит до настройки VIC может и не приведет ни к чему плохому, но я бы не рискнул. Но кроме этого в обработчиках прерываний могут вызываться сервисы ОС, а в этот момент ОС еще не проинициализирована. Вот тут точно ничего хорошего не получится.
Цитата
если закоментарить последнюю строчку (__asm{ SUBS PC, LR, #4 }), то он завершается без зависонов.
Вообще-то это ARMовский аналог reti. Интересно, если оно не висло, то куда же его уносило?

позволю себе поделиться опытом, не уверен, правда, что это тот случай, к тому же, по причине не очень хорошего владения армовским ассемблером, в деталях ситуации мне разобраться не удалось. и тем не менее - когда я занимался запуском FreeRTOS на STR710, параллельно начиная изучать АРМы, у меня возникала ситуация, подобная описанной. правда, зависание происходило во время засгрузки стартапа, до входа в main() - во всяком случае, в отладчике я туда не попадал. поскльку я на тот момент вообще никак не разбирался в процессоре, пошел наиболее легким путем, а именно, попытался адаптировать готовый проект (из примеров к FreeRTOS). как выяснилось, если заменить 71x_init.s и 71x_vect.s из комплекта ИАР на cstartup.s79 и vect.s79 из примера, после некоторой адаптации система начинает стартовать нормально. собственно, на тот момент я этим и ограничился. а недавно, когда взялся делать bootload для своего проекта, попутно пришлось более детально разбираться в алгоритме запуска АРМ. в частности, мне пришлось снова вернуться к упомянутым ассемблерным файлам - ибо после пуска процесора бутлоадер работал нормально, но после перехода на точку запуска программы снова возникла упомянутая ситуация. я поступил просто - перекинул в проект бутлоадера проверенные стартап-файлы. и все опять стало нормально. ну естественно, разобрало меня любопытство - и вот что я обнаружил при сравнении кода: в 71x_init.s по окончании инициализации проект переводится в режим пользователя
Код
      MSR     CPSR_c, #Mode_USR ; Change to User mode, Enable IRQ and FIQ
       LDR     SP, =SFE(CSTACK) & 0xFFFFFFF8    ; Initialize USR stack pointer

в то время, как в моем cstartup.s79 - в режим супервизора
Код
      /* We want to start in supervisor mode.  Operation will switch to system
      mode when the first task starts. */
     msr   CPSR_c, #Mode_SVC|I_Bit|F_Bit

кроме того, немного по-разному инициализируются стеки, впрочем, тут моих знаний не хватило. если интересно, могу показать работающий код инициализации
3.14
Вроде сдвинулся с мертвой точки, оказалось все дело в объявлении вектора обработчика прерывания для таймера, сейчас вроде работает.
Все кастрации инициализации VIC я вернул на место, всвязи с чем возникает вопрос, а где тогда правильнее инициализировать железо работающее на прерываниях?
sergik_vrn
Цитата(3.14 @ Feb 1 2007, 16:18) *
Вроде сдвинулся с мертвой точки, оказалось все дело в объявлении вектора обработчика прерывания для таймера, сейчас вроде работает.
Все кастрации инициализации VIC я вернул на место, всвязи с чем возникает вопрос, а где тогда правильнее инициализировать железо работающее на прерываниях?

на мой вкус, по-хорошему, все надо делать после входа в main(). и инициализировать железо, и разрешать прерывания. дело стартапа - инициализация памяти
3.14
а вот у freertos другие вкусы ...
да ладно ... думаю после старта какой-нибудь из задач наверное точно можно VIC-жаждущее железо инить.
sergik_vrn
Цитата(3.14 @ Feb 1 2007, 16:34) *
а вот у freertos другие вкусы ...
да ладно ... думаю после старта какой-нибудь из задач наверное точно можно VIC-жаждущее железо инить.

ну я ваще-то все иничу перед стартом многозадачности, после входа в main(). вроде никаких проблем. так что насчет вкусов FreeRTOS я немного недопонял. а вот зависание, по-моему, происходит из-за разрешения прерывания до инициализации системы - у меня это было так, во всяком случае
3.14
Прерывания разрешаются, насколько я проникся, после инита всей системы. Например, имею I2C LCD, обмен которого осуществляется через прерывания, соответсвенно на ините этого LCD (если его вначале main включать) все и встанет.
sergik_vrn
Цитата(3.14 @ Feb 1 2007, 16:55) *
Прерывания разрешаются, насколько я проникся, после инита всей системы. Например, имею I2C LCD, обмен которого осуществляется через прерывания, соответсвенно на ините этого LCD (если его вначале main включать) все и встанет.

а, ну это разумеется, да. что, кстати, неудобно - приходится инициализацию делать уже в многозадачном режиме, то есть через задницу
zltigo
Цитата(3.14 @ Feb 1 2007, 15:34) *
а вот у freertos другие вкусы ...

Что-то странное глаголите sad.gif
zltigo
Цитата(sergik_vrn @ Feb 1 2007, 15:57) *
Цитата(3.14 @ Feb 1 2007, 16:55) *

Прерывания разрешаются, насколько я проникся, после инита всей системы. Например, имею I2C LCD, обмен которого осуществляется через прерывания, соответсвенно на ините этого LCD (если его вначале main включать) все и встанет.

а, ну это разумеется, да. что, кстати, неудобно - приходится инициализацию делать уже в многозадачном режиме, то есть через задницу


Конец инициализации "всей системы" определяете лично Вы вызовом vTaskStartScheduler( ) причем уж точно в main() и после инициализации всякого своего железа. Медленно инициализирующееся железо
подвешивается вместо IdleTask (в оригинальной реализации Hook предусмотрен) и в конце цепочки Hook снимается. Единствено, что для IdleTask задержку свою писать надо, обо системная естественно не работает.

Может стоит докуменацию на FreeRTOS почитать а?
Сергей Борщ
Цитата(3.14 @ Feb 1 2007, 15:55) *
Прерывания разрешаются, насколько я проникся, после инита всей системы. Например, имею I2C LCD, обмен которого осуществляется через прерывания, соответсвенно на ините этого LCD (если его вначале main включать) все и встанет.
Прерывания не будут вызываться, пока они не разрешены глобально (не сброшен I_Bit в CPSR). Это происходит после старта ОС, в момент восстановления контекста первого процесса. Не пользуюсь я FreeRTOS, но специально для вас слазил в исходники:
Код
    /* The last thing onto the stack is the status register, which is set for
    system mode, with interrupts enabled. */
    *pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR;

    #ifdef KEIL_THUMB_INTERWORK
    {        
        /* We want the task to start in thumb mode. */
        *pxTopOfStack |= portTHUMB_MODE_BIT;
    }
    #endif
Вот тут готовится значение CPSR которое разрешит прерывания при старте задачи. До этого прерывания глобально запрещены, если вы их нигде случайно не разрешили.


Отправил и "въехал" - ну так или делайте инициализацию не прерываниями а поллингом или обкладывайте ваш LCD семафором, который не даст с ним работать пока инициализация не закончилась. А инициализацию в задачу запихайте.
zltigo
Прямо из живого FreeRTOS проекта инициализацию выдрал:
Код
//---------------------------------------------------------------------------
// Starts all the other tasks, then starts the scheduler.
//---------------------------------------------------------------------------
void main( void )
{
    // Setup the processor.
    init_cpu();
    init_delay_timer();    
    // Start Console and Console Task.
    init_console( COM_TEST_BAUD_RATE, CONSOLE_PRIORITY );
    // Hello World :-)
    boutchar( XON );
    hellomessage();
    
    xIdleTaskCreate( 200 );
extern ulong RAMEND;
extern ulong RAMSTART;
#pragma segment="HEAP_RTOS"
    bprintf( "\tRAM use:%u Heap:%8X Size:%i",
                                 (ulong)(__segment_begin( "HEAP_RTOS" ))-(ulong)&RAMSTART,
                                 __segment_begin( "HEAP_RTOS" ),
                                (ulong)&RAMEND - (ulong)(__segment_begin( "HEAP_RTOS" )) + 1 );
    if( copyprotect() )
        status_word |= STW_PROTECT;    
                    
    if( WDMOD_bit.WDTOF )
        printline( "\tWatchdog Reset Granted!");

    init_SLIC_data();
    
    init_AXE();

    vSetIdleHook( init_system );
    
    // Start the scheduler.
    vTaskStartScheduler( 0 );             // 0 - intertal timer 1 - external timer
}


//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
void init_system()
{
    init_delay_timer();
ulong ii;
    bprintf( "\tCheck CPU -LPC%i %s", iap_getid(), (status_word & STW_PROTECT) ? "" : "Evolution" );

    boutchar( XON );
    cf_addhandler( "MAIN", main_cfg );

    bprintf(     "\tInit I2C  -%s", init_i2c() ? "Fail":"Done" );
    // Read 1st - Configuration
    bprintf_str(  "\t  Config  -" );
    ii = cf_parser( FALSE );
    if( ii )
        bprintf( ii == 1 ? "Empty" : "Failed" );
    else
        bprintf(  "Ok" );
    
    if( config_flags & DEVICE_OWIRE )
      {    print_str(  "\tCheck OW  -" );
        init_ow();
    }
    bprintf(     "\tInit SPI0 -%s", init_SPI0() ? "Fail":"Done" );
    bprintf(     "\tInit CPLD -%s", init_cpld()    ? "Fail":"Ok" );
    
    bprintf(     "\tInit SPI1 -%s", init_SPI1() ? "Fail":"Done" );
    
    bprintf_str( "\tLoad FPGA -" ); load_fpga( 0x20000, TRUE );

    bprintf(     "\tInit ACSL -%s", init_armsl() ? "Fail":"Ok" );

    init_dsl_post();

    init_eth_post();

    toggle_red_LED();

    // Check Maintenance Console Request
    for( ii=0; ii< 50; ii++ )
    {   if( IO0PIN_bit.P0_14 == 0 )
        {    status_word |= STW_MAINTENANCE;
            bprintf( "\nMaintenance Console Mode" );
            goto skip_application;
        }
               vDummyDelay_ms( 2 );
    }
    //----- Switch System to external 2ms Ticks -----------------------------
    bprintf_str( "\tExt Sync  -" );
    ENTER_CRITICAL();
    {
    // Set edle-sensetive Mode
    // Bug :-(
    // The steps involved in the configuration of the EXTMODE and/or EXTPOLAR would be as follow:-
    // 1. Write 0x00 to VPBDIV
    // 2. Write the desired value to EXTMODE or EXTPOLAR register
    // 3. Write the same value to VPBDIV
    // 3a. Write 0x00 to VPBDIV (additional step for INT0 )
    // 4. Restore the VPBDIV to the previously saved value or simply write to the register again
    //    with the desired value.
    VPBDIV = 0;                 // 1.
    ii = EXTMODE & ( EXTMODE_EXTMODE0|EXTMODE_EXTMODE1|EXTMODE_EXTMODE2|EXTMODE_EXTMODE3);  // Get Curent Value
    ii |= EXTMODE_EXTMODE1;
    EXTMODE = ii;             // 2.
    VPBDIV  = ii;             // 3.
    VPBDIV  = 0;              // 3a
    VPBDIV  = configBUS_CLK; // 4.

    // Select IRQ Pin 'IRQ_2MS'
    PINSEL0_bit.P_IRQ_2MS = 0x2;            // Pin to EINT1 mode

    // IRQ Handler to Temporary MS2_ISR_handler()
    VICIntSelect &= ~(1 << VIC_EINT1);         // Classifies as IRQ.
      VICVectAddr9 = (ulong)MS2_ISR_handler;     // Connect to Slot9
      VICVectCntl9 = 0x20 | VIC_EINT1;          // Enable vector interrupt for EINT1.
    VICIntEnable =  (1 << VIC_EINT1);       // Enable EINT1 2ms interrupt.

    }

    LEAVE_CRITICAL();

    // Enable 2ms in FPGA
    work_spi_reset_clr( CSPI_WR | CSPI_RES_FPGA );
    ms_check_timer = 0;
    vDummyDelay_ms( (16+1)*2 );
    if( ms_check_timer >= 16 )
    {    // Ok 2ms Present.
        ENTER_CRITICAL();
        {
        // Disable INT Generate timer 0 compare match.
        TxMCR &= (~0x01);
        // Set New Handler
//        VICIntSelect &= ~(1 << VIC_EINT1);         // Classifies as IRQ.
          VICVectAddr0 = (ulong)vPortPreemptiveTickEntry_Ext;;     // Connect to Slot9
          VICVectCntl0 = 0x20 | VIC_EINT1;          // Enable vector interrupt for EINT1.
//        VICIntEnable =  (1 << VIC_EINT1);       // Enable EINT1 2ms interrupt.
        }
        LEAVE_CRITICAL();
        bprintf( "Ok (%i)", ms_check_timer );
        // For future....
//!!        sys_reg |= (SYS_2MS_IRQ | SYS_PKT_ENABLE);
    }
    else
    {    // 2ms Failed
          VICIntEnClear = (1<< VIC_EINT1);          // Disable vector interrupt for EINT1.
        work_spi_reset( CSPI_WR | CSPI_RES_FPGA );
        bprintf( "Failed (%i)", ms_check_timer );
        goto skip_application;
    }


    //-----------------------------------------------------------------------
    
    bprintf(     "\tInit SWH  -%s", init_switch() ? "Fail":"Done" );

    printline( "Ready" );

    sys_pkt( sys_reg );


skip_application:
    xTaskCreate( CheckerProcess, "Checker", configMINIMAL_STACK_SIZE*2, NULL, CHECK_TASK_PRIORITY, NULL );

    vSetIdleHook( idle_system );
    off_red_LED();
}
3.14
Спасибо, хочу теперь прикрутить стек uIP.
Добавил в проект исходники стека (пока кастрировал драйверную часть), откомпилировались нормально, но вот во время линковки получаю:
Цитата
*** ERROR L102: EXTERNAL ATTRIBUTE MISMATCH
SYMBOL: uip_arp_draddr
MODULE: .\obj\uip_arp.obj (uip_arp)
DEFINED: .\obj\uip.obj (uip)
Чего-то я не врубаюсь в смысл ошибки. В uip_arp объявлен массив uip_arp_draddr, а в uip_arp этот массив объявляется внешним, в чем тут криминал?
Сергей Борщ
Цитата(3.14 @ Feb 2 2007, 10:10) *
Чего-то я не врубаюсь в смысл ошибки. В uip_arp объявлен массив uip_arp_draddr, а в uip_arp этот массив объявляется внешним, в чем тут криминал?
Ну так приведите код этих объявлений.
3.14
uip.c (UIP_FIXEDADDR=1):
Код
#if UIP_FIXEDADDR > 0
const u16_t uip_hostaddr[2] =
  {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1),
   HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)};
const u16_t uip_arp_draddr[2] =
  {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1),
   HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)};
const u16_t uip_arp_netmask[2] =
  {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1),
   HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)};
#else
u16_t uip_hostaddr[2];      
u16_t uip_arp_draddr[2], uip_arp_netmask[2];
#endif /* UIP_FIXEDADDR */
uip_arp.h:
Код
...
/**
* \internal Internal variables that are set using the macros
* uip_setdraddr and uip_setnetmask.
*/
extern u16_t uip_arp_draddr[2], uip_arp_netmask[2];
//u16_t uip_arp_draddr[2], uip_arp_netmask[2];
#endif /* __UIP_ARP_H__ */
если в uip_arp просто объявить этот массив (убрал extern), тогда линковщик ругается на дублирование ...
sergik_vrn
Цитата(zltigo @ Feb 1 2007, 19:27) *
Цитата(sergik_vrn @ Feb 1 2007, 15:57) *

Цитата(3.14 @ Feb 1 2007, 16:55) *

Прерывания разрешаются, насколько я проникся, после инита всей системы. Например, имею I2C LCD, обмен которого осуществляется через прерывания, соответсвенно на ините этого LCD (если его вначале main включать) все и встанет.

а, ну это разумеется, да. что, кстати, неудобно - приходится инициализацию делать уже в многозадачном режиме, то есть через задницу


Конец инициализации "всей системы" определяете лично Вы вызовом vTaskStartScheduler( ) причем уж точно в main() и после инициализации всякого своего железа. Медленно инициализирующееся железо
подвешивается вместо IdleTask (в оригинальной реализации Hook предусмотрен) и в конце цепочки Hook снимается. Единствено, что для IdleTask задержку свою писать надо, обо системная естественно не работает.

Может стоит докуменацию на FreeRTOS почитать а?


Вы меня немного не так поняли. я имел в виду ситуацию, когда мне уже надо пользоваться прерываниями, но не запускать многозадачный режим - скажем, инициализировать внешние объекты, используя рабочие библиотеки. режим поллинга тут в принципе подходит, но для этого надо писать отдельный код


Цитата
...А инициализацию в задачу запихайте.

вот это я и имел в виду, когда писал про "задницу". получается не очень красиво. а когда еще желательно это делать не в любой момент, притом стопить другие задачи, притом тоже не как попало...

Цитата(3.14 @ Feb 2 2007, 12:59) *
uip.c (UIP_FIXEDADDR=1):
Код
#if UIP_FIXEDADDR > 0
const u16_t uip_hostaddr[2] =
  {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1),
   HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)};
const u16_t uip_arp_draddr[2] =
  {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1),
   HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)};
const u16_t uip_arp_netmask[2] =
  {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1),
   HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)};
#else
u16_t uip_hostaddr[2];      
u16_t uip_arp_draddr[2], uip_arp_netmask[2];
#endif /* UIP_FIXEDADDR */
uip_arp.h:
Код
...
/**
* \internal Internal variables that are set using the macros
* uip_setdraddr and uip_setnetmask.
*/
extern u16_t uip_arp_draddr[2], uip_arp_netmask[2];
//u16_t uip_arp_draddr[2], uip_arp_netmask[2];
#endif /* __UIP_ARP_H__ */
если в uip_arp просто объявить этот массив (убрал extern), тогда линковщик ругается на дублирование ...


ну так он у Вас описан как const, а объявление не константное. может, в этом дело? на месте линкера я бы обиделся
3.14
хм-м, действительно, теперь собирается.
khach
А это случайно не проблема со сменой контроллера прерываний в 2300 серии? Переносить старые исходники обработчика прерываний непрямую нельзя.
Цитата
Yes, the LPC23xx and LPC24xx use the PL192 VIC while all the older chips use
the PL190 VIC. Go to www.arm.com and search for PL190 and PL192.

Another important difference is the address of the register where you read
the current handler address -- VICAddress instead of VICVectAddr. You now
need a "ldr pc, [pc, #-0x0120]" at address 0x18 instead of a "ldr pc, [pc,
#-0x0FF0]".

Karl Olsen
3.14
Обработчик, в итоге, остался старый, а вто его объявление пришлось заменить. Особой разницы в VIC-ах я не заметил, векторов стало 32 (отсюда и новое смещение) и дефаултовый вектор теперь отсутствует.
zltigo
Цитата(sergik_vrn @ Feb 2 2007, 12:18) *
Вы меня немного не так поняли. я имел в виду ситуацию, когда мне уже надо пользоваться прерываниями, но не запускать многозадачный режим - скажем, инициализировать внешние объекты, используя рабочие библиотеки. режим поллинга тут в принципе подходит, но для этого надо писать отдельный код

Пользуйтесь на здроровье! Система пользуется одним единственным таймерным прерыванием и источник этого прерывания инициализируется при старте шедулера. Глобально прерывания (и естественно конкретные источники) могут быть разрешены и использоваться и до старта шедулера.
Я в приведенном куске так не делаю по одной причине - когда запущена система уже работает консоль и инициализацию наблюдать гороаздо приятнее smile.gif. Только с этой целью висит Hook.
sergik_vrn
Цитата(zltigo @ Feb 2 2007, 14:51) *
Пользуйтесь на здроровье! Система пользуется одним единственным таймерным прерыванием и источник этого прерывания инициализируется при старте шедулера. Глобально прерывания (и естественно конкретные источники) могут быть разрешены и использоваться и до старта шедулера.
Я в приведенном куске так не делаю по одной причине - когда запущена система уже работает консоль и инициализацию наблюдать гороаздо приятнее smile.gif. Только с этой целью висит Hook.

да, действительно. свое замечание снимаю. у меня зато есть другой вопрос smile.gif почему же все-таки при использовании 71x_init.s проект с FreeRTOS у меня виснет? может это быть связано с установкой пользовательского режима, и если да - то как?
Quasar
Пытаюсь завести FreeRTOS на этом же камне и RealView компиллере, почему-то при старте первой же задачи на строчке:

Код
STMDB     R13!,{R4,R14}


Проц вылетает в Undef_Handler 05.gif .

Чего-то даже не пойму, а куда копать? 07.gif

И еще, в последнем realview исчез атрибут __task, не совсем понятно, он теперь просто не нужен или как? smile.gif
Quasar
Всё, вроде теперь со всем разобрался, теперь всё работает как надо smile.gif
nikkov
Цитата(Quasar @ Jul 3 2008, 01:15) *
Всё, вроде теперь со всем разобрался, теперь всё работает как надо smile.gif

Портом не поделишься? rolleyes.gif
Quasar
Цитата(nikkov @ Jul 3 2008, 05:40) *
Портом не поделишься? rolleyes.gif


Вот содержимое папки portable. Там ассемблерные вставки portmacro.h и port.c... Соответственно вот такую ссылку:

Код
#ifdef REALVIEW_ARM7
    #include "../../Source/portable/RealView/ARM7/portmacro.h"
#endif


добавляем в portable.h.
nikkov
Цитата(Quasar @ Jul 4 2008, 00:29) *
Вот содержимое папки portable. Там ассемблерные вставки portmacro.h и port.c... Соответственно вот такую ссылку:

Код
#ifdef REALVIEW_ARM7
    #include "../../Source/portable/RealView/ARM7/portmacro.h"
#endif


добавляем в portable.h.

Спасибо!
Quasar
Прицепил к этому всему делу еще lwIP взятый с этого CVS - cvs.sv.gnu.org, вроде всё пашет, проект для Keil'a во вложении.
(Вложенный фаил запакован 7z)
std-logic
Мож кому пригодится (как отправная точка): FreeRTOS 5.1.1, добавлен чип LPC2468 (пригодно для любого LPC23xx/24xx) под Keil RVDS. Отличия от оригинала - изменен COM-порт на com0 (в оригинале сом1)

http://nukeuploads.com/download/1231463992...x_RVDS.zip.html
Strange_Bear
спасиб большое с первого раза заработало всё. smile.gif

поставил #define LWIP_SNMP 1
добавил все сишные файлы из папки snmp в проект

и он, Keil, выдает следующее:

linking...
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(mib_structs.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(tasks.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(etharp.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(tasks.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(sys_arch.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(tcp.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(tcp_in.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(tcp_in.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(heap_2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(emac.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mem.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(inet.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(tcpip.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(ethernetif.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(netif.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(emac_isr.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(ip_frag.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(raw.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(udp.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib2.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(flash.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(sys_arch.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(ip.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(etharp.o).
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .data(mib_structs.o).
FreeRTOS.axf: Error: L6407W: Sections of aggregate size 0x4c8 bytes could not fit into .ANY selector(s).
Target not created

В чем может быть проблема? (я тут пока еще много не понимаю...)
zuy
Цитата(Strange_Bear @ Sep 14 2009, 20:23) *
спасиб большое с первого раза заработало всё. smile.gif

поставил #define LWIP_SNMP 1
добавил все сишные файлы из папки snmp в проект

и он, Keil, выдает следующее:

linking...
FreeRTOS.axf: Error: L6406W: No space in execution regions with .ANY selector matching Section .bss(mib_structs.o).
.
.
.
.
.

Target not created

В чем может быть проблема? (я тут пока еще много не понимаю...)


Ругается линкер на отсутствие места в памяти. Т.е. то количество памяти которое указанно в настройках не достаточно чтобы туда слинковать весь скомпилированный код.
Hadzu
Цитата(std-logic @ Jan 9 2009, 05:22) *
Мож кому пригодится (как отправная точка): FreeRTOS 5.1.1, добавлен чип LPC2468 (пригодно для любого LPC23xx/24xx) под Keil RVDS. Отличия от оригинала - изменен COM-порт на com0 (в оригинале сом1)

http://nukeuploads.com/download/1231463992...x_RVDS.zip.html

Не могли бы Вы, пожалуйста, выложить этот архив еще раз, или послать по почте (otanikotani@gmail.com)? Ссылка не работает.
zksystem
Цитата(std-logic @ Jan 9 2009, 05:22) *
Мож кому пригодится (как отправная точка): FreeRTOS 5.1.1, добавлен чип LPC2468 (пригодно для любого LPC23xx/24xx) под Keil RVDS. Отличия от оригинала - изменен COM-порт на com0 (в оригинале сом1)

http://nukeuploads.com/download/1231463992...x_RVDS.zip.html


Положите пожалуйста на FTP, ссылка не работает.
Аматер
И мне хотелось бы посмотреть FreeRTOS под Keil. Если не трудно пришлите на pc-robot@mail.ru
murug
Не могу понять, как должен работать portRESTORE_CONTEXT, а конкретно его последняя команда
Код
SUBS    PC, LR, #4

в случае, если код задачи скомпилирован в THUMB mode. Ведь тогда в PC помещается нечетное значение, а делать это, согласно ARM-ARM (A2.8.1), разрешено только специальным командам, например BX и POP:
Цитата
Writing an unaligned address to R15 is UNPREDICTABLE, except in the specific cases where the instructions are associated with a Thumb to ARM state transition

О том, что SUB относится к таким командам, мне не удалось найти упоминания.
Собственно поводом обратить на это внимание стала ругань симулятора IAR EW:
Цитата
Mon Apr 18 14:47:31 2011: Warning: UNPREDICTABLE behaviour (PC=0x00001F40): Branch to unaligned ARM address 0x00001529.


stepper88
Может кто-нибудь перезалить на файлообменник указанный выше порт FreeRTOS на LPC23xx?
zltigo
QUOTE (stepper88 @ Jun 11 2011, 09:55) *
Может кто-нибудь перезалить на файлообменник указанный выше порт FreeRTOS на LPC23xx?

Не нужен он Вам - копия старой демки из комплекта поставки. Время не стоит на месте.

stepper88
Просто вытянул сегодня архив FreeRTOS 6.10 - его описывали в приведенных выше статьях, глянул - для Keil есть порт для Cortex M3 - это он? Просто для LPC23xx - только под CrossWorks..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.