堆:顺序随意
栈:先进后出
堆和栈的区别
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
创建任务
- //创建开始任务
- xTaskCreate((TaskFunction_t )start_task, //任务函数
- (const char* )"start_task", //任务名称
- (uint16_t )START_STK_SIZE, //任务堆栈大小
- (void* )NULL, //传递给任务函数的参数
- (UBaseType_t )START_TASK_PRIO, //任务优先级
- (TaskHandle_t* )&StartTask_Handler); //任务句柄
- vTaskStartScheduler(); //开启任务调度
- }
//开始任务任务函数
- void start_task(void *pvParameters)
- {
- taskENTER_CRITICAL(); //进入临界区
- //创建TASK1任务
- xTaskCreate((TaskFunction_t )task1_task,
- (const char* )"task1_task",
- (uint16_t )TASK1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK1_TASK_PRIO,
- (TaskHandle_t* )&Task1Task_Handler);
- //创建TASK2任务
- xTaskCreate((TaskFunction_t )task2_task,
- (const char* )"task2_task",
- (uint16_t )TASK2_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK2_TASK_PRIO,
- (TaskHandle_t* )&Task2Task_Handler);
- vTaskDelete(StartTask_Handler); //删除开始任务
- taskEXIT_CRITICAL(); //退出临界区
- }
任务1,当任务2运行,执行5次,删除任务2,再执行5次,删除任务2。
- //task1任务函数
- void task1_task(void *pvParameters)
- {
- u8 task1_num=0;
-
- POINT_COLOR = BLACK;
- LCD_DrawRectangle(5,110,115,314); //画一个矩形
- LCD_DrawLine(5,130,115,130); //画线
- POINT_COLOR = BLUE;
- LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
- while(1)
- {
- task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
- LED0=!LED0;
- printf("任务1已经执行:%d次rn",task1_num);
- if(task1_num==5)
- {
- if(Task2Task_Handler != NULL) //任务2是否存在?
- {
- vTaskDelete(Task2Task_Handler); //任务1执行5次删除任务2
- Task2Task_Handler=NULL; //任务句柄清零
- printf("任务1删除了任务2!rn");
- }
- }
- LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域
- LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数
- vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
- }
- }
- //task2任务函数
- void task2_task(void *pvParameters)
- {
- u8 task2_num=0;
-
- POINT_COLOR = BLACK;
- LCD_DrawRectangle(125,110,234,314); //画一个矩形
- LCD_DrawLine(125,130,234,130); //画线
- POINT_COLOR = BLUE;
- LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
- while(1)
- {
- task2_num++; //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
- LED1=!LED1;
- printf("任务2已经执行:%d次rn",task2_num);
- LCD_ShowxNum(206,111,task2_num,3,16,0x80); //显示任务执行次数
- LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域
- vTaskDelay(1000); //延时1s,也就是1000个时钟节拍
- }
- }