Delau

Передача Аргументов В Прерывание

5 сообщений в этой теме

Delau    0

Всем привет!

В рамках моей задачи есть необходимость изменять значение переменной в прерывании (да в прочем распространённое явление). Всё бы хорошо если бы проект не состоял из нескольких библиотек (file.c, file.h тоже распространённое явление :)).

Обычно библиотека создаётся с максимальным уровнем абстракции, что в свою очередь приводит к необходимости объявлять аргументы в функции в виде указателей. Всё хорошо - объявил, к примеру, структуру, и передал её адрес в функцию, обработал и забыл. НО, как быть если функция вызывается в обработчике прерывания?! У меня получилось только через объявление структуры глобально (extern), тогда понятно что она доступна в любом месте программы (в любом файле). И мне это ох как не нравиться. Не нравиться потому что появляется глобальная переменная.

Начал я детально изучать STMовские библиотеки, ибо там я свободно вызываю функцию в обработчике прерывания без передачи аргументов. И вот что получилось, на примере TIM6.

В файле stm32f10x.h объявлена структура:

typedef struct

{

__IO uint16_t CR1;

uint16_t RESERVED0;

__IO uint16_t CR2;

и т. д.

} TIM_TypeDef;

далее в нём же пошли такие дефайны:

#define PERIPH_BASE ((uint32_t)0x40000000)

#define APB1PERIPH_BASE PERIPH_BASE

#define TIM6_BASE (APB1PERIPH_BASE + 0x1000)

#define TIM6 ((TIM_TypeDef *) TIM6_BASE)

Теперь файл stm32f10x_tim.h

#include "stm32f10x.h"

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

И наконец файл stm32f10x_tim.c

#include "stm32f10x_tim.h"

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

{

if (NewState != DISABLE)

{

/* Enable the TIM Counter */

TIMx->CR1 |= TIM_CR1_CEN;

}

else

{

/* Disable the TIM Counter */

TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));

}

}

Теперь я могу в абсолютно любом месте программы сделать вызов, допустим так: TIM_Cmd(TIM6, ENABLE); Хоть в обработчике прерывания хоть где ещё. Я не объявляю глобальных структур!

Давайте посмотрим на мою задачу.

В h-файле объявлена структура:

typedef struct

{

usart_status_TypeDef status;

uint32_t baudrate; //9600 or 115200

uint8_t *p_tx_buf;

и т. д.

} usart_init_struct_TypeDef;

в с-файле есть функция:

void usart_it_handler(usart_init_struct_TypeDef *usart_struct)

{

if (USART_GetITStatus (USART1, USART_IT_TC))

{

//здесь куча всяких вызовов и далее самое главное

usart_struct->status = transmit_complete; //это одно из полей вышеобъявленной структуры

};

};

Теперь обработчик прерывания.

с-файл:

void USART1_IRQHandler(void)

{

usart_it_handler(&usart_struct);

};

И работает всё это только при условии что структура usart_struct будет глобальной т. е. я её объявляю в файле main и в файле с обработчиками прерываний (extern)/

Разница между моим и STMовским кодом заключается в том что у них есть привязка к физическим адресам периферии, а у меня нет.

Как сделать код похожим на STMовский? Чтобы можно было вызывать функцию в любом месте программы без объявления глобальных структур.

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


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

может вы не совсем понимаете что значит явное указание адреса....

для компилятора это фактически объявление глобальной переменной

для основного кода программы обработчик прерывания есть внешний код

и передача переменных в него всегда производится глобально, хоть это не всегда видно явно...

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


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

Т.е. фактически у меня всё правильно. Только через объявление структуры глобально.

Спасибо за ответ.

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


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

да правильно, только глобально...

а у младших ПИКов еще веселей если переменной указать первые адреса обшей памяти данных вообще можно поиметь нехилые грабли, по дефолту компилятор туда пишет сохранение контента прерывания, причем в хелпе об этом ни слова

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


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

В прерывании МК должен находиться как можно меньше!

Воспользуйтесь флагами...

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сообщения

    • Не всё так просто, даже с такими "балалайками" как сабж темы. Лучше всё-таки с инструментальной поддержкой - серому в залобье будет проще воспринимать наличие артефактов, или же напротив - их отсутствие.  
    • Ну, а ежельник патриот (вот как я, например) и не уважаете всякие заморские штучки, то советую идти в одну сторону - ультразвука. В местах не столь отдалённых и по сей день стоят российского производства УЗ приборы с точностью до  10 --6 литра, потому как  если в переполненном трамвае одно неловкое движение и вы отец, то в переполненном сосуде, скажем высокоактивным изотопом один лишний миллилитр и вам п....ц. В вашем случае такой точности не надо, поэтому, видимо, это будет примитивная накладка на пластиковую трубку системы  с двумя УЗ датчиками один излучатель, другой приёмник, далее повторяется схема обычного УЗ расходомера, но придётся повозиться с настройками, но вашем случае с бинарной ситуацией (да -нет) шибкой точности не потребуется. ,
    • Теперь уже через 10-12 дней. Уезжаю от своего верстака на море с семьей.Надеюсь там не сойду с ума от безделья и не сгорю от пива. А как приеду обязательно все проверю и отпишусь. Чем там..впаял резюки, послушал, сравнил, написал. Все просто..)
    • Мистика... рес проработал 4 часа 5 минут. Автоотключение задано таймингом 3часа. Лишний час говорит, что дело не в тайминге. Включил заново, переключил на СТС, засекаю время...
    • Два вопроса, Валерий Сергеевич. Зачем мне осваивать новый симулятор, если я не испытываю ограничений при работе с текущим? Это, как совет - У Вас есть отвёртка? Тогда купите такую же, только с красной ручкой. И, чем таким он оооочень удобный? Вид скриншотов LTspice оооочень  больно ранит мои эстетические чувства.  А информация из  LTspice, по крайней мере Вами публикуемая, вне пределов моего понимания. И, оооочень  озадачивает. Не хуже кроссворда. К стати, о скриншотах. Оооочень  желательно выкладывать информацию в виде, воспринимаемом человеком, даже с минимальной подготовкой. Если Вы, конечно, хотите донести до человека информацию, а не показать, что он дурак, не способный разобраться. Ваши скриншоты, с первого взгляда, мне не понятны. А тратить время на подробно разобраться в Ваших "дебрях", поверьте, жаль. Получается, это сродни рекламе, которую видят, но не читают. Кто хорошо в этом разбирается? И, чем именно лучше? Сомневаюсь, что существует статья, написанная признанным специалистом, с аргументированным анализом,  Сталлоне против Шварцнегера MicroCap vs LTspice. А чиверов мы уже проходили. Фигня бла-блабольская. Ну да, ну да. Только у АМЛ, параллельно цепи R22 + R23, стоит цепь R8 + R9, Вами упорно не замечаемая. Да, 5,047 МОм. Не много, но влияет.
    • Какой профиль сечения этой лопасти? Как я понимаю это разновидность типа н.