你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

freertos可视化调试中打印任务信息是不是只可以打印一次?

[复制链接]
月霜寒 提问时间:2017-4-13 10:25 /
在freertos中,使用可视化调试打印任务消息,但是打印不全,还只能打印一次,使用IAR自带的调试插件看,显示可视化调试任务的堆栈顶全是a,这事怎么回事?
收藏 1 评论6 发布时间:2017-4-13 10:25

举报

6个回答
月霜寒 回答时间:2017-4-17 11:48:47
any012 发表于 2017-4-15 11:02
应该就是pcWriteBuffer数组定义太小的原因,我试了定义为50,100,200个字节大小,前两次都不行,和你描述 ...

没问题,说的完成正确!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

月霜寒 回答时间:2017-4-13 12:39:38
没人了解?
月霜寒 回答时间:2017-4-13 16:30:24
本帖最后由 月霜寒 于 2017-4-13 16:31 编辑

void Debugging_Task(void *pvParameters)//可视化调试任务
{
  char pcWriteBuffer[50];
  //portTickType xLastWakeTime;//最后一次释放时时间
  pvParameters = pvParameters;
        
  //xLastWakeTime=xTaskGetTickCount();
  while(1)
  {
    USART1_RX485_Gets();
    if(rece==1)
    {
      rece=0;
      vTaskList((char *)&pcWriteBuffer);
      /*任务状态:r:运行,R:就绪,B:阻塞,S:挂起,D:删除*/
      printf("任务名      任务状态  优先级   剩余栈  任务序号\r\n");
      printf("%s\r\n",pcWriteBuffer);
      vTaskGetRunTimeStats((char *)&pcWriteBuffer);
      printf("\r\n任务名         运行计数       使用率\r\n");
      printf("%s\r\n",pcWriteBuffer);
      printf("剩余动态内存为:%d\r\n",xPortGetFreeHeapSize());
      
    }
    else
    {}
    //TaskDelayUntil(&xLastWakeTime,1000);//使用这个函数能完成精确周期调用
    vTaskDelay(500); //系统延时的心跳数,可设置
  }
}
这是我可视化调试的打印部分函数
any012 回答时间:2017-4-15 10:39:01
本帖最后由 any012 于 2017-4-15 10:45 编辑

是不是pcWriteBuffer[50]设的太小了?
我看的安富莱德教程,是设的500个字节。相应的任务栈要分配的空间也要大于500字节。

我这阵子也遇到了类似问题。
一开始是任务给的栈太小了,我用的20k byte  RAM的片子。用CUBE生成工程时默认给每个任务分配128words,而按教程里任务里一开始就减了500字节的数组,结果任务空间不够用了。后来给该任务分配了2k RAM。

输出任务使用率这部分,一开始我这里也没有显示出来。后来发现,调试信息用的定时器,我忘记了打开。

  1. void Func_LED(void const * argument)
  2. {
  3.     /* USER CODE BEGIN Func_LED */
  4.     uint8_t pcWriteBuffer[500];
  5.     HAL_GPIO_WritePin(ERR_GPIO_Port, ERR_Pin, GPIO_PIN_SET);
  6.     /* Infinite loop */
  7.     for (;;)
  8.     {
  9.         HAL_GPIO_TogglePin(RUN_GPIO_Port, RUN_Pin);
  10.         HAL_GPIO_TogglePin(PWR_GPIO_Port, PWR_Pin);
  11.         printf("\r\n1秒时间到");
  12.         printf("=================================================\r\n");
  13.         printf("任务名      任务状态  优先级    剩余栈  任务序号\r\n");
  14.         vTaskList((char *) &pcWriteBuffer);
  15.         printf("%s\r\n", pcWriteBuffer);

  16.         printf("\r\n任务名        运行计数        使用率\r\n");
  17.         vTaskGetRunTimeStats((char *) &pcWriteBuffer);
  18.         printf("%s\r\n", pcWriteBuffer);
  19.         osDelay(1000);
  20.     }
  21.     /* USER CODE END Func_LED */
  22. }
复制代码



any012 回答时间:2017-4-15 11:02:47
应该就是pcWriteBuffer数组定义太小的原因,我试了定义为50,100,200个字节大小,前两次都不行,和你描述的现象一致。定义为200字节后才正常。

评分

参与人数 1ST金币 +3 收起 理由
zero99 + 3

查看全部评分

月霜寒 回答时间:2017-4-17 08:34:26
好,我试试

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版