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

Глядя на таблицу прерываний

 DCD     TIM8_BRK_IRQHandler               ; TIM8 Break                  
 DCD     TIM8_UP_IRQHandler                ; TIM8 Update                
 DCD     TIM8_TRG_COM_IRQHandler           ; TIM8 Trigger and Commutation
 DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
 DCD     ADC3_IRQHandler                   ; ADC3                                           
 DCD     0                                 ; Reserved                                            
 DCD     0                                 ; Reserved                                            
 DCD     0                                 ; Reserved                                            
 DCD     SPI3_IRQHandler                   ; SPI3                                            
 DCD     UART4_IRQHandler                  ; UART4     

замечаю что есть неиспользованные -  DCD     0    ; Reserved  

Это значит их можно использовать в своих целях?

Изменено пользователем jenya7

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


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

Что значит "в своих целях"?

Они физически есть в таблице векторов используемого процессора? Это может быть младшая модель, в которой эти прерывания просто отсутствуют

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


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

Возможно да, но скорее всего - нет: в "кремнии" тупо не реализовано. Отдадчик ведь есть - попробуйте и нам доложите.

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


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

Как именно и зачем использовать асинхронное прерывание, когда есть синхронное исключение SVCall для подобных нужд?

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


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

1 hour ago, adnega said:

Как именно и зачем использовать асинхронное прерывание, когда есть синхронное исключение SVCall для подобных нужд?

В смысле? Я хочу создать свое прерывание, которое будет вызываться по какому нибудь ивенту.

то есть вместо DCD 0 ; Reserved - DCD My_IRQHandler.

ну и потом по аналогии

PUBWEAK EXTI0_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
EXTI0_IRQHandler  
        B EXTI0_IRQHandler

прописать

PUBWEAK My_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
My_IRQHandler  
        B My_IRQHandler

чтоб привязать обработчик к таблице.

единственно что я не понимаю - как привязать ивент к прерыванию.

 

1 hour ago, Obam said:

Возможно да, но скорее всего - нет: в "кремнии" тупо не реализовано. Отдадчик ведь есть - попробуйте и нам доложите.

1 hour ago, toweroff said:

Что значит "в своих целях"?

Они физически есть в таблице векторов используемого процессора? Это может быть младшая модель, в которой эти прерывания просто отсутствуют

физически как раз он определен - DCD ведь выделяет место.

 

Изменено пользователем jenya7

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


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

2 минуты назад, jenya7 сказал:

единственно что я не понимаю - как привязать ивент к прерыванию.

Что такое "ивент"? Можно пример.

Прерывание можно спровоцировать программно, установив соответствующий pending-бит в регистре NVIC.

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


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

1 hour ago, adnega said:

Что такое "ивент"? Можно пример.

Прерывание можно спровоцировать программно, установив соответствующий pending-бит в регистре NVIC.

ну это как раз то что нужно. то есть я могу поднять соответствующий бит в NVIC? они по моему привязаны к индексам в таблице прерываний.

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


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

Спровоцировать программное прерывание можно при условии, что оно есть по этому вектору. Сомневаюсь, что по "пустышке" (DCD x) оно есть физически.

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


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

1 hour ago, Arlleex said:

Спровоцировать программное прерывание можно при условии, что оно есть по этому вектору. Сомневаюсь, что по "пустышке" (DCD x) оно есть физически.

ну вот возьмем кусок таблицы (это другой проект, не STM32 а Kinetis)

#define VECTOR_061      UART0_RX_TX_IRQHandler  // 0x0000_00F4  45     UART0 
------------------------------------------------------------------------------
-----------------------------------------------------------------------------
#define VECTOR_114       default_isr     // 0x0000_01C8    98    
#define VECTOR_115      default_isr     // 0x0000_01CC    99    
#define VECTOR_116      default_isr     // 0x0000_01D0    100
#define VECTOR_117      default_isr     // 0x0000_01D4    101
#define VECTOR_118      default_isr     // 0x0000_01D8    102
#define VECTOR_119      default_isr     // 0x0000_01DC    103

 

а сама таблица физически выделена

const VECTOR vector_entry  __vector_table[] =
{
   VECTOR_000,           /* Initial SP           */
   VECTOR_001,           /* Initial PC           */
   VECTOR_002,
   VECTOR_003,

   ----------
   ----------

   VECTOR_253,
   VECTOR_254,
   VECTOR_255,
};

я инициализирую - enable_irq(45); - и по индексу 45 - у меня находиться UART0_RX_TX_IRQHandler.

идексы 98 - 103 - пустые. но прописав enable_irq(103); - я смогу пользоваться #define VECTOR_119     default_isr     // 0x0000_01DC    103

или я что то упускаю?

Изменено пользователем jenya7

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


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

3 минуты назад, jenya7 сказал:

 я смогу пользоваться #define VECTOR_119     default_isr     // 0x0000_01DC    103

или я что то упускаю?

Вместо default_isr в таблицу нужно вписать свой обработчик.

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


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

1 hour ago, adnega said:

Вместо default_isr в таблицу нужно вписать свой обработчик.

это понятно. но то же самое можно сделать в STM32, в первом примере?

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


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

31 минуту назад, jenya7 сказал:

ну вот возьмем кусок таблицы (это другой проект, не STM32 а Kinetis)...

Еще раз: если аппаратура МК имеет физическую реализацию вектора прерывания, то Вы вправе делать с этим вектором что угодно и описывать его как заблагорассудится. Если вектора нет - Вы должны описать его как пустое пространство (например, с помощью директивы DCD 0) и не иметь попыток доступа к этому вектору любым способом, потому что это вызовет, скорее всего, какой-нибудь fault, эскалирующий до HF при возможности.

Резюме: Вы можете сформировать программный запрос на любое прерывание, физически выведенное на NVIC.

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


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

1 hour ago, adnega said:

Конечно, можно. Вопрос зачем?

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

1 hour ago, Arlleex said:

Резюме: Вы можете сформировать программный запрос на любое прерывание, физически выведенное на NVIC.

тогда другой вопрос. скажем я иду в регистр УАРТа, поднимаю там флаг - активизировать прерывание по принятому чару. как этот флаг физически привызывается к таблице прерываний? он (флаг) не знает где находиться таблица.

Изменено пользователем jenya7

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


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

18 минут назад, jenya7 сказал:

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

А обычная функция чем не подходит?

Если нужны полноценные задачи, то нужно применять RTOS.

18 минут назад, jenya7 сказал:

тогда другой вопрос. скажем я иду в регистр УАРТа, поднимаю там флаг - активизировать прерывание по принятому чару. как этот флаг физически привызывается к таблице прерываний? он (флаг) не знает где находиться таблица.

 

Флаг прерывания от периферии взводит связанный с ним pending-бит, а далее NVIC все делает сам.

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


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

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

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

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

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

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

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

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

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

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