• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ustawianie flag w przerwaniu timera - dobrze, czy źle

0 głosów
41 wizyt
pytanie zadane 11 października 2018 w Arduino przez Spektral Początkujący (400 p.)

Witam. Moje pytanie tyczy się ogólnie programowania mikrokontrolerów. Oto kod dla STM32:
 

#include <string.h>
#include "stm32f1xx.h"

UART_HandleTypeDef uart;
TIM_HandleTypeDef tim2;
int status = 0;
void send_string(char* s)
{
	HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000);
}

void TIM2_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&tim2);
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   status = 1;
}

int main(void)
{
	SystemCoreClock = 8000000;	// taktowanie 8Mhz
	HAL_Init();

	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_USART2_CLK_ENABLE();
	__HAL_RCC_TIM2_CLK_ENABLE();

	GPIO_InitTypeDef gpio;
	gpio.Mode = GPIO_MODE_AF_PP;
	gpio.Pin = GPIO_PIN_2;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &gpio);

	gpio.Mode = GPIO_MODE_AF_INPUT;
	gpio.Pin = GPIO_PIN_3;
	HAL_GPIO_Init(GPIOA, &gpio);

	uart.Instance = USART2;
	uart.Init.BaudRate = 115200;
	uart.Init.WordLength = UART_WORDLENGTH_8B;
	uart.Init.Parity = UART_PARITY_NONE;
	uart.Init.StopBits = UART_STOPBITS_1;
	uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	uart.Init.OverSampling = UART_OVERSAMPLING_16;
	uart.Init.Mode = UART_MODE_TX_RX;
	HAL_UART_Init(&uart);



	tim2.Instance = TIM2;
	tim2.Init.Period = 1000 - 1;
	tim2.Init.Prescaler = 8000 - 1;
	tim2.Init.ClockDivision = 0;
	tim2.Init.CounterMode = TIM_COUNTERMODE_UP;
	tim2.Init.RepetitionCounter = 0;
	tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	HAL_TIM_Base_Init(&tim2);

	HAL_NVIC_EnableIRQ(TIM2_IRQn);
	HAL_TIM_Base_Start_IT(&tim2);

	while (1)
	{
		if(status == 1)
		{
			send_string("Hello world!\r\n");
			status = 0;
		}
	}
}

Kod ten drukuję napis co 1s. Ustawiam sobie flagę w przerwaniu i działa wszystko w porządku. 
Jak zrobić tak działający program bez ustawania flag w przerwaniu? Wysyłanie napisu w samym przerwaniu nie jest rozwiązaniem, bo jeżeli co sekundę trzeba na przykład odświeżyć wyświetlacz OLED, to rozwiązanie takie będzie zabronione. 

Dodam, że usłyszałem opinie, że ustawianie flag jest nieeleganckie, wręcz błędne. 

Proszę o jakąś podpowiedź.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 124 wizyt
0 głosów
0 odpowiedzi 32 wizyt
pytanie zadane 14 grudnia 2018 w C i C++ przez Karol Matusiewicz Nowicjusz (200 p.)
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 2 czerwca 2016 w C i C++ przez Squidy Bywalec (2,310 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.Przycisk code

59,199 zapytań

104,616 odpowiedzi

216,478 komentarzy

31,592 pasjonatów

Przeglądających: 155
Pasjonatów: 4 Gości: 151

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...