Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-16 13:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 2018-июл-20 16:02 
Не в сети

Зарегистрирован: 2018-мар-20 09:55
Сообщения: 14
В обработчике прерывания системного таймера завел переменную
static uint8_t а=some_value;
затем, при попытке использовать переменную,
(послать значение в порт либо инкрементировать), прерывание больше не вызывается.
То же самое с использованием глобальных переменных.

И как пользоваться статическими переменными в прерывании?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июл-21 17:51 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 407
Цитата:
И как пользоваться статическими переменными в прерывании?

так, как это предусмотрено стандартом Си.
Уверены, что именно из-за статической переменной прерывание больше не вызывается?

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июл-23 10:03 
Не в сети

Зарегистрирован: 2018-мар-20 09:55
Сообщения: 14
По крайней мере если комментирую строку инкриментирование, и статическая переменная не используется, то прерывание вызывается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июл-23 13:11 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 407
Процессор? Компилятор? пример кода?
Как контролируется вход в прерывание?
Телепатия так утомляет.

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июл-23 23:51 
Не в сети

Зарегистрирован: 2018-мар-20 09:55
Сообщения: 14
К счастью работают глобальные переменные-структуры, но простые типы если определю, то какие-то проблемы, видимо с адресами, и портится вызов прерывания. Может виноват startup_MDR32F9Qx.s
Код:
Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=6
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000400

                AREA    HEAP, NOINIT, READWRITE, ALIGN=6
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     timer0            ; SysTick Handler

                ; External Interrupts
                DCD     CAN1_IRQHandler            ; IRQ0
                DCD     CAN2_IRQHandler            ; IRQ1
                DCD     USB_IRQHandler             ; IRQ2
                DCD     0                          ; IRQ3  reserved
                DCD     0                          ; IRQ4  reserved
                DCD     DMA_IRQHandler             ; IRQ5
                DCD     UART1_IRQHandler           ; IRQ6
                DCD     UART2_IRQHandler           ; IRQ7
                DCD     SSP1_IRQHandler            ; IRQ8
                DCD     0                          ; IRQ9  reserved
                DCD     I2C_IRQHandler             ; IRQ10
                DCD     POWER_IRQHandler           ; IRQ11
                DCD     WWDG_IRQHandler            ; IRQ12
                DCD     0                          ; IRQ13 reserved
                DCD     Timer1_IRQHandler          ; IRQ14
                DCD     Timer2_IRQHandler          ; IRQ15
                ;DCD     Timer3_IRQHandler          ; IRQ16
                ;DCD     ADC_IRQHandler             ; IRQ17
                ;DCD     0                          ; IRQ18 reserved
                ;DCD     COMPARATOR_IRQHandler      ; IRQ19
                ;DCD     SSP2_IRQHandler            ; IRQ20
                ;DCD     0                          ; IRQ21 reserved
                ;DCD     0                          ; IRQ22 reserved
                ;DCD     0                          ; IRQ23 reserved
                ;DCD     0                          ; IRQ24 reserved
                ;DCD     0                          ; IRQ25 reserved
                ;DCD     0                          ; IRQ26 reserved
                ;DCD     BACKUP_IRQHandler          ; IRQ27
                ;DCD     EXT_INT1_IRQHandler        ; IRQ28
                ;DCD     EXT_INT2_IRQHandler        ; IRQ29
                ;DCD     EXT_INT3_IRQHandler        ; IRQ30
                ;DCD     EXT_INT4_IRQHandler        ; IRQ31
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler           [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler             [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP
               
timer0 PROC
                EXPORT  timer0            [WEAK]
                B       .
                ENDP
               

Default_Handler PROC


                EXPORT  CAN1_IRQHandler            [WEAK]
                EXPORT  CAN2_IRQHandler            [WEAK]
                EXPORT  USB_IRQHandler             [WEAK]
                EXPORT  DMA_IRQHandler             [WEAK]
                EXPORT  UART1_IRQHandler           [WEAK]
                EXPORT  UART2_IRQHandler           [WEAK]
                EXPORT  SSP1_IRQHandler            [WEAK]
                EXPORT  I2C_IRQHandler             [WEAK]
                EXPORT  POWER_IRQHandler           [WEAK]
                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  Timer1_IRQHandler          [WEAK]
                EXPORT  Timer2_IRQHandler          [WEAK]
                EXPORT  Timer3_IRQHandler          [WEAK]
                EXPORT  ADC_IRQHandler             [WEAK]
                EXPORT  COMPARATOR_IRQHandler      [WEAK]
                EXPORT  SSP2_IRQHandler            [WEAK]
                EXPORT  BACKUP_IRQHandler          [WEAK]
                EXPORT  EXT_INT1_IRQHandler        [WEAK]
                EXPORT  EXT_INT2_IRQHandler        [WEAK]
                EXPORT  EXT_INT3_IRQHandler        [WEAK]
                EXPORT  EXT_INT4_IRQHandler        [WEAK]

CAN1_IRQHandler
CAN2_IRQHandler
USB_IRQHandler
DMA_IRQHandler
UART1_IRQHandler
UART2_IRQHandler
SSP1_IRQHandler
I2C_IRQHandler
POWER_IRQHandler
WWDG_IRQHandler
Timer1_IRQHandler
Timer2_IRQHandler
Timer3_IRQHandler
ADC_IRQHandler
COMPARATOR_IRQHandler
SSP2_IRQHandler
BACKUP_IRQHandler
EXT_INT1_IRQHandler
EXT_INT2_IRQHandler
EXT_INT3_IRQHandler
EXT_INT4_IRQHandler

                B       .

                ENDP

                ALIGN

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB

                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit

                 ELSE

                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap

__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END
. Изменил startup_MDR32F9Qx.s для того чтобы переместить таблицу векторов прерываний в оперативную память, затем переназначать функцию прерывания системного таймера, вот еще файл
Код:
   void timer1(void);
void timer0(void){
PORT_SetBits(MDR_PORTC, PORT_Pin_0|PORT_Pin_1);   
   
*(uint32_t*)0x200008bc=(uint32_t)timer1;   
   
}
   
   
void timer1(void){
//PORT_ResetBits(MDR_PORTC, PORT_Pin_0|PORT_Pin_1|PORT_Pin_2);
//PORT_ResetBits(MDR_PORTC, PORT_Pin_2);   

*(uint32_t*)0x200008bc=(uint32_t)timer0;
}
void CopyVectors(void){
*(uint32_t*)0x20000880=(uint32_t)__Vectors;
*(uint32_t*)0x20000884=(uint32_t)Reset_Handler;   
*(uint32_t*)0x20000888=(uint32_t)NMI_Handler;
*(uint32_t*)0x2000088c=(uint32_t)HardFault_Handler;   
   
*(uint32_t*)0x20000890=(uint32_t)MemManage_Handler;
*(uint32_t*)0x20000894=(uint32_t)BusFault_Handler;   
*(uint32_t*)0x20000898=(uint32_t)UsageFault_Handler;
*(uint32_t*)0x2000089c=(uint32_t)0;   
   
*(uint32_t*)0x200008a0=(uint32_t)0;
*(uint32_t*)0x200008a4=(uint32_t)0;   
*(uint32_t*)0x200008a8=(uint32_t)0;
*(uint32_t*)0x200008ac=(uint32_t)SVC_Handler;   
   
*(uint32_t*)0x200008b0=(uint32_t)DebugMon_Handler;
*(uint32_t*)0x200008b4=(uint32_t)0;   
*(uint32_t*)0x200008b8=(uint32_t)PendSV_Handler;   
*(uint32_t*)0x200008bc=(uint32_t)timer0;   

*(uint32_t*)0x200008c0=(uint32_t)CAN1_IRQHandler;
*(uint32_t*)0x200008c4=(uint32_t)CAN2_IRQHandler;
*(uint32_t*)0x200008c8=(uint32_t)USB_IRQHandler;
*(uint32_t*)0x200008cc=0;

*(uint32_t*)0x200008d0=0;
*(uint32_t*)0x200008d4=(uint32_t)DMA_IRQHandler;
*(uint32_t*)0x200008d8=(uint32_t)UART1_IRQHandler;
*(uint32_t*)0x20000dcc=(uint32_t)UART2_IRQHandler;

*(uint32_t*)0x200008e0=(uint32_t)SSP1_IRQHandler;
*(uint32_t*)0x200008e4=0;
*(uint32_t*)0x200008e8=(uint32_t)I2C_IRQHandler;
*(uint32_t*)0x200008ec=(uint32_t)POWER_IRQHandler;

*(uint32_t*)0x200008f0=(uint32_t)WWDG_IRQHandler;
*(uint32_t*)0x200008f4=0;
*(uint32_t*)0x200008f8=(uint32_t)Timer1_IRQHandler;
*(uint32_t*)0x200008fc=(uint32_t)Timer2_IRQHandler;
   
}


int main(void)
{   

CPU_init();

UARTS_Init();
PORTS_Init();   
__disable_irq();
   

CopyVectors(); 
   SCB->VTOR=__Vectors;
   SysTick->LOAD = 625   ;//8 kHz
  SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_CLKSOURCE_Msk;   
   
//__DSB();//__DMB?   
*(uint32_t*)0x200008bc=(uint32_t)timer0;//Tick;
//__enable_irq();

   


TIMER_Cmd(MDR_TIMER3,ENABLE); //включить TIMER1


while(1)
{      
//while (UART_GetFlagStatus (MDR_UART2, UART_FLAG_TXFF)== SET)
    ;
//    if((div_t&31)==0)
//UART_SendData (MDR_UART2,0x35);
}

}



Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июл-24 11:24 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 83
Думаю, дело в том, что вы без спросу захватили область оперативной памяти под новую таблицу векторов прерываний, ничего не сказав об этом компилятору и компоновщику. Поэтому компоновщик может разместить статическую переменную по адресу, совпадающему с каким-нибудь вектором прерывания.
Надо описать новую таблицу векторов прерываний как глобальную переменную, а затем скопировать туда старую таблицу. Вот пример того, как это можно сделать:

Код:
// Таблица векторов прерываний, размещаемая в ОЗУ. Ее ОБЯЗАТЕЛЬНО нужно разместить с выравниванием на 0x200
#define VECTORS_TABLE_SIZE 48   // !!! Уточните количество векторов
uint32_t Vectors_Table  [VECTORS_TABLE_SIZE] __attribute__(( aligned (0x200)));

// Настроить таблицу векторов прерываний
extern uint32_t __Vectors[]; // Определен в модуле startup_MDR32F9Qx.s
void IT_Init (void)
{
  uint32_t i;

   // Скопируем из ПЗУ старую таблицу векторов
   for (i = 0; i < VECTORS_TABLE_SIZE; i++)
   {
    Vectors_Table[i] = __Vectors[i];
  }
   
   // Задать новую таблицу векторов прерываний
  SCB->VTOR = (uint32_t) Vectors_Table;   
   
}


ЗЫ:
На всякий случай напомню, что для камней Cortex M0 (например, 1986ВЕ4У) и M1 (например, 1986ВЕ1Т) переместить таблицу векторов вообще невозможно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB