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

SAM3S и таблица векторов

Нужно отлавливать прерывания по UART RX

Контроллер UART сконфигурировал

Контроллер NVIC сконфигурировал

Осталось прописать адрес обработчика в таблицу векторов. Чойто не пойму как это сделать?

Компилятор IAR

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


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

Посмотрите в стартап файле имена обработчиков прерываний и просто создайте функцию с таким именем.

В 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®.

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


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

Все заработало, спасибо.

Если кому интересно:

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

Таблица содержала вектора только для системных прерываний.

startup.c взятый из примеров IAR для SAM3 компилировался с ошибками, startup.s вообще был пустой.

Взял startup.s от одного из NXP, немного поправил, заработало.

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


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

Здравствуйте, уважаемые участники форума.

 

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

 

Пишу на CCS5. Насколько я понял, стартапный код пишется на ассемблере. Но он почему-то не хочет линковаться вместе с сишными файлами. Слышал, что надо его как-то объявить в мэйнике, либо настройках проекта, но как не знаю. Подскажите, если можно.

И ещё вопрос. Скажите, если мы находимся в режиме user и у нас нет прерываний, то мы совсем не можем перейти в режим супервизора? Вручную меняю содержимое регистра CPSR с режима user на супервизора, он не принимает изменений. Что можно сделать?

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

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


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

Что значит не хочет линковаться?

Покажите вывод компилятора и линкера.

 

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

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


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

Вот стартап

 

; 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 ****

 

 

Насколько я понял, линковщик просто не видит асм файл, хотя он добавлен в проект. То есть там ни в карте памяти ни в бинарнике этих джампов нет.

 

Но собирает без ошибок, просто не добавляет эту таблицу переходов

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


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

Вот командный код.

 

 

/****************************************************************************/

/* 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, где вектора перехода, ничего нет. И в мэпе функций тоже ничего.

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


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

Насколько я понял, линковщик просто не видит асм файл, хотя он добавлен в проект. То есть там ни в карте памяти ни в бинарнике этих джампов нет.

Но собирает без ошибок, просто не добавляет эту таблицу переходов

Судя по всему Линковщик всё прекрасно увидел и все объектники собрал воедино.

Проблема в чём-то или ком-то:-) другом.

 

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

 

Если смотреть бинарник, то по адресам с 0х80000000 (где сама программа) код есть, а с 0x00000000, где вектора перехода, ничего нет.
А вам не приходило в голову что это может быть нормально?

Могу предположить что с нулевого адреса находится РАМа в которую ваш стартап код должен закинуть данные, которые в бинарнике сидят совсем не по нулевому адресу.

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


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

Да. По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт.

И если можно подскажите команду перехода на смещение более 32 МБ.

Она должна быть что-то вроде

   mov pc, #label
   ...
label:
   ...

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

 

 

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


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

По нулевому адресу есть что-то "EA001FFE". Это судя по всему, команда перехода, посмотрю, куда ведёт.

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

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


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

И в продолжение темы ещё один вопрос, если можно.

 

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

 

 

Что это может быть?

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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