Jump to content

    

Свое прерывание

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

 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  

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

Edited by jenya7

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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 ведь выделяет место.

 

Edited by jenya7

Share this post


Link to post
Share on other sites
2 минуты назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, adnega said:

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
3 минуты назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, adnega said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
31 минуту назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, adnega said:

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

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

1 hour ago, Arlleex said:

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
18 минут назад, jenya7 сказал:

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now