• 在T3开发板上实现SylixOS最小系统(四)——实现调试调试信息打印接口


    1 实现系统调试信息打印接口

      当系统出错时或者使用内核日志时会输出一些打印信息,这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的,所以我们在开发BSP时,第一个要做的工作就是实现这个接口。
      我们去bspLib.c文件中看看系统对于我们的bspDebugMsg()函数的描述:
    在这里插入图片描述

    2 T3开发板连接我们的笔记本电脑

      一般的调试信息都是通过串口来输出的,所以我们需要实现T3开发板上串口发送的函数。因为我们的开发板使用的是P10串口连接,下图就是连接方式,即UART0,所以U-Boot在启动时使用串口0输出信息,所以我们这里只要实现串口0的发送函数即可。
    在这里插入图片描述
    我们去T3的电路图看一下这个P10。
    在这里插入图片描述
    我们注意在连接杜邦线的时候TTL转USB的时候RX连接TX,TX连接RX。我们通过开发板的P10串口连接转USB接口工具连接到我们的笔记本电脑,出现下面的页面,会出现很多uboot的信息:
    在这里插入图片描述

    3 实现调试串口

    我们现在要实现串口驱动,在driver 目录下新建一个uart目录用来存放串口驱动文件uart.c和uart.h:
    在这里插入图片描述
    其中uart.h会被bspLib.c文件使用,我们需要在uart.c中实现串口的轮询发送接口,

    #define  __SYLIXOS_KERNEL
    #include 
    #include 
    
    /*********************************************************************************************************
      基地址定义
    *********************************************************************************************************/
    #define UART0_BASE            (0x01c28000)   /* 这个地址就是我们UART0的基地址,我们在前面也有带大家看过手册  */
    /*********************************************************************************************************
      寄存器偏移
    *********************************************************************************************************/
    #define RBR                   0x0         /* 这个也是要看手册看UART寄存器 RBR 的偏移量    */
    #define THR                   0x0         /* 这个也是要看手册看UART寄存器 THR 的偏移量    */
    #define USR                   0x7C        /* 这个也是要看手册看UART寄存器 USR 的偏移量    */
    
    VOID  uartPutChar (CHAR  cChar)
    {
        //  若 FIFO 不满就填入数据,否则等待
        while (!(readl(UART0_BASE + USR) & BIT(1))); // 判断USR的第二位是1还是0 ,如果不满就执行下一句。这个是看手册得到的信息。
    
        writel(cChar, UART0_BASE + THR);  //把cChar 填入 THR寄存器
    }
    
    VOID  uartPutMsg (CPCHAR  cpcMsg)
    {
        CHAR  cChar; 
    
        if (!cpcMsg) {
            return;
        }
    
        while ((cChar = *cpcMsg) != '\0') {
            uartPutChar(cChar);
            cpcMsg++;
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    1. 在手册中查看寄存器偏移量,分别是 0x00、0x00、0x7C:
      在这里插入图片描述
    2. 继续看手册,USR寄存区的第二位
      在这里插入图片描述readl 我们追一下就知道这个表示就是地址,其实是为了判断USR寄存器的第二位是0是1,如果是1 & 1 为1 ,0&1为0
      在这里插入图片描述
      所以这个的逻辑就是,通过判断USR寄存器的第二位,为0表示发送FIFI不满,就填数据,为1表示发送FIFO已满了。

    然后在bspLib.c中的bspDebugMsg 接口中调用我们刚刚实现的串口轮询发送函数:

    /*********************************************************************************************************
    ** 函数名称: bspDebugMsg
    ** 功能描述: 打印系统调试信息
    ** 输 入  : pcMsg     信息
    ** 输 出  : NONE
    ** 全局变量:
    ** 调用模块:
    *********************************************************************************************************/
    VOID  bspDebugMsg (CPCHAR  pcMsg)
    {
        /*
         * TODO: 通过 UART 打印系统调试信息
         */
        uartPutMsg(pcMsg);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4 验证调试串口

    接下来我们需要验证我们的这个debug串口是否正确。我们先编译一下我们的BSP工程,生成我们的SylixOS内核镜像文件,然后看有没有串口打印信息。如果有说明我们代码没问题。
    编译BSP工程(注意,我们的BSP工程是依赖BASE工程的,所以编译BSP过程之前要先把BASE工程编译好),在Debug目录下找到BSP_T3.bin 这个文件,如下图
    在这里插入图片描述

    这个就是我们编译出来的SylixOS内核镜像,将其拷贝到SD卡上,将SD卡插入开发板上,然后和上面一样连接开发板进入uboot ,查看我们的mmc信息,遇到了一点点问题,但是最后还是解决了,下面记录一下。
    在这里插入图片描述

    上电通过以下命令启动SylixOS内核:

    => fatload mmc 2:0 40100000 bsp_t3.bin
    => go 40100000
    
    • 1
    • 2

    由于这里我的UBoot读不出我的bin文件,所以我没办法看到我的调试串口的打印信息,这里的第一条指令就没有通过,报出了下面的错误信息:
    在这里插入图片描述
    我尝试了一些办法但是都没有解决。我也只能先继续往下做了。如果有遇到过相同问题的朋友欢迎指导。

  • 相关阅读:
    算法进阶-2sat-cf-1657F
    [二叉树&单调栈/递归] LeetCode 654. 最大二叉树(笛卡尔树)
    Spring全家桶相关注解总结
    JSX 介绍
    集客 ap ac扫盲贴 来自恩山论坛
    数据结构名词解释详细总结
    e-table,表格单元格合并
    【NLP】Transformer理论解读
    热点事件情境下微博舆情反转预测
    基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)
  • 原文地址:https://blog.csdn.net/graceyun/article/details/126317371