Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM3S и таблица векторов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Liseev
Нужно отлавливать прерывания по UART RX
Контроллер UART сконфигурировал
Контроллер NVIC сконфигурировал
Осталось прописать адрес обработчика в таблицу векторов. Чойто не пойму как это сделать?
Компилятор IAR
demiurg_spb
Посмотрите в стартап файле имена обработчиков прерываний и просто создайте функцию с таким именем.
В 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
Все заработало, спасибо.
Если кому интересно:
Изначально в проекте стартапа в явном виде не было, линковщик вытаскивал его из библиотеки уже в откомпилированном виде.
Таблица содержала вектора только для системных прерываний.
startup.c взятый из примеров IAR для SAM3 компилировался с ошибками, startup.s вообще был пустой.
Взял startup.s от одного из NXP, немного поправил, заработало.
vladimir_orl
Здравствуйте, уважаемые участники форума.

Имеется задача создания таблицы векторов прерываний (и ISR к ним) для процессора TI DM368.

Пишу на CCS5. Насколько я понял, стартапный код пишется на ассемблере. Но он почему-то не хочет линковаться вместе с сишными файлами. Слышал, что надо его как-то объявить в мэйнике, либо настройках проекта, но как не знаю. Подскажите, если можно.
И ещё вопрос. Скажите, если мы находимся в режиме user и у нас нет прерываний, то мы совсем не можем перейти в режим супервизора? Вручную меняю содержимое регистра CPSR с режима user на супервизора, он не принимает изменений. Что можно сделать?
Если можно, подскажите хотя бы общую методологию, за конкретные ответы и примеры отдельный респект.
demiurg_spb
Что значит не хочет линковаться?
Покажите вывод компилятора и линкера.

ПС: Вам стоило создать свою тему с таким вопросом...
vladimir_orl
Вот стартап

; 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
А как Вы знаете, что векторов нету? Прерывания не отрабатывают?
vladimir_orl
Вот командный код.


/****************************************************************************/
/* 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
Цитата(vladimir_orl @ Jan 10 2013, 15:09) *
Насколько я понял, линковщик просто не видит асм файл, хотя он добавлен в проект. То есть там ни в карте памяти ни в бинарнике этих джампов нет.
Но собирает без ошибок, просто не добавляет эту таблицу переходов
Судя по всему Линковщик всё прекрасно увидел и все объектники собрал воедино.
Проблема в чём-то или ком-то:-) другом.

ПС2: Для вставки на форум исходников используйте теги [ codebox ] ваш код... [ /codebox ] (без пробелов) или изучите кнопочки над полем ввода текста.

Цитата(vladimir_orl @ Jan 10 2013, 15:44) *
Если смотреть бинарник, то по адресам с 0х80000000 (где сама программа) код есть, а с 0x00000000, где вектора перехода, ничего нет.
А вам не приходило в голову что это может быть нормально?
Могу предположить что с нулевого адреса находится РАМа в которую ваш стартап код должен закинуть данные, которые в бинарнике сидят совсем не по нулевому адресу.
vladimir_orl
Да. По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт.
И если можно подскажите команду перехода на смещение более 32 МБ.
Она должна быть что-то вроде
Код
   mov pc, #label
   ...
label:
   ...

Но компилер не принимает. Или опять не так?

_Артём_
Цитата(vladimir_orl @ Jan 10 2013, 14:41) *
По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт.

Скорее это число которое будет загружено в SP. В следующем слове будет адрес Reset_Handler-а. Никаких переходов нет.
vladimir_orl
И в продолжение темы ещё один вопрос, если можно.

Пишу на ассемблере в файле 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



Что это может быть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.