三十九、 freertos多事件等待
#include <stdio.h>
#include <limits.h>
#include "board.h"
#include "led.h"
#include "key.h"
#include "uart.h"
#include "tim_mrt.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"
#include "event_groups.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"
static xTaskHandle LED_TaskHandle=NULL;
static xTaskHandle KEY_TaskHandle=NULL;
static xTaskHandle xHandleTaskMsgPro = NULL;
static xSemaphoreHandle Semaphore_Handle=NULL;
static xQueueHandle xQueue1 =NULL;
static xQueueHandle xQueue2 =NULL;
static xQueueSetHandle xQueueSet=NULL;
#define TASK_STACK_SIZE 32
#define QUEUE_LENGTH_1 10
#define QUEUE_LENGTH_2 10
#define BINARY_SEMAPHORE_LENGTH 1
#define ITEM_SIZE_QUEUE_1 sizeof(uint32_t)
#define ITEM_SIZE_QUEUE_2 sizeof(uint8_t)
#define COMBINED_LENGTH (QUEUE_LENGTH_1 + QUEUE_LENGTH_2 + BINARY_SEMAPHORE_LENGTH)
static void prvSetupHardware(void)
{
SystemCoreClockUpdate();
DEBUGINIT();
led_Init() ;
Key_INIT();
MRT_Init();
DEBUGOUT("%u MHz\n",SystemCoreClock/1000000);
Board_UARTPutSTR("build date: " __DATE__ " build time: " __TIME__ "\n");
}
static void LED_Task(void* parameter)
{
TickType_t xLastWakeTime;
const TickType_t xFrequency = 500;
xLastWakeTime = xTaskGetTickCount();
while(1)
{
Board_LED_Toggle(0);
vTaskDelayUntil(&xLastWakeTime, xFrequency);
}
}
static void KEY_Task(void* parameter)
{
uint8_t ulCount = 0;
u8 ucCount=0;
u8 ucKeyCode=0;
while(1)
{
u8 key=0;
if(Scan_Key())
vTaskDelay(20);
else continue;
if(!Scan_Key())continue;
else
{
key=Scan_Key();
ucKeyCode=key;
}
while(Scan_Key()){};
if(ucKeyCode)
{
switch(ucKeyCode)
{
case 1:
{
Board_LED_Toggle(6);
printf("K1键按下,直接发送同步信号给任务vTaskMsgPro\r\n");
xSemaphoreGive(Semaphore_Handle);
}break;
case 2:
{
Board_LED_Toggle(5);
ulCount++;
if( xQueueSend(xQueue1,
(void *) &ulCount,
(TickType_t)10) != pdPASS )
{
printf("K2键按下,向xQueue1发送数据失败,即使等待了10个时钟节拍\r\n");
}
else
{
printf("K2键按下,向xQueue1发送数据成功\r\n");
}
}break;
case 3:
{
ucCount++;
if( xQueueSend(xQueue2,
(void *) &ucCount,
(TickType_t)10) != pdPASS )
{
printf("K3键按下,向xQueue1发送数据失败,即使等待了10个时钟节拍\r\n");
}
else
{
printf("K3键按下,向xQueue1发送数据成功\r\n");
}
}break;
default:break;
}
ucKeyCode=0;
}
}
}
static void vTaskMsgPro(void *pvParameters)
{
QueueSetMemberHandle_t xActivatedMember;
uint32_t ulQueueMsgValue;
uint8_t ucQueueMsgValue;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300);
while(1)
{
xActivatedMember =xQueueSelectFromSet(xQueueSet,xMaxBlockTime);
if(xActivatedMember == xQueue1)
{
xQueueReceive(xActivatedMember, &ulQueueMsgValue, 0);
printf("消息队列1接收到消息 ulQueueMsgValue = %d\r\n", ulQueueMsgValue);
}
else if(xActivatedMember == xQueue2)
{
xQueueReceive(xActivatedMember, &ucQueueMsgValue, 0);
printf("消息队列2接收到消息 ucQueueMsgValue = %d\r\n", ucQueueMsgValue);
}
else if(xActivatedMember == Semaphore_Handle)
{
xSemaphoreTake(xActivatedMember, 0);
printf("接收到信号量\r\n");
}
else
{
Board_LED_Toggle(2);
}
}
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate( LED_Task,
"LED_Task",
TASK_STACK_SIZE*2,
NULL,
2,
&LED_TaskHandle);
if (pdPASS == xReturn)
printf("创建 Receive1_Task 任务成功!\r\n");
xReturn = xTaskCreate( KEY_Task,
"KEY_Task",
TASK_STACK_SIZE*4,
NULL,
1,
&KEY_TaskHandle);
if (pdPASS == xReturn)
printf("创建 KEY_Task 任务成功!\r\n");
xReturn=xTaskCreate( vTaskMsgPro,
"vTaskMsgPro",
512,
NULL,
3,
&xHandleTaskMsgPro );
if (pdPASS == xReturn)
printf("创建 vTaskMsgPro 任务成功!\r\n");
taskEXIT_CRITICAL();
}
static void AppObjCreate (void)
{
Semaphore_Handle = xSemaphoreCreateBinary();
if(NULL==Semaphore_Handle)
{
DEBUGSTR("创建信号量失败\n");
}
xQueueSet =xQueueCreateSet(COMBINED_LENGTH);
if(NULL==xQueueSet)
{
DEBUGSTR("创建QueuSet失败\n");
}
xQueue1 = xQueueCreate(QUEUE_LENGTH_1, ITEM_SIZE_QUEUE_1);
if(xQueue1 == NULL)
{
DEBUGSTR("创建信号量失败\n");
}
xQueue2 = xQueueCreate(QUEUE_LENGTH_2, ITEM_SIZE_QUEUE_2);
if(xQueue2 == NULL)
{
DEBUGSTR("创建信号量失败\n");
}
xQueueAddToSet(xQueue1, xQueueSet);
xQueueAddToSet(xQueue2, xQueueSet);
xQueueAddToSet(Semaphore_Handle, xQueueSet);
}
int main(void)
{
prvSetupHardware();
Board_UARTPutSTR("LPC824 FreeRTOS 任务通知任务间通信 \n");
DEBUGSTR("多事件等待\n");
AppTaskCreate();
AppObjCreate();
vTaskStartScheduler();
while (1) {
printf("FreeRTOS 运行失败\n\r");
}
}
void HardFault_Handler(void)
{
printf("硬件错误中断\n");
while(1)
{
}
}