基于freertos的xTaskUntilDelay函数问题解析
来源:互联网 发布:地面站软件下载 编辑:程序博客网 时间:2024/06/06 01:13
具体定义三个任务:
1.任务一,任务优先级默认定义为6,每taskDelayUntil(500)输出一次字符串并输出一次本函数运行次数。
2.任务二,任务优先级默认定义为7,每taskDelayUntil(10000)修改一次任务一的任务优先级,设置为6或者4(相当于任务一是否能得到运行的开关)
3.任务三,任务优先级默认定义为5,里面就一个while(1)空循环,为了使得任务一被设置为优先级为4的时候,不给任务一运行权限。
代码如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "led.h"
#define StackDepth 120
TaskHandle_t LED_TASK_HANDLE;
TaskHandle_t UART_TASK_HANDLE;
TaskHandle_t TASK_HANDLE;
void LED_TASK(void *para)
{
TickType_t m;
u8 f=0;
int i=0;
m=xTaskGetTickCount();
while(1)
{
i++;
if(f==0)
{
printf("LED is on!\r\n");
LED0=!LED0;
f=1;
}
else
{
printf("LED is off!\r\n");
LED1=!LED1;
f=0;
}
printf("LED has cycled %d times!\r\n",i);
printf("LED'priority is%d!!\r\n",(u8)uxTaskPriorityGet(NULL));
vTaskDelayUntil(&m, pdMS_TO_TICKS(1000));
}
vTaskDelete(NULL);
}
void UART_TASK(void *para)
{
TickType_tm=xTaskGetTickCount();
u8 f=0;
while(1)
{
if(f==0)
{
f=1;
vTaskPrioritySet(LED_TASK_HANDLE,4);
printf("LED has beenstopped!\r\n");
}
else if(f==1)
{
f=0;
vTaskPrioritySet(LED_TASK_HANDLE,6);
printf("LED has beenstarted!\r\n");
}
vTaskDelayUntil(&m, pdMS_TO_TICKS(10000));
}
vTaskDelete(NULL);
}
void TASK(void *para)
{
u8 i=0;
while(1)
{
i=0;
}
vTaskDelete(NULL);
}
int main(void)
{
uart_init(115200);
LED_Init();
xTaskCreate( (TaskFunction_t) LED_TASK,
"LED_TASK",
StackDepth,
NULL,
6,
&LED_TASK_HANDLE );
xTaskCreate( (TaskFunction_t) UART_TASK,
"UART_TASK",
StackDepth,
NULL,
7,
&UART_TASK_HANDLE );
xTaskCreate( (TaskFunction_t) TASK,
"TASK",
StackDepth,
NULL,
5,
&TASK_HANDLE );
vTaskStartScheduler();
}
然而,运行结果如下:
LED has been stopped![2017-12-1611:40:25.518]
LED has been started![2017-12-1611:40:35.542]
LED is on![2017-12-16 11:40:35.542]
LED has cycled 1 times![2017-12-1611:40:35.542]
LED'priority is 6!![2017-12-1611:40:35.542]
LED is off![2017-12-16 11:40:36.520]
LED has cycled 2 times![2017-12-1611:40:36.520]
LED'priority is 6!![2017-12-1611:40:36.524]
LED is on![2017-12-16 11:40:37.554]
LED has cycled 3 times![2017-12-1611:40:37.554]
LED'priority is 6!![2017-12-16 11:40:37.554]
LED is off![2017-12-16 11:40:38.543]
LED has cycled 4 times![2017-12-1611:40:38.543]
LED'priority is 6!![2017-12-1611:40:38.543]
LED is on![2017-12-16 11:40:39.521]
LED has cycled 5 times![2017-12-1611:40:39.521]
LED'priority is 6!![2017-12-16 11:40:39.521]
LED is off![2017-12-16 11:40:40.524]
LED has cycled 6 times![2017-12-1611:40:40.524]
LED'priority is 6!![2017-12-1611:40:40.524]
LED is on![2017-12-16 11:40:41.522]
LED has cycled 7 times![2017-12-1611:40:41.522]
LED'priority is 6!![2017-12-1611:40:41.522]
LED is off![2017-12-16 11:40:42.521]
LED has cycled 8 times![2017-12-1611:40:42.521]
LED'priority is 6!![2017-12-1611:40:42.521]
LED is on![2017-12-16 11:40:43.522]
LED has cycled 9 times![2017-12-1611:40:43.522]
LED'priority is 6!![2017-12-1611:40:43.522]
LED is off![2017-12-16 11:40:44.526]
LED has cycled 10 times![2017-12-1611:40:44.526]
LED'priority is 6!![2017-12-1611:40:44.526]
LED has been stopped![2017-12-1611:40:45.520]
LED has been started![2017-12-1611:40:55.520]
LED is on![2017-12-16 11:40:55.520]
LED has cycled 11 times![2017-12-1611:40:55.520]
LED'priority is 6!![2017-12-1611:40:55.520]
LED is off![2017-12-16 11:40:55.532]
LED has cycled 12 times![2017-12-1611:40:55.532]
LED'priority is 6!![2017-12-16 11:40:55.532]
LED is on![2017-12-16 11:40:55.532]
LED has cycled 13 times![2017-12-1611:40:55.532]
LED'priority is 6!![2017-12-1611:40:55.532]
LED is off![2017-12-16 11:40:55.542]
LED has cycled 14 times![2017-12-1611:40:55.542]
LED'priority is 6!![2017-12-16 11:40:55.542]
LED is on![2017-12-16 11:40:55.542]
LED has cycled 15 times![2017-12-1611:40:55.542]
LED'priority is 6!![2017-12-1611:40:55.551]
LED is off![2017-12-16 11:40:55.551]
LED has cycled 16 times![2017-12-1611:40:55.551]
LED'priority is 6!![2017-12-1611:40:55.551]
LED is on![2017-12-16 11:40:55.551]
LED has cycled 17 times![2017-12-1611:40:55.551]
LED'priority is 6!![2017-12-1611:40:55.557]
LED is off![2017-12-16 11:40:55.557]
LED has cycled 18 times![2017-12-1611:40:55.564]
LED'priority is 6!![2017-12-1611:40:55.564]
LED is on![2017-12-16 11:40:55.564]
LED has cycled 19 times![2017-12-1611:40:55.564]
LED'priority is 6!![2017-12-1611:40:55.572]
LED is off![2017-12-16 11:40:55.572]
LED has cycled 20 times![2017-12-1611:40:55.572]
LED'priority is 6!![2017-12-1611:40:55.572]
LED is on![2017-12-16 11:40:55.578]
LED has cycled 21 times![2017-12-1611:40:55.578]
LED'priority is 6!![2017-12-1611:40:55.578]
LED is off![2017-12-16 11:40:56.553]
LED has cycled 22 times![2017-12-16 11:40:56.553]
LED'priority is 6!![2017-12-1611:40:56.553]
LED is on![2017-12-16 11:40:57.525]
LED has cycled 23 times![2017-12-1611:40:57.525]
LED'priority is 6!![2017-12-1611:40:57.525]
请看红色标注部分,相当于瞬间,任务一瞬间运行了10次,与我设置的逻辑出错,
出错部分,1.应该是间隔500ms
2.应该优先级为4,低于任务三的优先级5,不该被执行
3.而且瞬间十次的优先级检测为都为6
在观察xTaskUntilDelay函数的过程中,,发现xTimeToWake = *pxPreviousWakeTime +xTimeIncrement;唤醒时间只根据上一次唤醒时间,以及时间间隔有关,假设在1s时间点我把函数xTaskUntilDelay100ms,同时把该任务优先级调低使其无法运行,等10s之后再调高他的优先级,那么下一次执行本函数的xTaskUntilDelay的时候,它默认的下次唤醒时间为1s+100ms+100ms;前面的1s+100ms是它认为的现在的时间点,后面100ms就是它认为要延时的,我们的系统时钟已经运行到了11s+100ms了,(所以出现了1s+100ms+100ms的时间点任务就自动运行了?这个是我猜测的,这样解释是可以解释的通的)
为了证明我那个解释:于是我把xTaskUntilDelay函数总的xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;修改成了xTimeToWake = xTaskGetTickCount() + xTimeIncrement;整个系统完全按照理论走,所以,初步认为我的解释是对的,如果有大神有更高见解,勿喷,请分享,谢谢!
- 基于freertos的xTaskUntilDelay函数问题解析
- 基于FreeRTOS的队列管理的应用
- 基于FreeRTOS的队列管理的应用
- 基于FreeRTOS的队列管理的应用
- 基于FreeRTOS的队列管理的应用
- FreeRTOS的队列发送源码解析
- FreeRTOS任务API函数的使用
- FreeRTOS 内存配置引起的一些问题
- 基于STM32的FREERTOS应用的几个常见问题
- FreeRTOS 全配置文件解析
- FreeRTOS任务切换解析
- FreeRTOS任务切换解析
- FreeRTOS源码解析 -> xTaskCreate()
- FreeRTOS源码解析 -> vTaskDelete()
- FreeRTOS源码解析 -> vTaskDelayUntil()
- FreeRTOS源码解析 -> vTaskSuspend
- FreeRTOS源码解析 -> vTaskStartScheduler()
- 基于Arduino Due的FreeRTOS程序设计(AtmelSAM3X8E)--第一篇
- PostgreSQL角色和权限
- Android动态申请权限
- 读入读出优化
- JDBC Java数据库连接 1 2017年12月19日 22:37:42
- bzoj 1562: [NOI2009]变换序列 二分图最大匹配
- 基于freertos的xTaskUntilDelay函数问题解析
- 探索 ConcurrentHashMap 高并发性的实现机制
- 希尔排序,选择排序,插入排序 java
- Win10与ubuntu双系统,卸载ubuntu后,出现no such partition 后的修复办法
- 【java基础:JDBC】基于DPCP连接池工具包和DBUtils工具包的数据库改查Demonstration
- Android GUI系统-ViewTree的创建(二)
- 正则表达式(Java版整理)
- 这是我的第一篇博客,以后要积极更新哦
- Mysql 充电站SQL查询1--171221--mysql-sql