zltigo 2 28 августа, 2007 Опубликовано 28 августа, 2007 · Жалоба Там ведь 2 .exe файла? Я понятия не имею о чем Вы говорите, сходите, на FTP, может и возьмите один файл и исправте. Ну поиском попользуйтесь, ну нельзя-же, право каждый раз по появлении очередногоо релиза из пустого в порожнее переливать.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
set bit 0 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба Берете программу, WinHex (редактор) в нем открываете Генератор.exe, поиском ищите строчку EWARM, там смотрим рядом 06_WIN, правим на 12_WIN, сохраняем изменения и все запускаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба 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 просто увеличивается, как ему и положено. Вот такие чудеса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexander55 0 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба zltigo Вроде вчера удалось скомпилировать и запустить, но при запуске шедулера сразу возникает DataAbort, причем он меня просто вводит в ступор. Не знаю, о чем речь (подозреваю о прикручивании каких-то колес), но судя тексту у Вас pxCurrentTCB не правильно инициализируется где-то выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба Не знаю, о чем речь (подозреваю о прикручивании каких-то колес), но судя тексту у Вас pxCurrentTCB не правильно инициализируется где-то выше. Речь о прикручивании FreeRTOS к новой версии ;) Очень верное замечание! Раньше стек выравнивался к 4 байтам, а теперь - к 8. Буду копать, спасибо за наводку! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба Буду копать, спасибо за наводку! Я не знаю, куда Вы там 'закопались', но с портированием ядра FreeRTOS проблем нет. Совсем нет. Тупо за полчаса поверхностного изучения линкера и ассемблера портируется. Поблемы вылезают, но не на банальной демке ядра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба Я не знаю, куда Вы там 'закопались', но с портированием ядра 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 Я не понимаю, почему так, буду разбираться с режимом процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 29 августа, 2007 Опубликовано 29 августа, 2007 · Жалоба Я тоже так подумал, поменял во всех ассемблерных исходниках имена сегментов Совсем не обязательно - пусть будут самостоятельным сегментом, никаких проблем. Я вообще ничего не менял во FreeRTOS асмовских исходниках при переходе под 5.10 подставил стартап-файлы из поставки 5.10 Без понятия, что там 'в поставке' - подправил свой. И линковый скрипт с чистого листа. Я не понимаю, почему так, буду разбираться с режимом процессора. Я в ARM моде гоняю. Пересобрал в Thumb (при этом ядро стало больше похоже на родное, поскольку пришлось вернутся к штатным CRITICAL_SECTION, ибо мои исключительно под ARM Mode заточены) - естественно, неизменно превосходный результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 30 августа, 2007 Опубликовано 30 августа, 2007 · Жалоба Я в ARM моде гоняю. Пересобрал в Thumb (при этом ядро стало больше похоже на родное, поскольку пришлось вернутся к штатным CRITICAL_SECTION, ибо мои исключительно под ARM Mode заточены) - естественно, неизменно превосходный результат. Я про другие режимы ;) Собственно, проблема обнаружилась в том, что при подходе к main() старые стартапы переводили процессор в supervisor mode, а новые в другой режим. Так что, придется разбираться в стартапах, хоть и не хотелось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 30 августа, 2007 Опубликовано 30 августа, 2007 · Жалоба Так что, придется разбираться в стартапах, хоть и не хотелось. Огорчили :(, попытками что-то писать хоть слегка не разбираясь в стартапах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 30 августа, 2007 Опубликовано 30 августа, 2007 · Жалоба Огорчили :(, попытками что-то писать хоть слегка не разбираясь в стартапах. :) Ну теперь слегка разбираюсь, так что не огорчайтесь ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 31 августа, 2007 Опубликовано 31 августа, 2007 · Жалоба В общем, после адаптации старых стартапов к новому компилеру вроде завелось, но как-то странно. Во-первых, пришлось в лоб в startup.s задавать начало памяти, бо раньше (поправьте если не так) можно было пользоваться именами из .xcl, а в новом - фиг, по крайней мере, у меня не получилось. Во-вторых, не знаю почему, но в случае если таблица векторов объявляется не как b <туда-то>, а как ldr pc,[pc,#+24], и в соответствующих местах размещать b или прямо код (в случае с FIQ), то при первом-же прерывании возникает undefined instruction. Подозреваю, что что-то не так с thumb/arm, но разобраться не получилось. В общем, поскольку этот переход затянулся, я откатился на 4.х. На всякий случай, вот полу-рабочие стартапы и конфиг. comments are welcome :) new.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 31 августа, 2007 Опубликовано 31 августа, 2007 · Жалоба Во-первых... Во-первых я свои startup и скрипрт выкладывал, причем было-стало и рабочие. а в новом - фиг, по крайней мере, у меня не получилось. Нет, конечно. случае если таблица векторов объявляется не как b <туда-то>, а как.. Нет, конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 31 августа, 2007 Опубликовано 31 августа, 2007 · Жалоба Нашел 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 адреса то все нормально, стоит переход на мой стартап, при загрузке проца все нормально работает, а в симуляторе код игнорируется после чего отладчик начинает ругаться что стек начинается с нулевого адреса и т.д. то есть симулятор не выполнил мой сартап код. Вот такая фишка, а может где я чего не понял ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 31 августа, 2007 Опубликовано 31 августа, 2007 · Жалоба Глюк заключается в метке __iar_program_start Это типа не баг,это фича :( у них такая появилась - имя, блин, зарезервировали... Тоже наступил, потом уже документ прочитал. правда откуда он берется загадка... Линкуется 'готовый'. По поводу первого бага - не скажу, визардами никогда не пользуюсь - своих ошибок, если надо, сделаю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться