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

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


Delau

Рекомендуемые сообщения

Всем привет!

В рамках моей задачи есть необходимость изменять значение переменной в прерывании (да в прочем распространённое явление). Всё бы хорошо если бы проект не состоял из нескольких библиотек (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овский? Чтобы можно было вызывать функцию в любом месте программы без объявления глобальных структур.

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

На форумах принято общаться на "ты", что не является оскорбительным и подразумевает равноправие

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...