消息队列创建及运行,参阅安富莱电子demo
static QueueHandle_t xQueue1 = NULL;
static QueueHandle_t xQueue2 = NULL;
typedef struct Msg
{
uint8_t ucMessageID;
uint16_t usData[2];
uint32_t ulData[2];
}MSG_T;
MSG_T g_tMsg;
static void vTaskTaskUserIF(void *pvParameters)
{
MSG_T *ptMsg;
uint8_t ucCount = 0;
uint8_t ucKeyCode;
uint8_t pcWriteBuffer[500];
ptMsg = &g_tMsg;
ptMsg->ucMessageID = 0;
ptMsg->ulData[0] = 0;
ptMsg->usData[0] = 0;
while(1)
{
ucKeyCode = bsp_GetKey();
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_DOWN_K1:
printf("=================================================\r\n");
printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
vTaskList((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
printf("\r\n任务名 运行计数 使用率\r\n");
vTaskGetRunTimeStats((char *)&pcWriteBuffer);
printf("%s\r\n", pcWriteBuffer);
break;
case KEY_DOWN_K2:
ucCount++;
if( xQueueSend(xQueue1,
(void *) &ucCount,
(TickType_t)10) != pdPASS )
{
printf("K2键按下,向xQueue1发送数据失败,即使等待了10个时钟节拍\r\n");
}
else
{
printf("K2键按下,向xQueue1发送数据成功\r\n");
}
break;
case KEY_DOWN_K3:
ptMsg->ucMessageID++;
ptMsg->ulData[0]++;;
ptMsg->usData[0]++;
if(xQueueSend(xQueue2,
(void *) &ptMsg,
(TickType_t)10) != pdPASS )
{
printf("K3键按下,向xQueue2发送数据失败,即使等待了10个时钟节拍\r\n");
}
else
{
printf("K3键按下,向xQueue2发送数据成功\r\n");
}
default:
break;
}
}
vTaskDelay(20);
}
}
static void vTaskLED(void *pvParameters)
{
MSG_T *ptMsg;
BaseType_t xResult;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(200);
while(1)
{
xResult = xQueueReceive(xQueue2,
(void *)&ptMsg,
(TickType_t)xMaxBlockTime);
if(xResult == pdPASS)
{
printf("接收到消息队列数据ptMsg->ucMessageID = %d\r\n", ptMsg->ucMessageID);
printf("接收到消息队列数据ptMsg->ulData[0] = %d\r\n", ptMsg->ulData[0]);
printf("接收到消息队列数据ptMsg->usData[0] = %d\r\n", ptMsg->usData[0]);
}
else
{
}
}
}
static void vTaskMsgPro(void *pvParameters)
{
BaseType_t xResult;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300);
uint8_t ucQueueMsgValue;
while(1)
{
xResult = xQueueReceive(xQueue1,
(void *)&ucQueueMsgValue,
(TickType_t)xMaxBlockTime);
if(xResult == pdPASS)
{
printf("接收到消息队列数据ucQueueMsgValue = %d\r\n", ucQueueMsgValue);
}
else
{
}
}
}
int main(void)
{
__set_PRIMASK(1);
AppTaskCreate();
xQueue1 = xQueueCreate(10, sizeof(uint8_t));
if( xQueue1 == 0 )
{
}
xQueue2 = xQueueCreate(10, sizeof(struct Msg *));
if( xQueue2 == 0 )
{
}
vTaskStartScheduler();
while(1);
}
static void TIM1_IRQHandler(void)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
g_uiCount++;
xQueueSendFromISR(xQueue1,
(void *)&g_uiCount,
&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
static void TIM2_IRQHandler(void)
{
MSG_T *ptMsg;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
ptMsg = &g_tMsg;
ptMsg->ucMessageID++;
ptMsg->ulData[0]++;
ptMsg->usData[0]++;
xQueueSendFromISR(xQueue2,
(void *)&ptMsg,
&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
STM32CubeMX 队列创建及运行
以下是普通变量队列创建和运行
注意: STM32CubeMX 生成的代码消息队列目前只能传递普通变量,如果传递结构体或者其它类型变量,最好不使用 cmsis_os.h封装好的API
void MessageQTask(void const * argument)
{
osEvent EventMessage;
for(;;)
{
EventMessage = osMessageGet (myMessageQueueIdHandle, 10);
if(EventMessage.status == osEventMessage)
{
printf("MessageGet v : %d\r\n", EventMessage.value.v);
}else{
printf("MessageGet v null\r\n");
}
osDelay(1000);
}
}
void StartDefaultTask(void const * argument)
{
int32_t count = 0;
uint8_t bits = 1;
for(;;)
{
count++;
if(count == 1)
{
count = 0;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
bits = bits + 1;
osMessagePut (myMessageQueueIdHandle, bits, 10);
}
osDelay(10);
osThreadSuspend(defaultTaskHandle);
}
}
int main(void)
{
osMessageQDef(myMessageQueueName, 10, uint8_t);
myMessageQueueIdHandle = osMessageCreate (osMessageQ(myMessageQueueName), NULL)
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(MessageQTask, MessageQTask, osPriorityHigh, 0, 128);
SignalTaskHandle = osThreadCreate(osThread(MessageQTask), NULL);
osKernelStart();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)