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 print( char **out, const char *format, va_list args )
  
  {
  
  register int width, pad;
  
  register int pc = 0;
  
  char scr[2];
  
  for (; *format != 0; ++format) {
  
  if (*format == '%') {
  
  ++format;
  
  width = pad = 0;
  
  if (*format == '\0') break;
  
  if (*format == '%') goto out;
  
  if (*format == '-') {
  
  ++format;
  
  pad = PAD_RIGHT;
  
  }
  
  while (*format == '0') {
  
  ++format;
  
  pad |= PAD_ZERO;
  
  }
  
  for ( ; *format >= '0' && *format <= '9'; ++format) {
  
  width *= 10;
  
  width += *format - '0';
  
  }
  
  if( *format == 's' ) {
  
  register char *s = (char *)va_arg( args, int );
  
  pc += prints (out, s?s:"(null)", width, pad);
  
  continue;
  
  }
  
  if( *format == 'd' || *format == 'i' ) {
  
  pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
  
  continue;
  
  }
  
  if( *format == 'x'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值