栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

10 freertos任务-任务栈大小测试

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

10 freertos任务-任务栈大小测试

十 Freertos任务栈大小测试
#include 
#include "board.h"
#include "led.h"
#include "key.h"

#include "uart.h"



const uint32_t OscRateIn = MAIN_OSC_XTAL_FREQ_HZ;				 
const uint32_t ExtRateIn = EXT_CLOCK_IN_FREQ_HZ;				 
 //系统复位
#define	System_restart	(LPC_SWM->PINENABLE0 = 0xffffffffUL)



#include "FreeRTOSConfig.h"

#include "FreeRTOS.h"
#include "task.h"



	
static TaskHandle_t LED1_Task_Handle= NULL;	
static TaskHandle_t UART_Task_Handle= NULL;	
static TaskHandle_t KEY_Task_Handle = NULL;	
static xTaskHandle  pv_handle = NULL;

#define TASK_STACK_SIZE 32



static void prvSetupHardware(void)
{

	SystemCoreClockUpdate();

	DEBUGINIT();
	led_Init() ;	
	Key_INIT();


	Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "n");

}




static void vLED1_Task (void *pvParameters)
{
	bool LedState = false;
	u8 i=0;
	while (1) {
		
		LedState = (bool) !LedState;
		for(i=0;i<8;i++)
		{
			Board_LED_Set(i, LedState);
			
		}
		vTaskDelay(500);
		
	}
}
static void vUART_Task (void *pvParameters)
{

	//栈剩余检测
	printf("vUART_Task 任务栈开始:%dn",(int)uxTaskGetStackHighWaterMark(NULL));
	while (1) {

		Board_UARTPutSTR("FreeRTOS 动态创建任务n");
		printf("userKey 按下挂起任务, upKey按下恢复任务n");
		printf("vUART_Task 任务栈剩余:%dn",(int)uxTaskGetStackHighWaterMark(NULL));
		vTaskDelay(1000);


	}
}
static void vKEY_task(void* pvParameters)
{
	u8 key2=0;
	while(1)
	{
		u8 key=0;
		if(Scan_Key())
			vTaskDelay(20);
		else continue;
		if(!Scan_Key())continue;
		else
		{
			key=Scan_Key();
			key2=key;
		}
		
		while(Scan_Key()){};//等按键抬起
		if(key2)
		{
			if(1==key2)
			{
				printf("KEY1挂起任务LEDrn");
				vTaskSuspend(LED1_Task_Handle);
				vTaskSuspend(UART_Task_Handle);
			}
			if(2==key2)
			{
				printf("KEY2恢复任务LEDrn");
				vTaskResume(LED1_Task_Handle);
				vTaskResume(UART_Task_Handle);
			}
			key2=0;
		}
		

			
	}
}

void stack_overflow_cat(void *param)
{

    for(;;)
    {
        printf("stack:%dn",(int)uxTaskGetStackHighWaterMark(pv_handle));
        vTaskDelay(500);
    }

}


static void AppTaskCreate()
{
	baseType_t xReturn=pdPASS;
	
	taskENTER_CRITICAL();//进入临界区,禁止中断打断
//	
 
	xReturn=xTaskCreate(vLED1_Task, 
						"vLED1_Task",
						TASK_STACK_SIZE, 
						NULL, 
						(tskIDLE_PRIORITY + 1UL),
						(TaskHandle_t *) &LED1_Task_Handle);

	xReturn=xTaskCreate(vUART_Task, 
						"vUART_Task",
						TASK_STACK_SIZE+32, 
						NULL, 
						(tskIDLE_PRIORITY + 1UL),
						&UART_Task_Handle);
	
	xReturn=xTaskCreate(vKEY_task, 
						"vKEY_task",
						TASK_STACK_SIZE*2, 
						NULL, 
						(tskIDLE_PRIORITY + 1UL),
						(TaskHandle_t *) &KEY_Task_Handle);
				
	if(pdPASS==xReturn)
	{
		printf("创建LED_Task任务成功rn");
	}	

	//任务栈测试
	if(xTaskCreate(stack_overflow_cat, "stack_overflow_cat", 512, NULL,1, NULL) != pdPASS){
        printf("[%s] stack_overflow errorn",__func__);
    }
	
	
//	 vTaskDelete(LED1_Task_Handle);//删除AppTaskCreate任务
//	 vTaskDelete(UART_Task_Handle);//删除AppTaskCreate任务

	
	taskEXIT_CRITICAL(); //退出临界区
	

}


int main(void)
{
	
	prvSetupHardware();
	Board_UARTPutSTR("LPC824 FreeRTOS 任务管理nr");
	printf("Key按下挂起任务,Key按下恢复任务rn");

	AppTaskCreate();
	vTaskStartScheduler();//任务调度

	
	
	
	while (1) {
			printf("FreeRTOS 运行失败nr");
 	}
	
	
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691644.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号