gzlai 发表于 2024-1-15 17:08:10

FreeRTOS变量疑问咨询



不懂就问:我需要声明比较多变量(假如100个),是不是在任务函数外面声明变量(这些变量只是该任务会使用到)可以减少任务切换的开销?这样做主要有哪些弊端?

任务函数内声明:

portTASK_FUNCTION(vTestTask, pvParameters)

{
    unsigned char n1,n2,n3……n100;
    UNUSED(pvParameters);
    while(1)
    {

    }
}


任务函数外声明:
unsigned char n1,n2,n3……n100;

portTASK_FUNCTION(vTestTask, pvParameters)

{
    UNUSED(pvParameters);
    while(1)
    {

    }
}








tzz1983 发表于 2024-1-15 20:06:04

任务是RTOS的范畴, 变量申明是编绎器的范畴.

你所说的问题和减少任务切换开销没多大的关系. 和变量存储的位置有很大关系.
对于编绎器来说, 函数内声明的是局部变量,放在栈内.函数外声明的是全局变量,放在固定的位置.
编绎器不会管也不知道这个函数是不是任务. 在编绎器眼里这就是个函数

如此来分析,局部变量至少有两个好处:
1.私密性高, 别的地方访问不到.
2.使用效率高, 释放以后别的函数也可使用.(但是你这个地方有点特殊, 就是这个任务函数可能永远也不会退出,达不到省内存的目底, 但仍建议局部变量)

全局变量在多个函数或任务之间共享数据比较方便. 但是有许多缺点, 比如访问私密性不强, 函数不可重入, 内存使用效率低下等.
一般来说单个功能函数可避免使用全局变量的, 就避免.

gzlai 发表于 2024-1-15 23:16:43

tzz1983 发表于 2024-1-15 20:06
任务是RTOS的范畴, 变量申明是编绎器的范畴.

你所说的问题和减少任务切换开销没多大的关系. 和变量存储的 ...

谢谢解疑{:4_196:}
页: [1]
查看完整版本: FreeRTOS变量疑问咨询