STM32 - 从多个任务中读取I / O.

问题描述 投票:1回答:2

我在基于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;
}

今天我用这种方式,但想知道它是否是最好的(更安全)方式!

c stm32 freertos
2个回答
2
投票

根据您提供的内容,您可以同时调用的函数似乎只是读取内容而不是编写它们。所以你很高兴。即使你在写东西,如果它是局部变量,也没关系(每个任务都有自己的副本)

在编写全局变量或向某些外设写入内容时,您需要关心同步(例如,串行闪存芯片,您不希望同时使用2个任务)。处理它的一种方法是使用信号量/互斥量,或者最好(如果可能的话)只有1个任务可以访问这个外设,干净的设计是可维护系统的关键。


1
投票

这取决于功能。

您的函数不会更改任何全局变量,因此从不同的任务中调用它们应该是安全的。

例如,如果你有函数写入全局变量,例如。缓冲区,第二次调用将覆盖第一次调用所做的更改。如果缓冲区用于发送数据,则任务可以(取决于时间)发送相同的字节。

© www.soinside.com 2019 - 2024. All rights reserved.