首页> 中国专利> Linux中的早期串口打印调试方法及装置

Linux中的早期串口打印调试方法及装置

摘要

本发明揭示了一种Linux中的早期串口打印调试方法及装置。该方法包括:在嵌入式单板的CPU地址空间中,预留一信息传递空间;在Bootloader阶段实现串口驱动和打印函数,并将打印函数地址保存到预留的信息传递空间;将预留的信息传递空间地址作为启动参数传递给Linux;从信息传递空间中取得Bootloader中实现的打印函数地址。本发明可以在Linux启动的最早期实现真正的调试信息即时打印,提高了Linux开发、移植的效率。

著录项

  • 公开/公告号CN101894069A

    专利类型发明专利

  • 公开/公告日2010-11-24

    原文格式PDF

  • 申请/专利权人 中兴通讯股份有限公司;

    申请/专利号CN201010197161.6

  • 发明设计人 石东佳;

    申请日2010-06-10

  • 分类号G06F11/36;G06F9/48;

  • 代理机构深圳市世纪恒程知识产权代理事务所;

  • 代理人胡海国

  • 地址 518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法务部

  • 入库时间 2023-12-18 01:09:32

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-04-01

    授权

    授权

  • 2012-05-09

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20100610

    实质审查的生效

  • 2010-11-24

    公开

    公开

说明书

技术领域

本发明涉及到嵌入式设备的早期打印调试方法,特别涉及到一种使用Linux操作系统的嵌入式设备的早期打印调试方法。

背景技术

目前Linux操作系统的应用范围非常广泛,使用Linux的嵌入式设备越来越多。在新设备上,Linux内核的移植、开发工作成为使用Linux的第一个技术性难关。

Linux内核的移植开发,首先需要解决的是调试方法的问题。当前在Linux中进行早期调试非常困难,在Printk功能启用之前(包括2.6.22版本之后加入的early_printk),缺乏直观高效的调试信息输出方式。许多技术开发人员使用点亮设备上指示灯的方式来获得当前Linux系统的工作状态,这种方式不但使用不便,而且能够展示的信息相当有限。

发明内容

本发明的主要目的为提供一种Linux中的早期串口打印调试方法,可提高Linux开发、移植的效率。

为了实现上述目的,本发明提出一种Linux中的早期串口打印调试方法,包括步骤:

在嵌入式单板的CPU地址空间中,预留一段受保护的用于从Bootloader向Linux传递信息的信息传递空间;

在Bootloader阶段实现串口驱动和打印函数,并将打印函数地址保存到预留的信息传递空间;

将预留的信息传递空间地址作为启动参数传递给Linux;

从信息传递空间中取得Bootloader中实现的打印函数地址。

优选地,所述信息传递空间、Bootloader空间、Linux空间不互相覆盖。

优选地,所述打印函数的类型包括Bootloader早期用汇编代码实现的不使用堆栈的打印以及Bootloader后期用C代码实现的使用堆栈的打印。

优选地,所述打印函数的地址保存在信息传递空间中。

本发明还提出一种Linux中的早期串口打印调试装置,包括:

地址规划模块,在嵌入式单板的CPU地址空间中,预留一段受保护的用于从Bootloader向Linux传递信息的信息传递空间;

实现保存模块,在Bootloader阶段实现串口驱动和打印函数,并将打印函数地址保存到预留的信息传递空间;

传递模块,将预留的信息传递空间地址作为启动参数传递给Linux;

获取模块,从信息传递空间中取得Bootloader中实现的打印函数地址。

优选地,所述信息传递空间、Bootloader空间以及Linux空间不互相覆盖。

优选地,所述打印函数的类型包括:

Bootloader早期用汇编代码实现的不使用堆栈的打印以及Bootloader后期用C代码实现的使用堆栈的打印。

优选地,所述打印函数的地址保存在信息传递空间中。

本发明所述的Linux中的早期串口打印调试方法,丰富了Linux的调试手段,可以在Linux启动的最早期实现真正的调试信息即时打印,提高了Linux开发、移植的效率。

附图说明

图1为本发明Linux中的早期串口打印调试方法一实施例的流程示意图;

图2为本发明Linux中的早期串口打印调试方法一实施例的地址空间规划示意图;

图3为本发明Linux中的早期串口打印调试方法一实施例的Bootloader实现流程示意图;

图4为本发明Linux中的早期串口打印调试方法一实施例的Linux实现流程示意图;

图5为本发明Linux中的早期串口打印调试装置一实施例的结构示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

本发明中,Bootloader(引导程序),是在操作系统内核运行之前运行的一段小程序。通过Bootloader,可以初始化硬件设备、建立内存空间映射,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

Uart(Universal Asynchronous Receiver/Transmitter),俗称串口,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。

参照图1所示,其为本发明Linux中的早期串口打印调试方法一实施例的流程示意图,该方法包括:

步骤S10、在嵌入式单板的CPU地址空间中,预留一段受保护的用于从Bootloader向Linux传递信息的信息传递空间;其中,上述信息传递空间、Bootloader空间、Linux空间不互相覆盖。其中,上述嵌入式单板的CPU地址空间中,还可规划出Bootloader的空间。

步骤S11、在Bootloader阶段实现串口驱动和打印函数,并将打印函数地址保存到预留的信息传递空间;其中,上述打印函数的类型有两种,一种是Bootloader早期用汇编代码实现的不使用堆栈的打印,另一种是Bootloader后期用C代码实现的使用堆栈的打印。进一步的,两者类型的打印函数的地址都保存到信息传递空间中。

步骤S12、将预留的信息传递空间地址作为启动参数传递给Linux;其中,启动参数为Linux已经实现的参数传递方法。本步骤可在加载Linux操作系统时进行。

步骤S13、从信息传递空间中取得Bootloader中实现的打印函数地址;并在此基础上实现Linux下的打印函数。其中,Linux下的打印函数也有两种,一种是在Linux启动的早期汇编代码阶段的汇编打印函数,用汇编代码实现的打印;另一种是在Linux启动的早期C代码阶段的C打印函数,用C代码实现的打印。本步骤可通过修改Linux代码实现,且可在启动初期进行。

本实施例中,在Linux启动阶段使用的打印方法通过串口和显示设备输出调试信息。

参照图2所示,其为本发明Linux中的早期串口打印调试方法一实施例的地址空间规划示意图,嵌入式设备采用mips(Microprocessor withoutinterlocked piped stages,无内部互锁流水级)架构的处理器,根据mips处理器的要求Bootloader加载地址为0x9fc0 0000。在本实施例中,将Bootloader的代码段指定链接到0x8c10 0000地址,规划0x8c0 0000地址到0x8c10 0000共1M空间为信息传递空间,用于存贮boot_info信息。移植后的Linux代码段链接到0x8340 0000地址,只要Linux编译之后不超过140M,则不会覆盖到信息传递空间及其上的Bootloader代码段空间,进而保证了信息传递空间、Bootloader空间、Linux空间不互相覆盖。

参照图3所示,其为本发明Linux中的早期串口打印调试方法一实施例的Bootloader实现流程示意图,给出了在Bootloader阶段与本发明相关的操作流程,包括:

步骤201,Bootloader指定加载到0x9fc 00000地址,且将其代码段链接到0x8c10 0000。

步骤202,在boot阶段实现串口的驱动,使能设备串口。

步骤203,在早期的汇编代码阶段,实现汇编代码版本的串口打印函数。该打印函数用于boot的初期,其功能有限,且因为不对堆栈进行维护,调用者在寄存器的使用上受限。该打印函数可命名为a_print。

步骤204,在后期的C代码阶段,实现C语言代码版本的串口打印函数。该打印函数用于C语言调用,其功能强大,有堆栈,调用者无需考虑寄存器的使用限制;但此时的函数不能在无堆栈的汇编程序中调用。该打印函数可命名为c_print。

步骤205,将a_print和c_print的地址保存到boot_info中。

步骤206,Bootloader引导Linux时,将boot_info的地址0x8c00 0000,作为启动参数传递到Linux中。

参照图4所示,其为本发明Linux中的早期串口打印调试方法一实施例的Linux实现流程示意图,给出了在操作系统阶段与本发明相关的操作流程,包括:

步骤301,链接Linux的代码段加载到0x8340 0000。

步骤302,Linux启动时,第一阶段是汇编代码。在此阶段,可以得到Bootloader传递的参数,并将boot_info的地址保存到内存变量中。该过程可以在启动mips Linux的第一时间进行,传递到Linux中的参数保存在寄存器a0-a4中,可以直接从寄存器中读取到数据。

步骤303,通过boot_info地址加偏移值得到a_print函数的地址。a_print的地址具体保存在boot_info中的具体位置,可通过技术开发人员对boot_info结构的规划而确定。

步骤304,基于a_print实现汇编函数early_os_a_print。在该函数中,将打印的字符串及其它参数,传递给a_print,以完成汇编版本的Linux打印程序。如此,在Linux的最初汇编代码阶段,即可使用该函数打印调试信息。该early_os_a_print函数的使用准则和a_print相同。

步骤305,在进入到C代码阶段后,通过boot_info地址加偏移值得到c_print函数的地址。c_print的地址具体保存在boot_info中的具体位置,可通过技术开发人员对boot_info结构的规划而确定。

步骤306,基于c_print实现C函数early_os_c_print。在该函数中,将步骤305中得到的c_print函数地址赋值到一个函数指针变量上,通过函数指针可直接调用c_print函数。如此,可在Linux最初进入c代码阶段可打印调试信息。该early_os_c_print函数的使用准则和c_print相同。

步骤307,在Linux代码进一步执行后,Printk功能可以被使用时,便可使用Linux提供的打印函数;同时,也可继续使用early_os_c_print函数。

参照图5所示,其为本发明Linux中的早期串口打印调试装置的结构示意图,该装置包括地址规划模块51、实现保存模块52、传递模块53以及获取模块54。该地址规划模块51,在嵌入式单板的CPU地址空间中,预留一段受保护的用于从Bootloader向Linux传递信息的信息传递空间;该实现保存模块52,在Bootloader阶段实现串口驱动和打印函数,并将打印函数地址保存到预留的信息传递空间;该传递模块53,将预留的信息传递空间地址作为启动参数传递给Linux;该获取模块54,从信息传递空间中取得Bootloader中实现的打印函数地址。

上述信息传递空间、Bootloader空间以及Linux空间不互相覆盖。

上述打印函数的类型包括Bootloader早期用汇编代码实现的不使用堆栈的打印以及Bootloader后期用C代码实现的使用堆栈的打印。

上述打印函数的地址保存在信息传递空间中。

以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号