由於可能創建很多個線程,線程互相通信,因此,我們將線程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燈就可以進行閃爍。
測試代碼已上傳