zhangyada 发表于 2019-3-4 11:44:30

freertos任务创建的问题

小白刚刚接触freertos,想问一下就创建任务而言,每一个任务分配的内存是多大才好,怎么计算呢?
另外,每个任务的执行周期怎么确定?在任务里面放延时函数吗?

Kevin201707 发表于 2019-3-4 13:17:41

堆栈大小跟任务对应的变量数据有关,可以看看map文件在分配。每个任务的执行周期会受很多因素影响,尤其是其他任务的优先级及任务数量影响。

edmundlee 发表于 2019-3-22 22:51:52

栈空间跟你任用了多少局部变量有关, 任务中再调用其它函数也要计算。
任务里放延迟函数是很经常, 但别误会, 这延迟函数不是你在学校里那种死循环的延迟函数, 而是系统自带的延迟函数。

xiaojie0513 发表于 2019-3-23 07:49:00

参考http://blog.csdn.net/jiejiemcu/article/details/87174666

xiaojie0513 发表于 2019-3-23 07:50:35

首先,一般人计算任务栈是很难计算的,一般使用FreeRTOS提供的统计去统计任务栈使用最坏的情况每个任务都独立维护自己的栈空间, 任务栈空间总量在任务创建时进行设定。uxTaskGetStackHighWaterMark()主要用来查询指定任务的运行历史中, 其栈空间还差多少就要溢出。这个值被称为栈空间的High Water Mark。
函数原型:

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )

想要使用它,需要将对应的宏定义打开:INCLUDE_uxTaskGetStackHighWaterMark

函数描述:
      
参数 说明
xTask 被查询任务的句柄如果传入 NULL 句柄,则任务查询的是自身栈空间的高水线
返回值 任务栈空间的实际使用量会随着任务执行和中断处理过程上下浮动。uxTaskGetStackHighWaterMark()返回从任务启动执行开始的运行历史中,栈空间具有的最小剩余量。这个值即是栈空间使用达到最深时的剩下的未使用的栈空间。这个值越是接近 0,则这个任务就越是离栈溢出不远。

如果不知道怎么计算任务栈大小,就使用这个函数进行统计一下,然后将任务运行时最大的栈空间作为任务栈空间的80%大小即可。即假设统计得到的任务栈大小为常量 A ,那么在创建线程的时候需要 X 大小的空间,那么 X * 80% = A,算到的 X 作为任务栈大小就差不多了。



页: [1]
查看完整版本: freertos任务创建的问题