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灯就可以进行闪烁。

测试代码已上传

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