调试

FAQ1 Log怎么抓取和具体的参考指南?


FAQ2 BT PAN 共享网络吞吐率怎么测试?


FAQ3 在bootloader中如何使用串口打印

如需在bootloader中使用串口打印,可参考如下进行UART配置:

   #include "bf0_hal.h"
   #include "stdio.h"

   /* UART handler declaration */
   UART_HandleTypeDef UartHandle;

   /* menuconfig configuration */
   #ifdef CONSOLE_UART1
       #define UART_INSTANCE hwp_usart1
   #elif defined(CONSOLE_UART3)
       #define UART_INSTANCE hwp_usart3
   #elif defined(CONSOLE_UART4)
       #define UART_INSTANCE hwp_usart4   
   #else
       #error RT_CONSOL_DEVICE_NAME is not supported yet in this app.
   #endif

   #ifdef __CC_ARM                                              /*ARMCC*/
   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
   #elif defined(__ARMCC_VERSION)&&(__ARMCC_VERSION >= 6010050) /*ARMCLANG*/
   #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *f)
   #elif __ICCARM__                                             /*IAR**/
   #error Not support yet
   #else                                                        /*GCC*/
   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
   int write(int fd, char *ptr, int len)
   {
       if (fd > 2)
           return -1;
       HAL_UART_Transmit(&UartHandle, ptr, len, 0xFFFF);
       return len;
   }
   #endif

   /**
   * @brief  Retargets the C library printf function to the USART.
   * @param  None
   * @retval None
   */
   PUTCHAR_PROTOTYPE
   {
       /* Place your implementation of fputc here */
       /* e.g, write a character to the USARTl and loop until the end of transmission */
       HAL_UART_Transmit(&UartHandle,(uint8_t *)&ch, 1, 0xFFFF);
       return ch;
   }

   /**
   * @brief Configure the UART peripheral.
   */
   void uart_config(void)
   {
       /* Step 1. select clock : 52x默认为RC48,bootloader里没有校准,需要配置为XT48M */
       HAL_HPAON_EnableXT48();
       #ifndef SOC_SF32LB52X
       HAL_RCC_HCPU_ClockSelect(RCC_CLK_MOD_HP_PERI, RCC_CLK_PERI_HXT48);
       #endif
       #ifdef SOC_SF32LB56X
       #ifdef CONSOLE_UART4
       HAL_RCC_LCPU_ClockSelect(RCC_CLK_MOD_LP_PERI, RCC_CLK_PERI_HXT48);
       #endif
       #endif

       /* Step 2. pinmux configuration. */
       #ifdef SOC_SF32LB52X
       HAL_PIN_Set(PAD_PA19, USART1_TXD, PIN_PULLUP, 1);
       HAL_PIN_Set(PAD_PA18, USART1_RXD, PIN_PULLUP, 1);
       #elif defined(SOC_SF32LB56X)
       HAL_PIN_Set(PAD_PA34, USART1_TXD, PIN_PULLUP, 1);
       HAL_PIN_Set(PAD_PA30, USART1_RXD, PIN_PULLUP, 1);
       #else
       #error PINMUX for USARTx is not set.
       #endif

       /* Step 3. UART initialization. */
       /* UART configured as follows:
           - Word Length = 8 Bits (8 data bit + o parity bit) :
               BECAREFUL : Program 7 data bits + l parity bit in pc HyperTerminal
           - Stop Bit   = One stop bit
           - Parity     = No parity
           - BaudRate   = 1000000 baud
           - Hardware flow control disabled (RTS and CTS signals) */
       UartHandle.Instance        = UART_INSTANCE;
       UartHandle.Init.BaudRate   = 1000000;
       UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
       UartHandle.Init.StopBits   = UART_STOPBITS_1;
       UartHandle.Init.Parity     = UART_PARITY_NONE;
       UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
       UartHandle.Init.Mode       = UART_MODE_TX_RX;
       UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
       if (HAL_UART_Init(&UartHandle) != HAL_OK)
           HAL_ASSERT(0);  /* Initialization Error */

   }

   /**************************main**************************************/

   #if defined(__CC_ARM) || defined(__CLANG_ARM)
       int main(void)
   #elif defined(__ICCARM__)
       int __low_level_init(void)
   #elif defined(__GNUC__)
       int entry(void)
   #endif
   {
       HAL_Delay_us(0);

       /* UART configuration */
       uart_config();
       /* 使用printf打印 */
       printf("This is test log.\n");
       ... ...

说明:

  • 调用uart_config初始化UART配置后,可使用printf打印。

  • 如果打印无效,可确认以下信息:

    • 配置的是哪个串口:CONSOLE_UART1/CONSOLE_UART2/CONSOLE_UART3等。

    • 确认uart_config中的UART PIN脚配置是否正确。


FAQ4 Solution记录重启信息(debug)

开机时会有启动打印(PowerOnMOde),正常使用软件重启前会记录重启原因(Reason)。(rtc_record)记录了开机后系统流程节点,以及死机,看门狗是否触发等

../../_images/reboot_log.png

PowerOnMOde:记录如下

../../_images/reboot_mode.png

Reason:记录的信息对应pmuc.h里的wsr

../../_images/re_wsr.png

rtc_record: 对应信息在module_record.h里,需要在HCPU打开USING_MODULE_RECORD宏才会记录

../../_images/re_menuconfig.png ../../_images/re_module.png ../../_images/re_backup.png

FAQ5 为什么从打开看门狗的版本ota到不开看门狗版本必现重启

  1. 空片烧录时,需要在大小核menuconfig打开所有看门狗跟release,才有效果。

  2. 为什么从开看门狗的版本ota到关看门狗的版本,机器必现重启。

默认开机会先从flash db里读看门狗配置,ota并不会清楚这个flashdb的配置。导致机器出现看门狗超时重启。

建议客户直接用uart全擦flash,在重新烧录。

../../_images/re_wdt.png

FAQ6 为什么log输出double类型的变量错误

  1. rtthread的log不支持输出double类型的变量, 用%lf有时可以, 有时又都是0。

  2. 可以利用snprintf转一下, snprintf支持double类型输出。

封装一下自行打印, str可以位变量名字,precision为小数点后面输出多少位。

static void print_double(const char *str,chardouble value, int precision)
{
    char buffer[32];
    snprintf(buffer, sizeof(buffer), "%.*f", precision, value);
    LOG_I("%s=%s", str, buffer);
}

FAQ7 如何调整打印(log)的最大打印长度?

  1. 未使能ULOG(RT_USING_ULOG)时,rt_kprintf打印的最大长度,由 RT_CONSOLEBUF_SIZE 决定:

  2. 使能ULOG(RT_USING_ULOG)时,需要再调整 ULOG_LINE_BUF_SIZE 来修改最大打印长度:


FAQ8 如何关闭打印(log)、调整Ulog打印等级?

  1. 关闭rt_kprintf打印:
    可通过调用log_pause(1) 动态关闭。

  2. 关闭Ulog打印:
    可在menuconfig中关闭:

  3. 调整Ulog打印等级:

    • 全局调整:

    • (单文件)局部调整:
      可在源文件中重定义DBG_LEVEL,示例如下:

      // 示例摘自drv_lcd.c
      #define  DBG_LEVEL            DBG_INFO  //DBG_LOG //
      
      #define LOG_TAG                "drv.lcd"
      #include "log.h"