Liseev 0 18 декабря, 2012 Опубликовано 18 декабря, 2012 · Жалоба Нужно отлавливать прерывания по UART RX Контроллер UART сконфигурировал Контроллер NVIC сконфигурировал Осталось прописать адрес обработчика в таблицу векторов. Чойто не пойму как это сделать? Компилятор IAR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 18 декабря, 2012 Опубликовано 18 декабря, 2012 · Жалоба Посмотрите в стартап файле имена обработчиков прерываний и просто создайте функцию с таким именем. В keil так дело обстоит. Думаю что и в яре тоже как-то так. Writing An Interrupt Handler For Cortex-M3 On Cortex-M3, an interrupt service routine enters and returns in the same way as a normal function, which means no special keywords are required. In the Interrupt.c file in the Project4CM3 project, the interrupt function UART_Handler is provided. Note that when you add an interrupt function for Cortex-M devices, you must also add the name of that function in the interrupt vector table. You do this in the system startup code cstartup.s. For this tutorial, a reference to the UART_Handler function is already provided in __vector_table, which you can find in the file CstartupCM3.s. For more information about how to write device-specific interrupt functions for Cortex-M, see the IAR C/C++ Development Guide for ARM®. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Liseev 0 27 декабря, 2012 Опубликовано 27 декабря, 2012 · Жалоба Все заработало, спасибо. Если кому интересно: Изначально в проекте стартапа в явном виде не было, линковщик вытаскивал его из библиотеки уже в откомпилированном виде. Таблица содержала вектора только для системных прерываний. startup.c взятый из примеров IAR для SAM3 компилировался с ошибками, startup.s вообще был пустой. Взял startup.s от одного из NXP, немного поправил, заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Здравствуйте, уважаемые участники форума. Имеется задача создания таблицы векторов прерываний (и ISR к ним) для процессора TI DM368. Пишу на CCS5. Насколько я понял, стартапный код пишется на ассемблере. Но он почему-то не хочет линковаться вместе с сишными файлами. Слышал, что надо его как-то объявить в мэйнике, либо настройках проекта, но как не знаю. Подскажите, если можно. И ещё вопрос. Скажите, если мы находимся в режиме user и у нас нет прерываний, то мы совсем не можем перейти в режим супервизора? Вручную меняю содержимое регистра CPSR с режима user на супервизора, он не принимает изменений. Что можно сделать? Если можно, подскажите хотя бы общую методологию, за конкретные ответы и примеры отдельный респект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Что значит не хочет линковаться? Покажите вывод компилятора и линкера. ПС: Вам стоило создать свою тему с таким вопросом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Вот стартап ; startup.s .ref start .ref undef .ref swi .ref pabt .ref dabt .ref irq .ref fiq .sect ".ivt" reset: b start undef: b undef swi: b swi pabt: b pabt dabt: b dabt nop irq: b irq fiq: b fiq .text Вот вывод: **** Build of configuration Debug for project asm2 **** C:\ti\ccsv5\utils\bin\gmake -k all 'Building file: ../main.c' 'Invoking: ARM Compiler' "C:/ti/ccsv5/tools/compiler/tms470_4.9.5/bin/cl470" -mv5e --code_state=32 --abi=eabi -me -g --include_path="C:/ti/ccsv5/tools/compiler/tms470_4.9.5/include" --define=dm368 --diag_warning=225 --display_error_number -k --asm_listing --preproc_with_compile --preproc_dependency="main.pp" "../main.c" "../main.c", line 12: warning #262-D: explicit type is missing ("int" assumed) "../main.c", line 38: warning #225-D: function declared implicitly "../main.c", line 78: warning #112-D: statement is unreachable "../main.c", line 111: warning #112-D: statement is unreachable "../main.c", line 81: warning #179-D: label "loop" was declared but never referenced 'Finished building: ../main.c' ' ' 'Building file: ../startup.s' 'Invoking: ARM Compiler' "C:/ti/ccsv5/tools/compiler/tms470_4.9.5/bin/cl470" -mv5e --code_state=32 --abi=eabi -me -g --include_path="C:/ti/ccsv5/tools/compiler/tms470_4.9.5/include" --define=dm368 --diag_warning=225 --display_error_number -k --asm_listing --preproc_with_compile --preproc_dependency="startup.pp" "../startup.s" 'Finished building: ../startup.s' ' ' 'Building target: asm2.out' 'Invoking: ARM Linker' "C:/ti/ccsv5/tools/compiler/tms470_4.9.5/bin/cl470" -mv5e --code_state=32 --abi=eabi -me -g --define=dm368 --diag_warning=225 --display_error_number -k --asm_listing -z --stack_size=0x800 -m"asm2.map" --heap_size=0x800 -i"C:/ti/ccsv5/tools/compiler/tms470_4.9.5/lib" -i"C:/ti/ccsv5/tools/compiler/tms470_4.9.5/include" --reread_libs --warn_sections --display_error_number --rom_model -o "asm2.out" "./startup.obj" "./main.obj" "./evmdm368_i2c.obj" "./evmdm368_gpio.obj" "./evmdm368_eeprom.obj" "./evmdm368.obj" -l"libc.a" "../DM368.cmd" <Linking> 'Finished building target: asm2.out' ' ' **** Build Finished **** Насколько я понял, линковщик просто не видит асм файл, хотя он добавлен в проект. То есть там ни в карте памяти ни в бинарнике этих джампов нет. Но собирает без ошибок, просто не добавляет эту таблицу переходов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба А как Вы знаете, что векторов нету? Прерывания не отрабатывают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Вот командный код. /****************************************************************************/ /* DM368.cmd */ /* Copyright © 2012 Texas Instruments Incorporated */ /* Author: Rafael de Souza */ /* */ /* Description: This file is a sample linker command file that can be */ /* used for linking programs built with the C compiler and */ /* running the resulting .out file on an DM368 EVM. */ /* Use it as a guideline. You will want to */ /* change the memory layout to match your specific */ /* target system. You may want to change the allocation */ /* scheme according to the size of your program. */ /* */ /****************************************************************************/ MEMORY { ARM_IVT o = 0x00000000 l = 0x00001000 /* ARM IVT set 4kB */ ARM_IRAM0 o = 0x00001000 l = 0x00003000 /* ARM Instruction RAM0 - 16kB */ ARM_IRAM1 o = 0x00004000 l = 0x00004000 /* ARM Instruction RAM1 - 16kB */ ARM_IROM o = 0x00008000 l = 0x00004000 /* ARM Instruction ROM - 16kB */ ARM_DRAM0 o = 0x00010000 l = 0x00004000 /* ARM Data RAM0 - 16kB */ ARM_DRAM1 o = 0x00014000 l = 0x00004000 /* ARM Data RAM1 - 16kB */ ARM_DROM o = 0x00018000 l = 0x00004000 /* ARM Data ROM - 16kB */ ARM_METB o = 0x01BC0000 l = 0x00001000 /* ARM ETB Memory - 4kB */ ARM_RETB o = 0x01BC1000 l = 0x00000800 /* ARM ETB Registers - 2kB */ ARM_ICECRSH o = 0x01BC1800 l = 0x00000100 /* ARM IceCrusher - 256B */ ARM_CFGBUS o = 0x01C00000 l = 0x00400000 /* CFG Bus Peripherals - 4MB */ ARM_DAEMIF o = 0x02000000 l = 0x08000000 /* ASYNC EMIF Data - 128MB */ ARM_MJCPD o = 0x11F00000 l = 0x00020000 /* MJCP DMA Port - 128kB */ ARM_HDVICPD o = 0x12000000 l = 0x00080000 /* HDVICP DMA Port - 512kB */ ARM_RDDR o = 0x20000000 l = 0x00008000 /* DDR EMIF Control Registers - 32kB */ ARM_DDR o = 0x80000000 l = 0x10000000 /* DDR EMIF - 256MB */ } SECTIONS { .ivt > ARM_IVT .text > ARM_DDR .stack > ARM_DDR .bss > ARM_DDR .cio > ARM_DDR .const > ARM_DDR .data > ARM_DDR .switch > ARM_DDR .sysmem > ARM_DDR .far > ARM_DDR .args > ARM_DDR .ppinfo > ARM_DDR .ppdata > ARM_DDR /* TI-ABI sections */ .pinit > ARM_DDR .cinit > ARM_DDR /* EABI sections */ .binit > ARM_DDR .init_array > ARM_DDR .neardata > ARM_DDR .fardata > ARM_DDR .rodata > ARM_DDR .c6xabi.exidx > ARM_DDR .c6xabi.extab > ARM_DDR } Если смотреть бинарник, то по адресам с 0х80000000 (где сама программа) код есть, а с 0x00000000, где вектора перехода, ничего нет. И в мэпе функций тоже ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Насколько я понял, линковщик просто не видит асм файл, хотя он добавлен в проект. То есть там ни в карте памяти ни в бинарнике этих джампов нет. Но собирает без ошибок, просто не добавляет эту таблицу переходов Судя по всему Линковщик всё прекрасно увидел и все объектники собрал воедино. Проблема в чём-то или ком-то:-) другом. ПС2: Для вставки на форум исходников используйте теги [ codebox ] ваш код... [ /codebox ] (без пробелов) или изучите кнопочки над полем ввода текста. Если смотреть бинарник, то по адресам с 0х80000000 (где сама программа) код есть, а с 0x00000000, где вектора перехода, ничего нет.А вам не приходило в голову что это может быть нормально? Могу предположить что с нулевого адреса находится РАМа в которую ваш стартап код должен закинуть данные, которые в бинарнике сидят совсем не по нулевому адресу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба Да. По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт. И если можно подскажите команду перехода на смещение более 32 МБ. Она должна быть что-то вроде mov pc, #label ... label: ... Но компилер не принимает. Или опять не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 10 января, 2013 Опубликовано 10 января, 2013 · Жалоба По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт. Скорее это число которое будет загружено в SP. В следующем слове будет адрес Reset_Handler-а. Никаких переходов нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vladimir_orl 0 11 января, 2013 Опубликовано 11 января, 2013 · Жалоба И в продолжение темы ещё один вопрос, если можно. Пишу на ассемблере в файле foo.asm: table_size .set 10000 ; define the constant .global _table_size ; make it global В сишном файле: extern int table_size; /*external ref */ #define TABLE_SIZE ((int) (&table_size)) Компилятор говорит: <Linking> undefined first referenced symbol in file --------- ---------------- table_size ./main.obj error #10234-D: unresolved symbols remain error #10010: errors encountered during linking; "asm2.out" not built Что это может быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться