clear sky . 2024-02-12 12:10 采纳率: 25%
浏览 10
已结题

freertos任务执行时间

img

img

task0和task1两个任务内容一样,为什么执行之间差别如此之大?
请各位帮瞧瞧

完整代码如下:

 #include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "freertos.h"

#include "task.h"
#include "queue.h"
#include "usart.h"

QueueHandle_t myQueueHandler;
TaskHandle_t myTaskHandle0;
TaskHandle_t myTaskHandle1;
TaskHandle_t myTaskHandle2;
 int tasksign0=0,tasksign1=0,tasksign2=0;

static void MyTask0(void* arg);
static void MyTask2(void* arg);
static void MyTask1(void* arg);        
volatile int count0=0,count1=0;
    
int main(void)
{
    USART_Config();
    myQueueHandler=xQueueCreate(2,20);        

    xTaskCreate(MyTask0,"myTask0",128,NULL,2,&myTaskHandle0);    
    xTaskCreate(MyTask1,"myTask1",128,NULL,2,&myTaskHandle1);
    xTaskCreate(MyTask2,"myTask2",128,NULL,2,&myTaskHandle2);
    vTaskStartScheduler();

    while (1)
    {        
        
        
        
        
        

    }
}

static void MyTask0(void* arg)
{           
        const char data0[20]="myTask0 running";
        while(1){
            tasksign0=1;tasksign1=0;tasksign2=0;
            xQueueSend(myQueueHandler,data0,0);
            vTaskDelay(20);
        }
}

static void MyTask1(void* arg)
{
        const char data1[20]="myTask1 running";
        while(1){    
            tasksign0=0;tasksign1=1;tasksign2=0;
            xQueueSend(myQueueHandler,data1,0);
            vTaskDelay(20);
        }
}

static void MyTask2(void* arg){
    char data_show[20]={0};
    BaseType_t xStatus;
        while(1){
            tasksign0=0;tasksign1=0;tasksign2=1;
            xStatus=xQueueReceive(myQueueHandler,data_show,portMAX_DELAY);
            if(xStatus==pdTRUE){
            //taskENTER_CRITICAL(); 
            printf("%s,count0=%d,count1=%d\n",data_show,count0,count1);
            }
            //taskEXIT_CRITICAL();
            else{
                printf("queue error");
            }
        }                
}

  • 写回答

12条回答 默认 最新

  • 极客智能体-在线 2024-02-12 14:43
    关注

    该回答参考自GPT-4,由极客智能体(内测)编写:

    您在FreeRTOS中遇到的问题是,两个执行相同操作的任务(MyTask0MyTask1)之间存在执行时间上的差异。首先,需要注意的是,任务的执行时间可能受多种因素的影响,包括任务的优先级、系统的任务调度策略、任务间的同步机制,以及任何可能的资源竞争和阻塞等。

    在您提供的代码和逻辑分析器的输出中,可以观察到以下几点:

    1. 任务MyTask0MyTask1 的优先级相同(都是2),这意味着它们将轮流运行。
    2. 两个任务轮流向队列发送数据,发送间隔为20个时钟周期。
    3. 任务 MyTask2 从队列接收数据并打印出来。

    为了解决执行时间差异的问题,我将按照您的要求逐步分析并给出解决方案:

    详细完整的回答

    差异的主要原因可能是任务切换的开销、队列操作的延迟或是由于调试输出(如printf)造成的延迟。特别是,printf 可能会产生较大的延迟,因为它通常涉及串行输出,这在嵌入式系统中是一个低速操作。

    严格使用中文回答

    这个解释和后续的解决方案都将使用中文。

    深入分析问题

    我们需要检查xQueueSendxQueueReceive函数调用的行为,确认它们是否有任何阻塞或延迟行为,以及是否有必要的互斥操作,如任务锁。

    明确解决方案

    针对可能的问题,我们可以考虑以下解决方案:

    • 检查串行输出是否影响任务执行时间。尝试减少或去除printf调用,看看是否有改进。
    • 确保任务和队列的优先级设置正确,避免优先级反转问题。
    • 考虑增加队列长度,防止队列满时的阻塞。
    • 分析任务间的同步机制,确保没有不必要的竞争条件或死锁。

    自主搜索解决方案

    由于本次回答是单方面的,我将根据我的知识和经验,而不是搜索来提供解决方案。

    坚持问题导向

    我提供的解决方案将专注于解决您遇到的执行时间差异问题。

    精准定位问题

    从您提供的代码和逻辑分析器的输出来看,执行时间差异的关键点可能在于xQueueSendvTaskDelay的调用。

    使用Markdown标记引用

    由于没有外部链接或引用,此部分不适用。

    代码生成与结构化

    以下是您可以尝试的代码修改大纲:

    • 去除或减少printf的调用。
    • 检查队列操作是否正确,没有返回错误。
    • 确保没有其他中断或后台任务影响您的任务。

    根据大纲,这里是一个简化的代码例子:

    static void MyTask0(void* arg) {
        const char data0[20] = "myTask0 running";
        while (1) {
            tasksign0 = 1; tasksign1 = 0; tasksign2 = 0;
            xQueueSend(myQueueHandler, data0, 0);
            vTaskDelay(20);
        }
    }
    
    static void MyTask1(void* arg) {
        const char data1[20] = "myTask1 running";
        while (1) {
            tasksign0 = 0; tasksign1 = 1; tasksign2 = 0;
            xQueue![img](https://userblink.csdnimg.cn/direct/f5c808da4ce4454f81953382df300e54.png)
    
    
    > 如果该回答解决了您的问题,请采纳!如果没有,请参考以上方案指南进行修订
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 修改了问题 2月12日
  • 赞助了问题酬金15元 2月12日
  • 展开全部

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵