【发布时间】:2018-07-02 22:34:33
【问题描述】:
1.简介
我似乎无法找到有关 FreeRTOS 任务中以下函数之间行为差异的信息或详细说明:
- vTaskDelay
- _delay_ms
2。代码
假设你有以下代码:
IdleHook + 任务创建
Long value = 0;
void vApplicationIdleHook( void ) {
while(1)
{
// empty
}
}
int main(void)
{
xTaskCreate(TaskIncrement, (const portCHAR *)"up" , 256, NULL, 2, NULL );
xTaskCreate(TaskDecrement, (const portCHAR *)"down" , 256, NULL, 1, NULL );
vTaskStartScheduler();
}
具有 vTaskDelay 的任务
static void TaskDecrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value--;
//semaphore give
}
vTaskDelay(100);
}
}
static void TaskIncrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value++;
//semaphore give
}
vTaskDelay(100);
}
}
具有 _delay_ms 的任务
static void TaskDecrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value--;
//semaphore give
}
_delay_ms(100);
}
}
static void TaskIncrement(void *param)
{
while(1)
{
for(unsigned long i=0; i < 123; i++) {
//semaphore take
value++;
//semaphore give
}
_delay_ms(100);
}
}
3.问题
当为任务提供 vTaskDelay 与 _delay_ms 时,程序流程会发生什么?
注意:给定的两个示例任务具有不同的优先级。
【问题讨论】:
标签: c multithreading scheduling avr freertos