嵌入式系统设计与应用
InHongb 高级语言直接写I/O设备
X tern in S 在C语言中定义和使用一个变量时,编译器隐藏了变 i'a al un 量地址。可以使用指针来操纵I/O设备的地址。 n T int peek(char *location) { return *location; } Ji ea #define DEV1 0x1000 ao ch …… ton ing dev_status = peek(DEV1); /*读设备寄存器*/
CPU
状态 寄存器
机
械
结
数据 寄存器
构
InHongb 应用示例:8251 UART
X tern in S 8251 UART(Universal Asynchronous Receiver i'a al un and Transmitter)通用异步收发器进行串行通信。
n T PC的串口,早期独立芯片,现集成在较大的芯片中。
i'a al un 件或非电子元件(比如磁盘驱动器)。 n T 但与CPU的接口通常是数字接口---一组寄存器。 Ji ea 数据寄存器:通过设备将这些值作为数据保存,如磁盘读写 a c 状态寄存器:提供设备运行的信息,如当前时间完成查询
otong hing U 寄存器可以是只 U s 读的,也可以是 niverseityOnly 可读可写的。
U s 个地址。 niverseityOnly 程序使用普通的CPU读写命令来与设备通信。
InHongb ARM内存映射I/O Xi' terna in Su 定义I/O设备地址:
a l n DEV1 EQU 0x1000 n Ji Tea 读写设备寄存器代码: ao ch LDR r1,#DEV1 ; set up device adrs to in LDR r0,[r1] ; read DEV1 ng g U LDR r0,#8 ; set up value to write UniversseityOnly STR r0,[r1] ; write value to device
ot hi /* read */
o n while (peek(IN_STATUS) == 0);
ng g U achar = (char)peek(IN_DATA);
U s /* write */
n e poke(OUT_DATA,achar);
iv O poke(OUT_STATUS,1);
ers nl while (peek(OUT_STATUS) != 0);
InHongb 忙等I/O编程(2)
X tern in S #define IN_DATA
0x1000
i'a al un #define IN_STATUS 0x1001
n T #define OUT_DATA 0x1100
J e #define OUT_STATUS 0x1101
ia ac while (TRUE) {
i'a al un #define OUT_STATUS 0x1001 n T char *mystring = “Hello world.” Ji ea char *current_char; ao ch current_char = mystring; ton ing while (*current_char != ‘\0’) { g U poke(OUT_CHAR,*current_char); Un se while (peek(OUT_STATUS) != 0); iv O current_char++; ersity nly }
ity y }
InHongb 中断I/O X tern in S 忙等I/O的效率非常低:
i'a al un I/O事务未完成时,CPU除测试设备状态什么都不能做。 n J Te 无法将其他操作与I/O事务并行执行。 ia ac 中断机制能允许设备发送信号到CPU,强制执行一段 o h 特定代码。 ton ing 中断发生时,PC指向I/O设备中一个管理设备的中断处 g U 理子程序(中断服务程序或设备驱动程序)。 U s 中断机制保留了系统被中断时的PC值,以便CPU能够 niv e O 返回到被中断的程序。 ersity nly 中断机制使得CPU能够在不同的上下文中间切换。
ity y 每次传送一个字符
time
InHongb 输入输出编程支持 Xi' terna in Su I/O指令:如x86为I/O提供了特殊指令(in和
a l n out),这些指令为I/O设备提供了单独的地址 n J Te 空间。 iao ach 内存映射I/O:最普遍的方法,即使提供I/O指 to in 令的CPU也不排除使用内存映射I/O。 ng g U 内存映射I/O是为每个I/O设备的寄存器提供一
XiI'naH第tneo二rJn章n嵌igaaA入bloRi式tMTno西处e系n安S理ag统交uc器通h设Un组大i计n成n学i结g与电v构孙信eU应r(宏学s用s滨院2ei)tyOnly
InHongb 1 输入/输出编程 X tern in S 输入输出设备(I/O Devices):通常有一些模拟元
Jia eac 波特率
参
o h 每个字符的位数(5到8)
数
to in 是否包含奇偶校验,是奇校验还是偶校验 设
ng g 结束位的长度(1、1.5、还是2位)
置
U Us no
niv e O char 起始位
停止位
ers nl start bit 0 bit 1 ...
bit n-1 stop
g U Us void poke(char *location, char newval) {
niv e O (*location) = newval; }
ersity nly poke(DEV1, 8);
/*写设备寄存器*/
InHongb 忙等I/O Xi' terna in Su 忙等I/O是程序中访问设备的最基本方法。
a l n 设备一般比CPU慢,需要多周期来完成一项操作。 n J Te 通过读I/O设备状态寄存器来询问I/O设备是否空 iaotonagchUinnigveUrsseityOnly 闲通常被称为轮询(polling)。
InHongb 忙等I/O编程(1) X tern in S #define OUT_CHAR 0x1000