FreeRTOS怎么进行优化与错误排查

  介绍

这篇文章主要介绍”FreeRTOS怎么进行优化与错误排查”,在日常操作中,相信很多人在FreeRTOS怎么进行优化与错误排查问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“FreeRTOS怎么进行优化与错误排查”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

写在前面

主要是为刚接触FreeRTOS的用户指出那些新手通常容易遇到的问题。这里把最主要的篇幅放在栈溢出以及栈溢出j检测上,因为栈相关的问题是初学者遇到最多的问题。

printf-stdarg。c

当调用<强> c标准库强劲的函数时,栈空间使用量可能会急剧上升,特别是IO与字符串处理函数,比如sprintf (), printf()等。在FreeRTOS源码包中有一个名为<强> printf-stdarg。c 强的文件。这个文件实现了一个栈效率优化版的小型sprintf (), printf(),可以用来代替标准c库函数版本。在大多数情况下,这样做可以使得调用sprintf()及相关函数的任务对栈空间的需求量小很多。可能很多人都不知道freertos中有这样子的一个文件,它放在第三方资料中,路径为“<强> FreeRTOSv9.0.0 \ FreeRTOS-Plus \ Demo \ FreeRTOS_Plus_UDP_and_CLI_LPC1830_GCC ",我们发布工程的时候就无需依赖<强> c标准库强劲,这样子就能减少栈的使用,能优化不少空间。该文件源码(部分):

 static  int 打印(,char  * *,, const  char  *格式,va_list  args )
  {
  register  int 宽度,,垫;
  时间=register  int  pc  0;
  char 可控硅[2];
  
  for  (, * format  !=, 0;, + +格式),{
  if  (* format ==, & # 39; % & # 39;), {
  + +格式;
  时间==width  pad  0;
  if  (* format ==, & # 39; \ 0 & # 39;),打破;
  if  (* format ==, & # 39; % & # 39;), goto ;
  if  (* format ==, & # 39; & # 39;), {
  + +格式;
  时间=pad  PAD_RIGHT;
  }
  while  (* format ==, & # 39; 0 & # 39;), {
  + +格式;
  pad  |=, PAD_ZERO;
  }
  for  (,,, * format 的在=,& # 39;0 & # 39;,,,,* format  & lt;=, & # 39; 9 & # 39;,, + +格式),{
  *=width  10;
  +=width  * format 作用;& # 39;0 & # 39;;
  }
  如果(==,,* format  & # 39; & # 39;,), {
  register  char  * s =, (char  *) va_arg (arg游戏的不同之处是,int );
  +=pc  prints (,, ?年代:“(null)“,,宽度,,pad);
  继续;
  }
  如果(==,,* format  & # 39; d # 39;, | |, * format ==, & # 39;我# 39;,),{
  pc  +=, printi  (,, va_arg (arg游戏的不同之处是,int ),,,, 1,,宽度,,,,& # 39;一个# 39;);
  继续;
  }
  如果(==,,* format  & # 39; x # 39;,), {
  pc  +=, printi  (,, va_arg (arg游戏的不同之处是,int ),, 16日,0,,宽度,,,,& # 39;一个# 39;);
  继续;
  }
  如果(==,,* format  & # 39; x # 39;,), {
  pc  +=, printi  (,, va_arg (arg游戏的不同之处是,int ),, 16日,0,,宽度,,,,& # 39;一个# 39;);
  继续;
  }
  如果(==,,* format  & # 39; u # 39;,), {
  pc  +=, printi  (,, va_arg (arg游戏的不同之处是,int ),,,, 0,,宽度,,,,& # 39;一个# 39;);
  继续;
  }
  如果(==,,* format  & # 39; c # 39;,), {/*,char 断开连接;converted 用int  then  pushed 提醒,stack  */可控硅[0],=,(char) va_arg (arg游戏的不同之处是,int );
  可控硅[1],=,& # 39;\ 0 & # 39;;
  +=pc  prints (,,可控硅,,宽度,,pad);
  继续;
  }
  }
  else  {
  :
  printchar (,, *格式);
  + +电脑;
  }
  }
  if (出),* * out =, & # 39; \ 0 & # 39;;
  va_end (, args );
  return  pc;
  }
  
  int  printf (const  char  *格式,,…)
  {
  va_list 参数;
  
  va_start (arg游戏的不同之处是,format );
  return 打印(0,大敌;格式,args );
  }
  
  int  sprintf (char  *,, const  char  *格式,,…)
  {
  va_list 参数;
  
  va_start (arg游戏的不同之处是,format );
  return 打印(,,,,格式,args );
  }
  
  
  int  snprintf (, char  *缓冲区,unsigned  int 统计,,const  char  *格式,,,,)
  {
  va_list 参数;
  
  (,void ),数;
  
  va_start (arg游戏的不同之处是,format );
  return 打印(,,但,,格式,args );
  }

FreeRTOS怎么进行优化与错误排查