由于可能创建很多个线程,线程互相通信,因此,我们将线程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灯就可以进行闪烁。
百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台