STM32/STM8技术论坛
直播中

modestaction

8年用户 220经验值
擅长:嵌入式技术 处理器/DSP 控制/MCU
私信 关注
[资料]

【STM32F1 FreeRTOS】1 任务创建和删除实验


堆:顺序随意
栈:先进后出
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。


创建任务
  1. //创建开始任务
  2.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  3.                 (const char*    )"start_task",          //任务名称
  4.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  5.                 (void*          )NULL,                  //传递给任务函数的参数
  6.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  7.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  8.     vTaskStartScheduler();          //开启任务调度
  9. }

//开始任务任务函数
  1. void start_task(void *pvParameters)
  2. {
  3.     taskENTER_CRITICAL();           //进入临界区
  4.     //创建TASK1任务
  5.     xTaskCreate((TaskFunction_t )task1_task,            
  6.                 (const char*    )"task1_task",           
  7.                 (uint16_t       )TASK1_STK_SIZE,        
  8.                 (void*          )NULL,                  
  9.                 (UBaseType_t    )TASK1_TASK_PRIO,        
  10.                 (TaskHandle_t*  )&Task1Task_Handler);   
  11.     //创建TASK2任务
  12.     xTaskCreate((TaskFunction_t )task2_task,     
  13.                 (const char*    )"task2_task",   
  14.                 (uint16_t       )TASK2_STK_SIZE,
  15.                 (void*          )NULL,
  16.                 (UBaseType_t    )TASK2_TASK_PRIO,
  17.                 (TaskHandle_t*  )&Task2Task_Handler);
  18.     vTaskDelete(StartTask_Handler); //删除开始任务
  19.     taskEXIT_CRITICAL();            //退出临界区
  20. }

任务1,当任务2运行,执行5次,删除任务2,再执行5次,删除任务2。
  1. //task1任务函数
  2. void task1_task(void *pvParameters)
  3. {
  4.         u8 task1_num=0;
  5.        
  6.         POINT_COLOR = BLACK;

  7.         LCD_DrawRectangle(5,110,115,314);         //画一个矩形       
  8.         LCD_DrawLine(5,130,115,130);                //画线
  9.         POINT_COLOR = BLUE;
  10.         LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
  11.         while(1)
  12.         {
  13.                 task1_num++;        //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
  14.                 LED0=!LED0;
  15.                 printf("任务1已经执行:%d次rn",task1_num);
  16.                 if(task1_num==5)
  17.                 {
  18.                         if(Task2Task_Handler != NULL)                //任务2是否存在?       
  19.                         {
  20.                                 vTaskDelete(Task2Task_Handler);        //任务1执行5次删除任务2
  21.                                 Task2Task_Handler=NULL;                        //任务句柄清零
  22.                                 printf("任务1删除了任务2!rn");
  23.                         }
  24.                 }
  25.                 LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
  26.                 LCD_ShowxNum(86,111,task1_num,3,16,0x80);        //显示任务执行次数
  27.         vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍       
  28.         }
  29. }

  30. //task2任务函数
  31. void task2_task(void *pvParameters)
  32. {
  33.         u8 task2_num=0;
  34.        
  35.         POINT_COLOR = BLACK;

  36.         LCD_DrawRectangle(125,110,234,314); //画一个矩形       
  37.         LCD_DrawLine(125,130,234,130);                //画线
  38.         POINT_COLOR = BLUE;
  39.         LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
  40.         while(1)
  41.         {
  42.                 task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  43.         LED1=!LED1;
  44.                 printf("任务2已经执行:%d次rn",task2_num);
  45.                 LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数
  46.                 LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
  47.         vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍       
  48.         }
  49. }




















回帖(1)

钰轩

2017-8-22 10:42:55
希望多更新一点
举报

更多回帖

发帖
×
20
完善资料,
赚取积分