找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1250|回复: 1
打印 上一主题 下一主题
收起左侧

求问FreeRtos有没有某个函数可使程序的线程直接跳转

[复制链接]
跳转到指定楼层
楼主
小弟最近移植了一个FreeRtos到STM32F103CB系列的芯片中,遇到一个问题,问题如下:
{

    //创建数据发送任务
    xTaskCreate((TaskFunction_t )gsm4_task,            
                (const char*    )"gsm4_task",           
                (uint16_t       )GSM4_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )GSM4_TASK_PRIO,        
                (TaskHandle_t*  )&Gsm4Task_Handler);
                              
        //创建数据解析任务
    xTaskCreate((TaskFunction_t )gsm4_data_task,            
                (const char*    )"gsm4_data_task",           
                (uint16_t       )GSM4_DATA_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )GSM4_DATA_TASK_PRIO,        
                (TaskHandle_t*  )&gsm4_data_Task_Handler);
                              
    //创建联网任务
    xTaskCreate((TaskFunction_t )gsm4_check_task,            
                (const char*    )"gsm4_check_task",           
                (uint16_t       )GSM4_CHECK_STK_SIZE,        
                (void*          )NULL,                  
                (UBaseType_t    )GSM4_CHECK_TASK_PRIO,        
                (TaskHandle_t*  )&Gsm4_check_Task_Handler);
                              
    //创建TASK2任务
        //采集数据任务
    xTaskCreate((TaskFunction_t )task2_task,     
                (const char*    )"task2_task",   
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_TASK_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler);




}
    如上是我的一系列任务函数,在task2_task任务中,我有一个使用485采集数据函数。如下:
   {
   xTaskNotifyGive(Task2Task_Handler);//发送采集数据任务通知,采集数据
        while(1)
        {
        NotifyValue=ulTaskNotifyTake(pdTRUE,0);        //获取任务通知
        xTaskNotifyGive(Task2Task_Handler);//发送采集数据任务通知,采集数据
               
                if(NotifyValue==1)                                                                        //清零之前的任务通知值为1,说明任务通知有效
                {
                        vTaskSuspend(Oled_Task_Handler);
                        my_printf("7WAITTING...");
                        memset(buf,0,sizeof(buf));        //清空数据缓存
                        memset(ec_data.value,0,sizeof(ec_data.value));        //清空数据缓存
                        // u3_printf("接收到任务通知,采集数据\r\n");

                        Event_Scheduling();
                 }
        }
   }   
    在该函数中,我用来采集某个传感器的数据,但应要求,这必须得在一个周期内采集完成,采集完成后,需要计算这个数据的每秒的输出量。
    其架构大概就是:
    0-20s采集数据
    25s计算数据
    30s清空485串口的缓冲区
    所以我使用了一个TIM2去计时,然后发现,我的定时器计数,但是系统没有执行我原本设想的485发送数据函数。
   
   串口1的发送数据是我用于调试使用的。
   然而我发现定时器有在不停计数,但是并没有执行我的任务。
  {
rain_time = 195
rain_time = 196
rain_time = 197
rain_time = 198
rain_tim% = 199
vain_time0= 200
rain_time = 201
卹ain_time = 202

  }
   按照我的设定在时间等于20s 即计数为200时,并且发送485数据,且延时4s。但实际上并没有执行我的函数, 我个人猜测是任务执行过程中,即使满足了其时间的条件,本质上也还是没有进入到该函数中,估计在跑其他任务(我个人猜测)。
   最后小弟请问该怎么才能解决这个问题,麻烦各位大佬了!!

1.png (49.76 KB, 下载次数: 42)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2021-6-21 17:37 | 只看该作者
先画个流程图,在逻辑上要走得通,而后再写程序。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表