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

标签 c stm32 freertos

我在基于 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 相同的行中调用读取方法,也来自不同的任务:

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 个任务同时使用它)。处理它的一种方法是简单地使用信号量/互斥锁,或者最好(如果可能的话)只有一个任务可以访问此外围设备,干净的设计是可维护系统的关键。

关于c - STM32 - 从多个任务中读取 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48022981/

相关文章:

c - 如果字符不等于则简单

c - STM32F103处理嵌套中断的优先级

c - STM32F103如何使用ENC28j60

git - CMSIS 库是否应该包含在版本控制中?

c++ - 如何使用 vApplicationTickHook() 函数测量 freeRTOS 中的任务执行时间?

c编程部门没有按预期表现

c - 如何读取平面文件并将数据放入相应的变量

c - gcc 使用 -Os 生成大小为 0 的二进制文件

c - freeRTOS 中的软件中断

c++ - MySQL C++ 连接器是否比 MySQL C API 慢?