|
// 创建队列,指定队列长度和每个队列项的大小
queueHandle_key = xQueueCreate(15, sizeof(uint8_t));
// 创建一个任务
xTaskCreate(task_key, (const char *)"key", 128, NULL, 5, NULL);
/* 任务函数,用于处理key通讯任务*/
static void task_key(void *arg)
{
uint8_t value = 0;
while (1)
{
// 等待队列中有数据可用
if (xQueueReceive(queueHandle_key, &value, portMAX_DELAY) == pdPASS)
{
}
}
/*在中断函数里*/
void GPIOM_Handler(void)
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
uint8_t key_value = 1;
xQueueSendFromISR(queueHandle_key, &key_value, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken == pdTRUE)
{
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
遇到这样一个问题,我的最高级别任务是task_key,我在其它低级任务里用xQueueSend(queueHandle_key, &key_value, 0);传递数据给队列,在中断里用xQueueSendFromISR(queueHandle_key, &key_value, &xHigherPriorityTaskWoken);传递数据给队列这样,每当队列有数据,task_key函数就会跑,正常情况下是正常的。但是,我的这个中断函数是编码器,在疯狂转动编码器的情况下,会出现,队列满了的情况,而key任务的状态是R,但是完全没有跑(把portMAX_DELAY改成100,然后串口输出也没反应),而其它任务全部正常。剩余栈:60。也不是栈不够。优化等级也改成-0,也是不行。然后我不在中断里用xQueueSendFromISR函数,而是搞个全局变量,在其它任务里xQueueSend就不会出现这种情况。实在是不知道什么原因,所以想请教一下。。。拜托有遇到这种情况的大佬解答一二。
|
|