嵌入式操作系统关于硬件重定向的问题.doc
文本预览下载声明
硬件重定向
由semihosting知识可知,semihosting只是将目标系统中的IO请求交给了调试环境来处理,但是在嵌入式系统实际应用中,往往嵌入式系统和主机调试环境是独立的,而嵌入式系统又想使用标准输入输出中的库函数,这时就要使用硬件重定向技术。
应用程序中对外设的IO请求实际是对低层最基本IO硬件的封装,例如printf()函数,其实是对将数据写入到显示器相应寄存器的抽象封装,用户不用关心具体使用了什么硬件机制,也不用关心具体怎么将其打印到屏幕上。在ADS开发环境中,semihosting低层也进行了封装。在嵌入式应用系统中,常常需要重新实现一些低级的IO功能,以适应目标系统的具体情况。像这种将底层IO由其它硬件来实现的重定向机制叫做硬件重定向。如图3-15所示。
图3-15底层IO重定向
Semihosting将底层基本IO函数进行了封装,默认的semihosting模式下,底层基本IO都是针对显示器,键盘等硬件进行了封装,实现了对显示器,键盘输入等硬件的驱动,IO操作等。用户可以自己定义底层的基本IO函数,来实现目标开发板上IO硬件的驱动和IO操作,并且告之连接器,在连接程序时连接用户自己定义底层基本IO函数,而不是默认的调试环境下的底层基本IO函数。这样目标开发板运行应用程序中的IO操作就被重新定向到了自己的硬件上了。例如:标准输出函数printf()的底层基本IO函数是fputc(),它是向硬件里写入一个字符函数,用户自己将该函数重写,在fputc()里面实现向UART串口打印字符,而不是打印到标准输出显示器上。这样一来, printf()系列函数的输出都被重定向到UART串口上去了。
实现硬件重定向时有以下几点需要注意:
(1) 声明不使用semihosting SWI来请求host主机IO操作,而是使用自定义IO操作
(2) 驱动重定向硬件设备
(3) 重写低级IO函数
硬件重定向实验
该程序文件主要用于启动处理,声明不使用semihosting SWI来请求host主机IO操作,关闭看门狗,初始化内存,最后跳入到main函数中执行。由于程序本身实现了reg_init_no_pll.txt脚本文件的功能,因此本实验不需要加载初始化脚本。
AREA Init, CODE, READONLY
; 确保不使用系统C库中的底层IO函数接口,而是使用用户自己定义IO接口
IMPORT __use_no_semihosting_swi
ENTRY
EXPORT Reset_Handler
Reset_Handler
; 关闭看门狗
ldr r0, = 0 mov r1, #0
str r1, [r0]
bl initmem
IMPORT __main
B __main ; 使用B指令跳入main,而不使用BL指令,因为不需要返回
initmem
ldr r0, =0 ldr r1, =0 adr r2, memdata
initmemloop
ldr r3, [r2], #4
str r3, [r0], #4
teq r0, r1
bne initmemloop
mov pc,lr
memdata
DCD 0 ;BWSCON
DCD 0 ;BANKCON0
DCD 0 ;BANKCON1
DCD 0 ;BANKCON2
DCD 0 ;BANKCON3
DCD 0 ;BANKCON4
DCD 0 ;BANKCON5
DCD 0 ;BANKCON6
DCD 0 ;BANKCON7
DCD 0x
显示全部