Bootstrap

52832 不使用micro_lib ,同时使用AC6编译器且使用printf问题

1. 因为我的工程用AC6是因为要跑自己的C 和 TensorFlow lite micro. 所以是C,C++混合的工程,但是一直没法打印,所以写一个总结。

基本说明: micro_lib这种情况不要选,因为存在C++文件

第一个坑:

第二个坑:网上大部分教程的重定向printf代码是

__ASM(".global __use_no_semihosting");

//??HAL????,?????????bug
//??????????,???????????????,??
int _ttywrch(int ch)    
{
    ch=ch;
	return ch;
}

//??????????                 
//struct __FILE 
//{ 
//	int handle; 
//	/* Whatever you require here. If the only file you are using is */ 
//	/* standard output using printf() for debugging, no file handling */ 
//	/* is required. */ 
//}; 

FILE __stdout;     

//??_sys_exit()??????????    
void _sys_exit(int x) 
{ 
	x = x; 
} 

int fputc(int ch, FILE *f){      
   // usart_data_transmit(USART0, (uint8_t)ch);  //????????
   // while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));//??????
	app_uart_put(ch);
    return ch;
}

某些情况下是可以的(我在52832官方demo这么写是可以的,但是我加了tensorflow lite mirco以后,打印不正常)

换一下代码后正常(串口发送哪个,要换成自己的):

__ASM(".global __use_no_semihosting");//_swi

//__ASM(".global _main_redirection");

const char __stdin_name[150];

const char __stdout_name[150];

const char __stderr_name[150];

typedef int FILEHANDLE;

typedef unsigned int clock_t;    /* cpu time type */

typedef unsigned int time_t;     /* date/time in unix secs past 1-Jan-70 */

 extern FILE __stdout; 

//???????,??printf?fopen?fclose????????????????????,???????????????,??????????????

void _sys_exit(int status)
{
   while(1);
}

FILEHANDLE _sys_open(const char *name, int openmode)
{
    return 0;
}

 int _sys_close(FILEHANDLE fh)
{
    return 0;

}

int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)

{

    return 0;

}

 

int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)

{

    return 0;

}

int _sys_istty(FILEHANDLE fh)

{

    return 0;

}

 

int _sys_seek(FILEHANDLE fh, long pos)

{

    return 0;

}

 

int _sys_ensure(FILEHANDLE fh)

{

    return 0;

}

long _sys_flen(FILEHANDLE fh)

{

    return 0;

}

 

int _sys_tmpnam(char *name, int fileno, unsigned maxlength)

{

    return 0;

}

 

void _ttywrch(int ch)

{

 

}

time_t time(time_t *t)

{

    return 0;

}

int remove(const char *filename)

{

    return 0;

}

 int rename(const char *oldname, const char *newname)

 {

   return 0;

 }

 int system(const char *command)

 {

    return 0;

 }

char *_sys_command_string(char *cmd, int len)

{

    return 0;

}

 

clock_t clock(void)

{

    return 0;

}

//???fputc?? 

int fputc(int ch, FILE *f)

{

app_uart_put((unsigned char)ch);

 

return ch;

}

第三个,写自己的打印函数;

#include <stdarg.h>
#include <string.h>

#define TX_BUF_LEN  256     /* ???????,???????? */
uint8_t TxBuf[TX_BUF_LEN];  /* ?????                       */
void MyPrintf(const char *__format, ...)
{
  va_list ap;
  va_start(ap, __format);
    
  /* ??????? */
  memset(TxBuf, 0x0, TX_BUF_LEN);
    
  /* ??????? */
  vsnprintf((char*)TxBuf, TX_BUF_LEN, (const char *)__format, ap);
  va_end(ap);
  int len = strlen((const char*)TxBuf);
  
  /* ??????? */
  for (int i = 0; i < len; i++)
  {
		app_uart_put( TxBuf[i]);
  }
}

;