十一 freertos任务栈大小测试打印任务状态
#include <stdio.h>
#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;
#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 任务栈开始:%d\n",(int)uxTaskGetStackHighWaterMark(NULL));
while (1) {
Board_UARTPutSTR("FreeRTOS 动态创建任务\n");
printf("userKey 按下挂起任务, upKey按下恢复任务\n");
printf("vUART_Task 任务栈剩余:%d\n",(int)uxTaskGetStackHighWaterMark(NULL));
vTaskDelay(1000);
}
}
static void vKEY_task(void* pvParameters)
{
uint8_t pcWriteBuffer[200];
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)
{
switch(key2)
{
case 1:
{
printf("KEY1挂起任务LED\r\n");
vTaskSuspend(LED1_Task_Handle);
vTaskSuspend(UART_Task_Handle);
}break;
case 2:
{
printf("KEY2恢复任务LED\r\n");
vTaskResume(LED1_Task_Handle);
vTaskResume(UART_Task_Handle);
}break;
case 3:
{
printf("=================================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
}break;
default:break;
}
key2=0;
}
}
}
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*4,
NULL,
(tskIDLE_PRIORITY + 1UL),
(TaskHandle_t *) &KEY_Task_Handle);
if(pdPASS==xReturn)
{
printf("创建LED_Task任务成功\r\n");
}
taskEXIT_CRITICAL();
}
int main(void)
{
prvSetupHardware();
Board_UARTPutSTR("LPC824 FreeRTOS 任务管理\n\r");
printf("Key按下挂起任务,Key按下恢复任务\r\n");
AppTaskCreate();
vTaskStartScheduler();
while (1) {
printf("FreeRTOS 运行失败\n\r");
}
}