其实到这里,只要能保证编译通过,再修改一下链接脚本,其实已经可以跑在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的代码:
至此,搞定调试串口驱动。