• 首页
  • 中国
  • STM32CubeMx之资源(线程,队列,内存池)管理

STM32CubeMx之资源(线程,队列,内存池)管理

2023-11-01 37浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

由于可能创建很多个线程,线程互相通信,因此,我们将线程ID统一存储在一个结构体中,进行管理。

资源管理结构体如下:

typedef struct resource{

uint8_t initialized;

uint8_t id;

osThreadId led_thread;

uint8_t led_initialized;

}_resource_t;

获取资源结构体的实例

resource_t resource_instance[RESOURCE_ID_MAX] = {0};

static void ledThread(const void * arg);

resource_t create(resource_ids_t id)

{

resource_t this;

if(id >= RESOURCE_ID_MAX || resource_instance[id] )

{

return NULL;

}

this = (resource_t)pvPortMalloc(sizeof(_resource_t));

if(!this)

{

return NULL;

}

resource_instance[id] = this;

memset(this, 0, sizeof(_resource_t));

this->initialized++;

this->id = id;

#define STACKSIZE configMINIMAL_STACK_SIZE

//创建线程,并且resource实例统一管理led线程等

osThreadDef(ledThreadHandler, ledThread, osPriorityNormal, 0, STACKSIZE);

this->led_thread = osThreadCreate(osThread(ledThreadHandler), this);

return this;

#undef STACKSIZE

}

在之前默认的生成的线程里,创建资源管理实例

void startManageResourceTaskTask(void const * argument)

{

/* USER CODE BEGIN StartDeviceTask */

/* Infinite loop */

if(!create(RESOURCE_ID0))

{

return ;

}

vTaskDelete( NULL );

/* USER CODE END StartDeviceTask */

}

此时在创建资源管理实例的同时,就会将线程ID等保存起来,并且开启线程

static void ledThread(const void * arg)

{

resource_t res = (resource_t)arg;

led_t led0 , led1;

while(!res->initialized) //res initial

{

osDelay(10);

}

led0 = led_get_instance(LED_ID0);

led1 = led_get_instance(LED_ID1);

if(!led0 )

{

return ;

}

++res->led_initialized;

for(;;)

{

led_on(led0);

led_off(led1);

osDelay(1000);

led_off(led0);

led_on(led1);

osDelay(1000);

}

}

此时LED灯就可以进行闪烁。


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台