STM32CubeMx(STM32F4 +FreeRTOS+CMSIS-RTOS)之資源(線程,隊列,內存池)管理

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

測試代碼已上傳

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章