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

 
 
> FreeRTOS + LPC2378
3.14
сообщение Jan 29 2007, 12:23
Сообщение #1


Их либе дих ...
******

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



Решил подправить пример freertos на lpc2129 под кейл-ом на сабжевый чип.
Втставил в родной startup.s часть касаюшуюся настроек тактирования, успешно пересобрал.
Запускаю дебагер, дебагер впадает в вечный цикл с ошибкой выбора инструкции по адресу 0xC ?!
Причем в оригинале, как полагается, после сброса в PC грузится 0х40.


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
3.14
сообщение Feb 1 2007, 14:20
Сообщение #2


Их либе дих ...
******

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



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


--------------------
Усы, борода и кеды - вот мои документы :)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 1 2007, 15:24
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Feb 1 2007, 15:59
Сообщение #4


Частый гость
**

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

кроме того, немного по-разному инициализируются стеки, впрочем, тут моих знаний не хватило. если интересно, могу показать работающий код инициализации
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 08:07
Рейтинг@Mail.ru


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