最近才开始接触RTOS,使用cubemx直接创建,只简单测试了能否跑任务,但是不清楚到底该创建多少空间。后续内容再慢慢学习(磨洋工)
记录 备忘。
#include "MyTask.h"
TaskHandle_t LED_Handle;
TaskHandle_t USART_Handle;
//存储计算未使用堆栈空间返回值
UBaseType_t uxHighWaterMark_LED;
UBaseType_t uxHighWaterMark_USART;
void CreateTask()
{
//创建任务以字为单位,32位系统1字=4字节
//LED任务为100*4个字节
xTaskCreate(LED_Task, "LED", 100, NULL, 1, &LED_Handle);
xTaskCreate(USART_Task, "USART", 256, NULL, 1, &USART_Handle);
}
void LED_Task( void *pvParameters )
{
/*
FreeRTOS.h 中将 INCLUDE_uxTaskGetStackHighWaterMark 定义为 1
uxTaskGetStackHighWaterMark 函数才可用
*/
//uxHighWaterMark_LED = uxTaskGetStackHighWaterMark( LED_Handle );
for( ;; )
{
HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(D2_GPIO_Port,D2_Pin,GPIO_PIN_SET);
osDelay(500);
//形参为NULL,则查看当前任务
uxHighWaterMark_LED = uxTaskGetStackHighWaterMark( LED_Handle );
}
}
void USART_Task( void *pvParameters )
{
for( ;; )
{
Send_Data();
osDelay(100);
uxHighWaterMark_USART=uxTaskGetStackHighWaterMark( NULL );
}
}
在debug调试中已经显示10进制格式,将返回值*4则是剩余字节。
我发现在LED程序中将 uxTaskGetStackHighWaterMark中的形参换成NULL剩余量则会减少2,不知道什么原因,在串口发送程序中则没有影响。
xPortGetFreeHeapSize()
这个函数可以获取调用时堆中空闲内存的大小,以字节为单位。使用它可以优化堆的大小。需要注意,当使用heap_3时是不能调用这个函数的。
xPortGetMinimumEverFreeHeapSize()
此函数返回FreeRTOS应用程序开始运行之后曾经存在的最小的未被分配的存储空间的字节数。它的返回值指示了应用程序离将要耗尽堆空间的接近程度。需要注意只在使用heap_4或者heap_5时生效。
size_t a;
void test_Task( void *pvParameters )
{
for( ;; )
{
a=xPortGetMinimumEverFreeHeapSize();
osDelay(200);
uxHighWaterMark_Sensor = uxTaskGetStackHighWaterMark( NULL );
}
}
还有一个uxTaskGetSystemState()函数目前暂时没有用,使用方法代码稍微多些