|
FreeRTOS + LPC2378 |
|
|
|
 |
Ответов
|
Feb 1 2007, 14:20
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Блин, уперся обеими рогами. Никак немогу заставить работать прерывания. Все облазил, даже доку прочитал  , не помогло. Гляньте плиз на стартап, может что заметите. В 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, и то что он устанавливается во всех режимах, как думаете насколько корректно убрать его из юзерского режима?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
Feb 1 2007, 15:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(3.14 @ Feb 1 2007, 13:20)  Пока стартап форматировал обратил внимание на I_Bit, и то что он устанавливается во всех режимах, как думаете насколько корректно убрать его из юзерского режима? Подумайте сами логично - Reset_Handler выполняется при старте процессора. Если вы уберете I_Bit, вы тем самым разрешите прерывания IRQ. То, что разрешение прерываний происходит до настройки VIC может и не приведет ни к чему плохому, но я бы не рискнул. Но кроме этого в обработчиках прерываний могут вызываться сервисы ОС, а в этот момент ОС еще не проинициализирована. Вот тут точно ничего хорошего не получится. Цитата если закоментарить последнюю строчку (__asm{ SUBS PC, LR, #4 }), то он завершается без зависонов. Вообще-то это ARMовский аналог reti. Интересно, если оно не висло, то куда же его уносило?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 1 2007, 15:59
|

Частый гость
 
Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491

|
Цитата(Сергей Борщ @ 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 FreeRTOS + LPC2378 Jan 29 2007, 12:23 3.14 Вобщем, не понял почему в данном случае у симулято... Jan 29 2007, 13:51 Alex03 Цитата(3.14 @ Jan 29 2007, 14:23) Решил п... Jan 29 2007, 13:51 3.14 Похоже что то с вычислением адреса возврата в port... Jan 29 2007, 14:43 3.14 Похоже что собака зарылась в настройках контроллер... Jan 30 2007, 13:36 3.14 Вроде сдвинулся с мертвой точки, оказалось все дел... Feb 1 2007, 16:18 sergik_vrn Цитата(3.14 @ Feb 1 2007, 16:18) Вроде сд... Feb 1 2007, 16:25 3.14 а вот у freertos другие вкусы ...
да ладно ... дум... Feb 1 2007, 16:34 sergik_vrn Цитата(3.14 @ Feb 1 2007, 16:34) а вот у ... Feb 1 2007, 16:44 zltigo Цитата(3.14 @ Feb 1 2007, 15:34) а вот у ... Feb 1 2007, 19:11 3.14 Прерывания разрешаются, насколько я проникся, посл... Feb 1 2007, 16:55 sergik_vrn Цитата(3.14 @ Feb 1 2007, 16:55) Прерыван... Feb 1 2007, 16:57  zltigo Цитата(sergik_vrn @ Feb 1 2007, 15:57) Ци... Feb 1 2007, 19:27   sergik_vrn Цитата(zltigo @ Feb 1 2007, 19:27) Цитата... Feb 2 2007, 13:18    zltigo Цитата(sergik_vrn @ Feb 2 2007, 12:18) Вы... Feb 2 2007, 14:51     sergik_vrn Цитата(zltigo @ Feb 2 2007, 14:51) Пользу... Feb 2 2007, 15:07 Сергей Борщ Цитата(3.14 @ Feb 1 2007, 15:55) Прерыван... Feb 1 2007, 19:39 zltigo Прямо из живого FreeRTOS проекта инициализацию выд... Feb 1 2007, 20:15 3.14 Спасибо, хочу теперь прикрутить стек uIP.
Добавил ... Feb 2 2007, 11:10 Сергей Борщ Цитата(3.14 @ Feb 2 2007, 10:10) Чего-то ... Feb 2 2007, 12:48 3.14 uip.c (UIP_FIXEDADDR=1):Код#if UIP_FIXEDADDR ... Feb 2 2007, 12:59 3.14 хм-м, действительно, теперь собирается. Feb 2 2007, 13:29 khach А это случайно не проблема со сменой контроллера п... Feb 2 2007, 13:55 3.14 Обработчик, в итоге, остался старый, а вто его объ... Feb 2 2007, 14:04 Quasar Пытаюсь завести FreeRTOS на этом же камне и RealVi... Jun 29 2008, 11:22 Quasar Всё, вроде теперь со всем разобрался, теперь всё р... Jul 2 2008, 18:15  nikkov Цитата(Quasar @ Jul 3 2008, 01:15) Всё, в... Jul 3 2008, 01:40   Quasar Цитата(nikkov @ Jul 3 2008, 05:40) Портом... Jul 3 2008, 17:29    nikkov Цитата(Quasar @ Jul 4 2008, 00:29) Вот со... Jul 4 2008, 01:44 Quasar Прицепил к этому всему делу еще lwIP взятый с этог... Jul 6 2008, 10:30 std-logic Мож кому пригодится (как отправная точка): FreeRTO... Jan 9 2009, 01:22 Hadzu Цитата(std-logic @ Jan 9 2009, 05:22... May 11 2010, 12:19 zksystem Цитата(std-logic @ Jan 9 2009, 05:22... Jul 9 2010, 12:20 Strange_Bear спасиб большое с первого раза заработало всё.
по... Sep 14 2009, 17:23 zuy Цитата(Strange_Bear @ Sep 14 2009, 20:23)... Oct 15 2009, 08:59 Аматер И мне хотелось бы посмотреть FreeRTOS под Keil. Ес... Jul 19 2010, 08:20 murug Не могу понять, как должен работать portRESTORE_CO... Apr 18 2011, 11:28 stepper88 Может кто-нибудь перезалить на файлообменник указа... Jun 11 2011, 06:55  zltigo QUOTE (stepper88 @ Jun 11 2011, 09:55) Мо... Jun 11 2011, 08:19   stepper88 Просто вытянул сегодня архив FreeRTOS 6.10 - его о... Jun 11 2011, 13:58
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|