Kam*_*fel 1 c multithreading avr scheduling freertos
1.简介
我似乎无法找到有关FreeRTOS任务中以下函数之间行为差异的信息或详细解释:
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();
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用_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);
}
}
Run Code Online (Sandbox Code Playgroud)
3.问题
当任务提供vTaskDelay与_delay_ms时,程序流程会发生什么?
注意:两个给定的示例任务具有不同的优先级.
来自https://www.freertos.org/Documentation/FreeRTOS_Reference_Manual_V10.0.0.pdf:
将调用vTaskDelay()的任务置于Blocked状态,以获得固定数量的tick中断.指定零滴答的延迟时间不会导致调用任务进入阻塞状态,但会导致调用任务产生任何共享其优先级的就绪状态任务.调用vTaskDelay(0)等同于调用taskYIELD().
我认为你已经有了这个想法,但是如果你创建了多个任务,那么vTaskDelay()将运行任务置于指定数量的节拍中断(不是毫秒!)的"阻塞"状态,并允许具有下一个最高优先级的任务运行直到它产生控制(或被取代,取决于你的FreeRTOS配置).
我不认为它_delay_ms()是FreeRTOS库的一部分.您确定它不是特定于平台的功能吗?我的猜测是,如果优先级最高的任务调用_delay_ms(),则会导致忙碌等待.否则,具有更高优先级的任务可以抢占调用的任务,_delay_ms()因为它正在延迟(即,_delay_ms()不会立即产生控制).
也许对上述内容的更好总结:在多任务应用程序中,_delay_ms()不是确定性的.