FreeRTOS中的队列

时间:2014-09-01 09:19:40

标签: stack freertos

我使用Freescale FRDM-KL25Z板和Codewarrior 10.6软件。我的目标是在FreeRTOS中制作小程序,它通过模拟/数字转换器(0-3,3v)从热敏电阻读取电压,并且取决于该电压,我喜欢打开/关闭LED二极管。直到我添加第二个任务和队列时,它一直对我有用。我认为问题可能是堆栈大小,但我不知道如何配置它。

代码如下:

xQueueHandle queue_led;


void TaskLed (void *p)

{

uint16_t temp_val;

    xQueueReceive(queue_led, &temp_val, 1);  

    if (temp_val<60000)
    {
        LED_1_Neg();        
    }
}

void TaskTemp (void *p)
{

    uint16_t temp_val;

    (void)AD1_Measure(TRUE);
    (void)AD1_GetValue16(&temp_val);

    xQueueSendToBack(queue_led, &temp_val, 1000);

    FRTOS1_vTaskDelay(1000);
}

main()中的代码:

  xTaskCreate(TaskLed, (signed char *)"tl", 200, NULL, 1, NULL);
  xTaskCreate(TaskTemp, (signed char *)"tt", 200, NULL, 1, NULL);
  vTaskStartScheduler();
  return(0);

2 个答案:

答案 0 :(得分:2)

任务通常是一个连续的执行线程 - 也就是说 - 它被实现为一个永远运行的无限循环。任务退出循环是非常罕见的 - 在FreeRTOS中,你不能在没有删除任务的情况下运行实现任务的函数的底部(在更新版本的FreeRTOS中,如果你尝试,你将触发断言)。因此,实现任务的功能无效。

FreeRTOS拥有出色的文档(以及一个出色的支持论坛,就此而言,这是发布此问题的更合适的地方)。您可以在此处查看应如何编写任务:http://www.freertos.org/implementing-a-FreeRTOS-task.html

在您发布的代码中,我无法看到您正在创建您尝试使用的队列。这也在FreeRTOS.org网站上有记录,下载有数百个如何做的例子。

如果是堆栈问题,Google会告诉你去这里: http://www.freertos.org/Stacks-and-stack-overflow-checking.html

答案 1 :(得分:0)

您应该创建队列,然后检查返回的值是否为零(队列是否已成功创建)