主题 : Tiny6410开启KITL之不完全篇 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 36671
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2011-01-19
最后登录: 2011-07-11
楼主  发表于: 2011-01-29 23:47

 Tiny6410开启KITL之不完全篇

·我假定你在看以下文字之前,大略知道什么是KITL。
FriendlyARM所给的bsp是不支持(或者说不正确地支持)KITL的,因此无法在没有硬件调试器的情况下对驱动进行源代码级调试。
为了工作方便,我们决定让这个bsp支持KITL。

首先大概说一下,在没有硬件调试器的情况下,获取调试信息的两种方法:一是DEBUG PORT,二是KITL。
先说DEBUG PORT
在绝大多数情况下,DEBUG PORT实际上就是串口,我们可以让我们的驱动从串口打印一些信息出来,比如
“靠,程序怎么跑到这个鬼地方来了。”早些时候的CE系统还支持并口输出调试信息,但现在已经不用了。
这种方式的优点是简便,且可以兼用于BOOTLOADER和KERNEL。缺点是太简便了,难以交互式调试。
输出信息的函数是DbgOutputString(...) 在Boot阶段,也可以使用EdbgOutputDebugString
再说KITL。
KITL需要CE内核支持,也是通过某个硬件接口和开发人员交互,可以下断点,观察变量,
基本上就是一个完整的源代码级调试环境,缺点是无法用于Bootloader,需要在Kernel跑起来以后才能用。
目前CE支持Serial、Ethernet、USB三种接口的KITL。

现在让我们回到FriendlyARM提供的那个BSP。这个bsp使用了一种很古怪的方式来定义DEBUG PORT和KITL,
见options.h:
#define KITL_xxxx xxxx
然后把这个宏同时用于DEBUG PORT和KITL。换句话说,这个bsp把DEBUG PORT和KITL设定为同一个硬件接口,
这不就打架了么。所以我们把options.h里面关于KITL_XXX的行统统删除,然后把设定写在platform\smdk64\smdk6410.bat里面:
------------------------------------------------------------------------------
REM 关闭所有串口驱动
set BSP_NOSERIAL=1
set BSP_NOUART0=1
set BSP_NOUART1=1
set BSP_NOUART2=1
set BSP_NOUART3=1
set BSP_NOIRDA2=1
set BSP_NOIRDA3=1
REM 关闭DEBUG PORT
set BSP_DEBUGPORT=
REM KITL使用UART0
set BSP_KITL=SERIAL_UART0
-------------------------------------------------------------------------------
上面的设定让KITL使用串口0,且关闭DEBUG PORT功能。为什么要关DEBUG PORT? 因为我没有两根串口线,
而我暂时又搞不定USB的KITL,所以只好先这样了。
什么,为嘛要写在bat文件里?这个我也说不清,反正很多官方的bsp都是这么干的,包括但不限于:
PXA255, PXA310, SMDK2410
然后在sources文件里根据bat设定的环境变量设置C编译器宏:
PLATFORM\SMDK6410\SRC\KITL\sources:
添加:
---------------------------------------------------------------------

!IF "$(BSP_KITL)" == "SERIAL_UART0"
CDEFINES=$(CDEFINES) -DKITL_SERIAL_UART0
!ENDIF

!IF "$(BSP_KITL)" == "SERIAL_UART1"
CDEFINES=$(CDEFINES) -DKITL_SERIAL_UART1
!ENDIF

!IF "$(BSP_KITL)" == "SERIAL_UART2"
CDEFINES=$(CDEFINES) -DKITL_SERIAL_UART2
!ENDIF

!IF "$(BSP_KITL)" == "SERIAL_UART3"
CDEFINES=$(CDEFINES) -DKITL_SERIAL_UART3
!ENDIF

!IF "$(BSP_KITL)" == "USBSERIAL"
CDEFINES=$(CDEFINES) -DKITL_USBSERIAL
!ENDIF

PLATFORM\SMDK6410\SRC\OAL\OALLIB\sources
添加:
--------------------------------------------------------------------------------
!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART0"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=0
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART1"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=1
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART2"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=2
!ENDIF

!IF "$(BSP_DEBUGPORT)" == "SERIAL_UART3"
CDEFINES=$(CDEFINES) -DDEBUG_PORT=3
!ENDIF

这样就差不多了。但是且慢,KITL的是可以在bootloader里开或关的,
不幸的是Superboot并没有这个功能。
所以我们强制开启:
KITL.C
-----------------------------------------------------------

BOOL OEMKitlStartup(void)
{
...
// Force startup KITL
    if(0/*(pArgs->flags & OAL_KITL_FLAGS_ENABLED) == 0*/)
    {
        RETAILMSG(1,(TEXT("KITL was Disabled from EBOOT !!\r\nPlease set KITL Configuration in EBoot !!\r\n")));
        return FALSE;
    }
}

好了,现在clean sysgen,把程序烧进flash,启动后可以看到串口工具里会显示KITL已经启动。
现在关闭串口工具,在vs2005的target菜单下选connectivity options,
Transport选serial,设置好端口,debugger选kdstub,download选none,然后点debug->attach
过一会……不,是过一大会,vs2005的output窗口就有东西出来了,告诉你跟设备连上了。
为什么是一大会?这个我们要理解,串口的速度是很慢滴。。。。。。
在我的机子上KITL花了五分钟打印出近千行调试信息,还是没出来CE漂漂的界面。MD,不玩了!

总结:KITL框架没有问题,但是serial太慢了,完全不实用。
下一步:搞定usb KITL。
时间:明年再说吧。

对了,还有一点:编译debug版本以前先给工程瘦个身,Tiny6410的ram是放不下FriendlyARM原版工程的Debug版的。

补充1:以上文字大多数人可以自由使用,但禁止FriendlyARM使用以上文字和根据以上文字得来的东西修改自己的BSP,哈、哈、哈
补充2:补充1是个玩笑,请忽略。估计FriendlyARM的工程师们会笑话这小子狂妄自大、不知天高地厚 :-)

有问题可以与我联系:byeyear@hotmail.com
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2011-02-04 14:54
不错,顶一个,可以给有需要的用户参考,但是我们开发时并不使用这种调试方法
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 荣誉会员
UID: 34761
精华: 0
发帖: 1348
金钱: 6835 两
威望: 1367 点
贡献值: 0 点
综合积分: 2696 分
注册时间: 2010-12-21
最后登录: 2017-06-02
2楼  发表于: 2011-02-14 09:52
支持原创,顶