我使用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);
答案 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)
您应该创建队列,然后检查返回的值是否为零(队列是否已成功创建)