STM32 - 从多个任务中读取 I/O
STM32 - Read I/O from multiple Tasks
我在我的基于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;
}
我的系统中也有多个编码器(中断 increment/decrement htim# 的 属性 CNT),并在与 ADC 相同的行中调用读取方法,也来自不同的任务:
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;
}
今天我使用这种方式,但想知道它是否是最好(更安全)的方式!!
这取决于功能。
您的函数不会更改任何全局变量,因此从不同的任务调用它们应该是安全的。
例如,如果您有写入全局变量的函数,例如。缓冲区,第二次调用将覆盖第一次调用所做的更改。如果缓冲区用于发送数据,则两个任务都可以(取决于时间)发送相同的字节。
从您提供的内容来看,您的可同时调用的函数似乎只是读取内容,而不是写入内容。所以你很高兴去。即使你在写东西,如果它是局部变量,也没关系(每个任务都会有自己的副本)
当你写全局变量,或者写一些东西到某些外围设备(例如,串行闪存芯片,你不希望2个任务同时使用它)时,你需要关心同步。处理它的一种方法是简单地使用 semaphores/mutexes,或者最好(如果可能的话)只有 1 个任务可以访问此外围设备,干净的设计是可维护系统的关键。
我在我的基于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;
}
我的系统中也有多个编码器(中断 increment/decrement htim# 的 属性 CNT),并在与 ADC 相同的行中调用读取方法,也来自不同的任务:
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;
}
今天我使用这种方式,但想知道它是否是最好(更安全)的方式!!
这取决于功能。
您的函数不会更改任何全局变量,因此从不同的任务调用它们应该是安全的。
例如,如果您有写入全局变量的函数,例如。缓冲区,第二次调用将覆盖第一次调用所做的更改。如果缓冲区用于发送数据,则两个任务都可以(取决于时间)发送相同的字节。
从您提供的内容来看,您的可同时调用的函数似乎只是读取内容,而不是写入内容。所以你很高兴去。即使你在写东西,如果它是局部变量,也没关系(每个任务都会有自己的副本)
当你写全局变量,或者写一些东西到某些外围设备(例如,串行闪存芯片,你不希望2个任务同时使用它)时,你需要关心同步。处理它的一种方法是简单地使用 semaphores/mutexes,或者最好(如果可能的话)只有 1 个任务可以访问此外围设备,干净的设计是可维护系统的关键。