реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не работают прерывания в LPC176x, нет перехода на переопределённый обработчик
Altemir
сообщение Aug 25 2011, 12:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Всем день добрый. Разбираюсь с прерываниями LPC176x в IAR 6.21, столкнулся с такой проблемой:
1. Настроен таймер на генерацию прерываний
2. Определена функция void TIMER0_IRQHandler(void) согласно наименованию в startup_LPC17xx.s, который подключен к проекту и не изменялся
3. После запуска программы перехода на мою функцию нет, такое ощущение, что программа переходит на дефолтную, определённую в startup_LPC17xx.s и зацикливается

Выкидывал из проекта startup_LPC17xx.s, определял векторы/функции через отдельный файл vector_table_M.c, всё работает как надо, переходы фиксируются. Листинг указанного файла:
CODE
//-------------------------------------------------------------------------------
#pragma language=extended
#pragma segment="CSTACK"
//-------------------------------------------------------------------------------
extern "C" void __iar_program_start( void );
//-------------------------------------------------------------------------------
__weak void NMI_Handler( void ) { while (1) {} }
__weak void HardFault_Handler( void ) { while (1) {} }
__weak void MemManage_Handler( void ) { while (1) {} }
__weak void BusFault_Handler( void ) { while (1) {} }
__weak void UsageFault_Handler( void ) { while (1) {} }
__weak void SVC_Handler( void ) { while (1) {} }
__weak void DebugMon_Handler( void ) { while (1) {} }
__weak void PendSV_Handler( void ) { while (1) {} }
__weak void SysTick_Handler( void ) { while (1) {} }
__weak void WDT_IRQHandler( void ) { while (1) {} }
__weak void TIMER0_IRQHandler( void ) { while (1) {} }
__weak void TIMER1_IRQHandler( void ) { while (1) {} }
__weak void TIMER2_IRQHandler( void ) { while (1) {} }
__weak void TIMER3_IRQHandler( void ) { while (1) {} }
__weak void UART0_IRQHandler( void ) { while (1) {} }
__weak void UART1_IRQHandler( void ) { while (1) {} }
__weak void UART2_IRQHandler( void ) { while (1) {} }
__weak void UART3_IRQHandler( void ) { while (1) {} }
__weak void PWM1_IRQHandler( void ) { while (1) {} }
__weak void I2C0_IRQHandler( void ) { while (1) {} }
__weak void I2C1_IRQHandler( void ) { while (1) {} }
__weak void I2C2_IRQHandler( void ) { while (1) {} }
__weak void SPI_IRQHandler( void ) { while (1) {} }
__weak void SSP0_IRQHandler( void ) { while (1) {} }
__weak void SSP1_IRQHandler( void ) { while (1) {} }
__weak void PLL0_IRQHandler( void ) { while (1) {} }
__weak void RTC_IRQHandler( void ) { while (1) {} }
__weak void EINT0_IRQHandler( void ) { while (1) {} }
__weak void EINT1_IRQHandler( void ) { while (1) {} }
__weak void EINT2_IRQHandler( void ) { while (1) {} }
__weak void EINT3_IRQHandler( void ) { while (1) {} }
__weak void ADC_IRQHandler( void ) { while (1) {} }
__weak void BOD_IRQHandler( void ) { while (1) {} }
__weak void USB_IRQHandler( void ) { while (1) {} }
__weak void CAN_IRQHandler( void ) { while (1) {} }
__weak void GPDMA_IRQHandler( void ) { while (1) {} }
__weak void I2S_IRQHandler( void ) { while (1) {} }
__weak void Ethernet_IRQHandler( void ) { while (1) {} }
__weak void RIT_IRQHandler( void ) { while (1) {} }
__weak void MotorControlPWM_IRQHandler( void ) { while (1) {} }
__weak void QE_IRQHandler( void ) { while (1) {} }
__weak void PLL1_IRQHandler( void ) { while (1) {} }
//-------------------------------------------------------------------------------
typedef void( *intfunc )( void );
typedef union { intfunc __fun; void * __ptr; } intvec_elem;
//-------------------------------------------------------------------------------
#pragma location = ".intvec"
extern "C" const intvec_elem __vector_table[]=
{
{ .__ptr = __sfe( "CSTACK" ) },
__iar_program_start,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSV_Handler,
SysTick_Handler,
WDT_IRQHandler,
TIMER0_IRQHandler,
TIMER1_IRQHandler,
TIMER2_IRQHandler,
TIMER3_IRQHandler,
UART0_IRQHandler,
UART1_IRQHandler,
UART2_IRQHandler,
UART3_IRQHandler,
PWM1_IRQHandler,
I2C0_IRQHandler,
I2C1_IRQHandler,
I2C2_IRQHandler,
SPI_IRQHandler,
SSP0_IRQHandler,
SSP1_IRQHandler,
PLL0_IRQHandler,
RTC_IRQHandler,
EINT0_IRQHandler,
EINT1_IRQHandler,
EINT2_IRQHandler,
EINT3_IRQHandler,
ADC_IRQHandler,
BOD_IRQHandler,
USB_IRQHandler,
CAN_IRQHandler,
GPDMA_IRQHandler,
I2S_IRQHandler,
Ethernet_IRQHandler,
RIT_IRQHandler,
MotorControlPWM_IRQHandler,
QE_IRQHandler,
PLL1_IRQHandler
};
//-------------------------------------------------------------------------------


Помогите разобраться, в чём может быть проблема? Нужно ли что-то менять в startup_LPC17xx.s? Листинг стандартного:
CODE
; Cortex-M version
;

MODULE ?cstartup

;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)

SECTION .intvec:CODE:NOROOT(2)

EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size

DATA

__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler

DCD NMI_Handler
DCD HardFault_Handler
DCD MemManage_Handler
DCD BusFault_Handler
DCD UsageFault_Handler
__vector_table_0x1c
DCD 0
DCD 0
DCD 0
DCD 0
DCD SVC_Handler
DCD DebugMon_Handler
DCD 0
DCD PendSV_Handler
DCD SysTick_Handler

; External Interrupts
DCD WDT_IRQHandler ; 16: Watchdog Timer
DCD TIMER0_IRQHandler ; 17: Timer0
DCD TIMER1_IRQHandler ; 18: Timer1
DCD TIMER2_IRQHandler ; 19: Timer2
DCD TIMER3_IRQHandler ; 20: Timer3
DCD UART0_IRQHandler ; 21: UART0
DCD UART1_IRQHandler ; 22: UART1
DCD UART2_IRQHandler ; 23: UART2
DCD UART3_IRQHandler ; 24: UART3
DCD PWM1_IRQHandler ; 25: PWM1
DCD I2C0_IRQHandler ; 26: I2C0
DCD I2C1_IRQHandler ; 27: I2C1
DCD I2C2_IRQHandler ; 28: I2C2
DCD SPI_IRQHandler ; 29: SPI
DCD SSP0_IRQHandler ; 30: SSP0
DCD SSP1_IRQHandler ; 31: SSP1
DCD PLL0_IRQHandler ; 32: PLL0 Lock (Main PLL)
DCD RTC_IRQHandler ; 33: Real Time Clock
DCD EINT0_IRQHandler ; 34: External Interrupt 0
DCD EINT1_IRQHandler ; 35: External Interrupt 1
DCD EINT2_IRQHandler ; 36: External Interrupt 2
DCD EINT3_IRQHandler ; 37: External Interrupt 3
DCD ADC_IRQHandler ; 38: A/D Converter
DCD BOD_IRQHandler ; 39: Brown-Out Detect
DCD USB_IRQHandler ; 40: USB
DCD CAN_IRQHandler ; 41: CAN
DCD DMA_IRQHandler ; 42: General Purpose DMA
DCD I2S_IRQHandler ; 43: I2S
DCD ENET_IRQHandler ; 44: Ethernet
DCD RIT_IRQHandler ; 45: Repetitive Interrupt Timer
DCD MCPWM_IRQHandler ; 46: Motor Control PWM
DCD QEI_IRQHandler ; 47: Quadrature Encoder Interface
DCD PLL1_IRQHandler ; 48: PLL1 Lock (USB PLL)
__Vectors_End

__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB

PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER(2)
Reset_Handler
LDR R0, =SystemInit
BLX R0
LDR R0, =__iar_program_start
BX R0

PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER(1)
NMI_Handler
B NMI_Handler

PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER(1)
HardFault_Handler
B HardFault_Handler

PUBWEAK MemManage_Handler
SECTION .text:CODE:REORDER(1)
MemManage_Handler
B MemManage_Handler

PUBWEAK BusFault_Handler
SECTION .text:CODE:REORDER(1)
BusFault_Handler
B BusFault_Handler

PUBWEAK UsageFault_Handler
SECTION .text:CODE:REORDER(1)
UsageFault_Handler
B UsageFault_Handler

PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER(1)
SVC_Handler
B SVC_Handler

PUBWEAK DebugMon_Handler
SECTION .text:CODE:REORDER(1)
DebugMon_Handler
B DebugMon_Handler

PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER(1)
PendSV_Handler
B PendSV_Handler

PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER(1)
SysTick_Handler
B SysTick_Handler

PUBWEAK WDT_IRQHandler
SECTION .text:CODE:REORDER(1)
WDT_IRQHandler
B WDT_IRQHandler

PUBWEAK TIMER0_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER0_IRQHandler
B TIMER0_IRQHandler

PUBWEAK TIMER1_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER1_IRQHandler
B TIMER1_IRQHandler

PUBWEAK TIMER2_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER2_IRQHandler
B TIMER2_IRQHandler

PUBWEAK TIMER3_IRQHandler
SECTION .text:CODE:REORDER(1)
TIMER3_IRQHandler
B TIMER3_IRQHandler

PUBWEAK UART0_IRQHandler
SECTION .text:CODE:REORDER(1)
UART0_IRQHandler
B UART0_IRQHandler

PUBWEAK UART1_IRQHandler
SECTION .text:CODE:REORDER(1)
UART1_IRQHandler
B UART1_IRQHandler

PUBWEAK UART2_IRQHandler
SECTION .text:CODE:REORDER(1)
UART2_IRQHandler
B UART2_IRQHandler

PUBWEAK UART3_IRQHandler
SECTION .text:CODE:REORDER(1)
UART3_IRQHandler
B UART3_IRQHandler

PUBWEAK PWM1_IRQHandler
SECTION .text:CODE:REORDER(1)
PWM1_IRQHandler
B PWM1_IRQHandler

PUBWEAK I2C0_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C0_IRQHandler
B I2C0_IRQHandler

PUBWEAK I2C1_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C1_IRQHandler
B I2C1_IRQHandler

PUBWEAK I2C2_IRQHandler
SECTION .text:CODE:REORDER(1)
I2C2_IRQHandler
B I2C2_IRQHandler

PUBWEAK SPI_IRQHandler
SECTION .text:CODE:REORDER(1)
SPI_IRQHandler
B SPI_IRQHandler

PUBWEAK SSP0_IRQHandler
SECTION .text:CODE:REORDER(1)
SSP0_IRQHandler
B SSP0_IRQHandler

PUBWEAK SSP1_IRQHandler
SECTION .text:CODE:REORDER(1)
SSP1_IRQHandler
B SSP1_IRQHandler

PUBWEAK PLL0_IRQHandler
SECTION .text:CODE:REORDER(1)
PLL0_IRQHandler
B PLL0_IRQHandler

PUBWEAK RTC_IRQHandler
SECTION .text:CODE:REORDER(1)
RTC_IRQHandler
B RTC_IRQHandler

PUBWEAK EINT0_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT0_IRQHandler
B EINT0_IRQHandler

PUBWEAK EINT1_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT1_IRQHandler
B EINT1_IRQHandler

PUBWEAK EINT2_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT2_IRQHandler
B EINT2_IRQHandler

PUBWEAK EINT3_IRQHandler
SECTION .text:CODE:REORDER(1)
EINT3_IRQHandler
B EINT3_IRQHandler

PUBWEAK ADC_IRQHandler
SECTION .text:CODE:REORDER(1)
ADC_IRQHandler
B ADC_IRQHandler

PUBWEAK BOD_IRQHandler
SECTION .text:CODE:REORDER(1)
BOD_IRQHandler
B BOD_IRQHandler

PUBWEAK USB_IRQHandler
SECTION .text:CODE:REORDER(1)
USB_IRQHandler
B USB_IRQHandler

PUBWEAK CAN_IRQHandler
SECTION .text:CODE:REORDER(1)
CAN_IRQHandler
B CAN_IRQHandler

PUBWEAK DMA_IRQHandler
SECTION .text:CODE:REORDER(1)
DMA_IRQHandler
B DMA_IRQHandler

PUBWEAK I2S_IRQHandler
SECTION .text:CODE:REORDER(1)
I2S_IRQHandler
B I2S_IRQHandler

PUBWEAK ENET_IRQHandler
SECTION .text:CODE:REORDER(1)
ENET_IRQHandler
B ENET_IRQHandler

PUBWEAK RIT_IRQHandler
SECTION .text:CODE:REORDER(1)
RIT_IRQHandler
B RIT_IRQHandler

PUBWEAK MCPWM_IRQHandler
SECTION .text:CODE:REORDER(1)
MCPWM_IRQHandler
B MCPWM_IRQHandler

PUBWEAK QEI_IRQHandler
SECTION .text:CODE:REORDER(1)
QEI_IRQHandler
B QEI_IRQHandler

PUBWEAK PLL1_IRQHandler
SECTION .text:CODE:REORDER(1)
PLL1_IRQHandler
B PLL1_IRQHandler

END


Сообщение отредактировал IgorKossak - Aug 25 2011, 14:07
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 26 2011, 02:27
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Если обработчик определён в *.cpp файле, то его надо объявлять как
Код
extern "C" TIMER0_IRQHandler(void)
{
   ...
}



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Altemir
сообщение Aug 26 2011, 06:23
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(AHTOXA @ Aug 26 2011, 06:27) *
Если обработчик определён в *.cpp файле, то его надо объявлять как...

Ого! Не знал. Спасибо огромное! Получается, компилятор/линкер игнорировали моё объявление "void TIMER0_IRQHandler(void);", подставляя функцию из *.s файла? А указанное Вами объявление задало им соответствующий приоритет выбора указанной функции?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 26 2011, 10:05
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Нет, не так. Почитайте про name mangling.
Вкратце - компилятор c++ хитрым образом искажает имена функций в объектных файлах, в зависимости от их параметров. Это нужно для перегрузки функций. Поэтому линкер не находит вашего обработчика.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Altemir
сообщение Aug 27 2011, 19:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Цитата(AHTOXA @ Aug 26 2011, 14:05) *
Нет, не так. Почитайте про name mangling.

О! Теперь понял. Ещё раз спасибо. Старшие товарищи по оружию постфактум объяснили потом то же самое.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 10:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01422 секунд с 7
ELECTRONIX ©2004-2016