【发布时间】:2023-04-09 03:30:02
【问题描述】:
我在基于 STM32F4 的开发板中使用 FreeRTOS,并且阅读了有关使用队列和信号量的任务之间的通信,易于理解和应用。
但在文档中,我没有找到任何关于是否可以安全地从不同任务调用相同方法的信息,例如:
void DefaultTask(void const * argument)
{
uint8_t pin = 10;
uint16_t analog = ADC_GetAnalog(pin);
uint32_t encoder = Encoder_GetCount(1);
}
void SecondTask(void const * argument)
{
uint8_t pin = 14;
uint16_t analog = ADC_GetAnalog(pin);
uint32_t encoder = Encoder_GetCount(2);
}
ADC_GetAnalog:
uint16_t ADC_GetAnalog(uint8_t PinNumber)
{
if((PinNumber >=1)&&(PinNumber<=18))
{
return ADC_Pin[PinNumber].AnalogValue;
}
else
return 0;
}
我的系统中还有多个编码器(增加/减少 htim# 的属性 CNT 的中断),并在与 ADC 相同的行中调用 read 方法,也来自不同的任务:
uint32_t Encoder_GetCount(uint8_t encoder_num)
{
volatile __IO uint32_t count = 0;
switch(encoder_num)
{
case 1:
count = htim1.Instance->CNT;
break;
case 2:
count = htim3.Instance->CNT;
break;
case 3:
count = htim5.Instance->CNT;
break;
default:
break;
}
return (uint32_t)count;
}
今天我使用这种方式,但想知道它是否是最好(更安全)的方式!!
【问题讨论】:
-
可重入或线程安全的概念是您可以阅读的主题,因为您本质上是在询问函数是否可重入。