Перейти к содержанию
    

Там ведь 2 .exe файла?

Я понятия не имею о чем Вы говорите, сходите, на FTP, может и возьмите один файл и исправте. Ну поиском попользуйтесь, ну нельзя-же, право каждый раз по появлении очередногоо релиза из пустого в порожнее переливать....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Берете программу, WinHex (редактор) в нем открываете Генератор.exe, поиском ищите строчку EWARM, там смотрим рядом 06_WIN, правим на 12_WIN, сохраняем изменения и все запускаем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zltigo

 

Вроде вчера удалось скомпилировать и запустить, но при запуске шедулера сразу возникает DataAbort, причем он меня просто вводит в ступор.

 

При создании задач формируются стеки этих задач, соответственно, туда кладется содержимое регистров задачи, это понятно. Первым в стек суется адрес возврата, вторым - содержимое R14 (LR), равное 0xaaaaaaaa. Остальные регистры забиваются тоже чепухой. Понятное дело, после переключения туда (в стек задачи) будут записаны реальные значения.

 

Потом при старте шедулера, выполняется vPortStartFirstTask, который на самом деле запрещает прерывания и вызывает portRESTORE_CONTEXT, коий я приведу тут целиком:

portRESTORE_CONTEXT MACRO

; Set the LR to the task stack.                                     
    LDR        R1, =pxCurrentTCB
    LDR        R0, [R1]
    LDR        LR, [R0]

; The critical nesting depth is the first item on the stack.     
; Load it into the ulCriticalNesting variable.                     
    LDR        R0, =ulCriticalNesting
    LDMFD    LR!, {R1}
    STR        R1, [R0]

; Get the SPSR from the stack.                                     
    LDMFD    LR!, {R0}
    MSR        SPSR_cxsf, R0

; 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 записывается вот то самое 0xaaaaaaaa, которое было записано в стек, а не адрес возврата. Понятно, на LDR LR,[LR, #+60] мы имеем DAbort.

При этом в случае с 4.х после выполнения этой инструкции LR просто увеличивается, как ему и положено.

 

Вот такие чудеса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zltigo

 

Вроде вчера удалось скомпилировать и запустить, но при запуске шедулера сразу возникает DataAbort, причем он меня просто вводит в ступор.

Не знаю, о чем речь (подозреваю о прикручивании каких-то колес), но судя тексту у Вас pxCurrentTCB не правильно инициализируется где-то выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, о чем речь (подозреваю о прикручивании каких-то колес), но судя тексту у Вас pxCurrentTCB не правильно инициализируется где-то выше.

 

Речь о прикручивании FreeRTOS к новой версии ;)

Очень верное замечание! Раньше стек выравнивался к 4 байтам, а теперь - к 8. Буду копать, спасибо за наводку!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буду копать, спасибо за наводку!

Я не знаю, куда Вы там 'закопались', но с портированием ядра FreeRTOS проблем нет. Совсем нет. Тупо за полчаса поверхностного изучения линкера и ассемблера портируется.

Поблемы вылезают, но не на банальной демке ядра.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю, куда Вы там 'закопались', но с портированием ядра FreeRTOS проблем нет. Совсем нет. Тупо за полчаса поверхностного изучения линкера и ассемблера портируется.

Поблемы вылезают, но не на банальной демке ядра.

 

Я тоже так подумал, поменял во всех ассемблерных исходниках имена сегментов, подставил стартап-файлы из поставки 5.10 и теперь имею реальный полтергейст с инструкцией LDMIA.

 

Там, где работает:

ДО
SP=0xFEA4
LR=0x34EC
0x34EC-0x3527:
00 00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 04 04 04 04 05 05 05 05 06 06 06 06 07 07 07 07 08 08 08 08 09 09 09 09 10 10 10 10 11 11 11 11 12 12 12 12 28 35 00 00 aa aa aa aa

portRESTORE_CONTEXT
  000001F4  E8DE7FFF  LDMIA        LR, {R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,SP,LR}^

ПОСЛЕ
SP=0xFEA4
LR=0x34EC

 

В новом компиляторе:

ДО
SP=0x3290
LR=0x40CC
0x40CC-0x412C:
00 00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 04 04 04 04 05 05 05 05 06 06 06 06 07 07 07 07 08 08 08 08 09 09 09 09 10 10 10 10 11 11 11 11 12 12 12 12 08 41 00 00 aa aa aa aa

portRESTORE_CONTEXT
  0000232C  E8DE7FFF  LDMIA        LR, {R0,R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,SP,LR}^

ПОСЛЕ
SP=0x4108
LR=0xAAAAAAAA

 

Я не понимаю, почему так, буду разбираться с режимом процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже так подумал, поменял во всех ассемблерных исходниках имена сегментов

Совсем не обязательно - пусть будут самостоятельным сегментом, никаких проблем. Я вообще ничего не менял во FreeRTOS асмовских исходниках при переходе под 5.10

подставил стартап-файлы из поставки 5.10

Без понятия, что там 'в поставке' - подправил свой. И линковый скрипт с чистого листа.

Я не понимаю, почему так, буду разбираться с режимом процессора.

Я в ARM моде гоняю. Пересобрал в Thumb (при этом ядро стало больше похоже на родное, поскольку

пришлось вернутся к штатным CRITICAL_SECTION, ибо мои исключительно под ARM Mode заточены) - естественно, неизменно превосходный результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в ARM моде гоняю. Пересобрал в Thumb (при этом ядро стало больше похоже на родное, поскольку

пришлось вернутся к штатным CRITICAL_SECTION, ибо мои исключительно под ARM Mode заточены) - естественно, неизменно превосходный результат.

 

Я про другие режимы ;)

Собственно, проблема обнаружилась в том, что при подходе к main() старые стартапы переводили процессор в supervisor mode, а новые в другой режим. Так что, придется разбираться в стартапах, хоть и не хотелось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что, придется разбираться в стартапах, хоть и не хотелось.

Огорчили :(, попытками что-то писать хоть слегка не разбираясь в стартапах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огорчили :(, попытками что-то писать хоть слегка не разбираясь в стартапах.

:) Ну теперь слегка разбираюсь, так что не огорчайтесь ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, после адаптации старых стартапов к новому компилеру вроде завелось, но как-то странно.

 

Во-первых, пришлось в лоб в startup.s задавать начало памяти, бо раньше (поправьте если не так) можно было пользоваться именами из .xcl, а в новом - фиг, по крайней мере, у меня не получилось.

 

Во-вторых, не знаю почему, но в случае если таблица векторов объявляется не как b <туда-то>, а как ldr pc,[pc,#+24], и в соответствующих местах размещать b или прямо код (в случае с FIQ), то при первом-же прерывании возникает undefined instruction. Подозреваю, что что-то не так с thumb/arm, но разобраться не получилось.

 

В общем, поскольку этот переход затянулся, я откатился на 4.х.

 

На всякий случай, вот полу-рабочие стартапы и конфиг.

 

comments are welcome :)

new.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых...

Во-первых я свои startup и скрипрт выкладывал, причем было-стало и рабочие.

а в новом - фиг, по крайней мере, у меня не получилось.

Нет, конечно.

случае если таблица векторов объявляется не как b <туда-то>, а как..

Нет, конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2

Нашел 2 голюка, прошу проверить :), глюки не критичны.

 

1) у меня свой в проекте файл х.icf, если этот файл править из визарда в среде (я првил START ROM)и нажать save, то исчезает точка с запятой в конце файла что приводит к ошибке :), потом ручками ставить надо :)

 

 

2) второй глюк связан с симулятором. У меня стратап состоит из 2 файлов, в первом инициализация стеков, памяти и переход на майн, во втором вектора прерываний и обработчики прерываний. Привожу немного кода первого файла. Всякие дефайны выкинул для экономии места.

       MODULE       ?program_start
    SECTION       IRQ_STACK:DATA:NOROOT(3)
                SECTION       FIQ_STACK:DATA:NOROOT(3)
                SECTION       UND_STACK:DATA:NOROOT(3)
                SECTION       ABT_STACK:DATA:NOROOT(3)        
                SECTION       SVC_STACK:DATA:NOROOT(3)
                SECTION       CSTACK:DATA:NOROOT(3)
                SECTION    .text:CODE:NOROOT(2)
                PUBLIC     __iar_program_start
                EXTERN  ?main
                CODE32 
                

__iar_program_start: 
        NOP  ; execute some instructions to access CPU registers after wake
        NOP  ; up from Reset, while waiting for OSC stabilization
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
; --- Initialize Stack pointer registers
      ; Enter each mode in turn and set up the stack pointer
           MSR     CPSR_c, #Mode_FIQ|I_Bit|F_Bit   ; No interrupts
           LDR     SP, =SFE(FIQ_STACK) 

           MSR     CPSR_c, #Mode_IRQ|I_Bit|F_Bit   ; No interrupts
           LDR     SP, = SFE(IRQ_STACK)

           MSR     CPSR_c, #Mode_ABT|I_Bit|F_Bit   ; No interrupts
           LDR     SP, = SFE(ABT_STACK) 
    
           MSR     CPSR_c, #Mode_UND|I_Bit|F_Bit   ; No interrupts
        LDR     SP, = SFE(UND_STACK)

           MSR     CPSR_c, #Mode_SVC|I_Bit|F_Bit   ; No interrupts
           LDR     SP, = SFE(SVC_STACK) 
; --- Set bits 17-18 (DTCM/ITCM order bits) of the Core Configuration Control Register
        MOV     r0, #0x60000             
        MCR     p15,0x1,r0,c15,c1,0
; --- Now change to USR/SYS mode and set up User mode stack,
        MSR     CPSR_c, #Mode_SYS              ; IRQs & FIQs are now enabled
        LDR     SP, = SFE(CSTACK)
; --- Now enter the C code
        B       ?main   ; Note : use B not BL, because an application will
                        ; never return this way
        LTORG
        END

 

2 файл с векторами

IMPORT  __iar_program_start
        SECTION    .intvec:CODE(2)    ;<- эта секция расположена с 0 адреса          
        CODE32
;*******************************************************************************
;                      Import exception handlers
;*******************************************************************************
        IMPORT  Undefined_Handler
        IMPORT  SWI_Handler
        IMPORT  Prefetch_Handler
        IMPORT  Abort_Handler
        IMPORT  FIQ_Handler
;*******************************************************************************
;            Export Peripherals IRQ handlers table address
;*******************************************************************************

;*******************************************************************************
;                        Exception vectors
;*******************************************************************************

        LDR     PC, Reset_Addr
        LDR     PC, Undefined_Addr
        LDR     PC, SWI_Addr
        LDR     PC, Prefetch_Addr
        LDR     PC, Abort_Addr
        NOP                            ; Reserved vector
        LDR     PC, IRQ_Addr
    LDR    PC, FIQ_Addr
;*******************************************************************************
;               Exception handlers address table
;*******************************************************************************
Reset_Addr      DCD     __iar_program_start
Undefined_Addr  DCD     UndefinedHandler
SWI_Addr        DCD     SWIHandler
Prefetch_Addr   DCD     PrefetchAbortHandler
Abort_Addr      DCD     DataAbortHandler
                DCD     0               ; Reserved vector
IRQ_Addr        DCD     IRQHandler
FIQ_Addr    DCD     FIQ_Handler       ; Branch to fiq_handler

       LTORG

       END

 

Глюк заключается в метке __iar_program_start, если ее переименовать на __my_start (в обеих файлах естественно :) ), то в симуляторе всь код игнорируется и переход делается на __iar_program_start, правда откуда он берется загадка, но если посмотрить листинг с 0 адреса то все нормально, стоит переход на мой стартап, при загрузке проца все нормально работает, а в симуляторе код игнорируется после чего отладчик начинает ругаться что стек начинается с нулевого адреса и т.д. то есть симулятор не выполнил мой сартап код. Вот такая фишка, а может где я чего не понял ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глюк заключается в метке __iar_program_start

Это типа не баг,это фича :( у них такая появилась - имя, блин, зарезервировали...

Тоже наступил, потом уже документ прочитал.

правда откуда он берется загадка...

Линкуется 'готовый'.

 

По поводу первого бага - не скажу, визардами никогда не пользуюсь - своих ошибок, если надо, сделаю :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...