现在的位置: 首页 > 综合 > 正文

RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动

2013年02月16日 ⁄ 综合 ⁄ 共 6880字 ⁄ 字号 评论关闭

其实到这里,只要能保证编译通过,再修改一下链接脚本,其实已经可以跑在at9260的系统上了。因为我没有仿真器,不知道程序的状态,所以必须撰写调试串口的驱动。

RTEMS 的调试串口并没有采用中断输出的方式,而是采用查询输出的方式。相对来说比较容易。

RTEMS里有两个打印函数:

 

printf 和 printk

 

printf是由库支持的打印函数,内部比较复杂,主要用于应用程序级别的打印,不能用于内核和中断的打印,特别是中断中不能使用该函数,否则会引起死机。

printk是由rtems的调试打印函数,主要用于内核和中断的打印。任务级别也可以调用,但是最好不要这样做。

 

printk是调用 BSP_output_char 这个函数指针完成字符的输出。

可以在c/src/lib/lbicpu/arm/at91sam9260/dbgu/Dbgu.c中的末尾的

 

static void _BSP_put_char( char c ) {
    dbgu_write_polled(0, c);
}

 

BSP_output_char_function_type BSP_output_char = _BSP_put_char;

 

那么就是说,printk实际上是调用调试串口驱动完成字符的输出。

既然调用调试串口输出,必须等调试串口初始化完成以后才能输出。

 

start.S执行完毕后,是跳转到 bootcard 函数中继续执行,bootcard 要完成对内核数据的初始化后,才调用IO的初始化,这时串口的驱动才能工作。也就是说,想在bootcard运行调试串口初始化以前,看到printk的输出,基本上是不可能的。

 

如果你真的想这个时候也能看到printk的输出,只能提前初始化串口驱动了。

我的做法是,dbgu_write 函数内部会检查调试串口有没有被初始化,如果没有被初始化,先初始化再输出字符。那么这样,即使在start.S汇编文件里调用printk,也是能看到输出的。

 

这里还要注意一个问题就是调试串口的波特率,调试串口的波特率是通过函数BSP_get_baud获得,

这个函数在c/src/lib/libbsp/arm/at9260/include/bsp.h中。

 

 

另外就是修改 c/src/lib/libbsp/arm/at9260/console/uarts.c的代码。

这里的改动主要是一些配置和寄存器,没有什么好讲的。

 

下面是dbgu.c的源代码:

 

 

下面是uarts.c的代码:

 

 

至此,搞定调试串口驱动。

 

 

抱歉!评论已关闭.