u-boot移植随笔:u-boot shell与ASCII码
前几天让u-boot的shell更接近“shell”,发现可以使用Ctrl-p等等来控制,心里总在想它们是怎么实现的,怎么能读取到我按下
Ctrl-p的呢?今天又看了u-boot的代码,找了好久,蓦然回首,原来是在./common下面的main.c中,——我就说呢,在SI中看这个文
件时候,没发现旁边下拉条那么短,聪明人一看就知道这里面有不少东西!唉,一时没注意。
看一下main.c文件中的cread_line函数(这个函数有一个while(1)死循环,遇到回车、Ctrl-c才跳出,命令补齐也在这个函数中体现),由
ichar = getcmd_getch();
获取到输入的字符,经过很复杂的处理后,终于等到回车键按下了(不按下怎么执行命令呢?对吧?),使用cread_add_to_hist保存起来——为了实现命令历史,又牵出另外的很复杂的过程。解析输入的字符就完成了,至于之后的处理,依然是很复杂的很复杂的过程。
找啊找啊,终于发现这么几行:
CTL_CH()是一个宏,从字面上理解是Ctrl加上一个字符,定义如下:
#define CTL_CH(c)((c) - 'a' + 1)
我很奇怪,怎么减去个'a'再加个1就能判断我按下Ctrl了呢?我打开VC建好工程,测试一下CTL_CH('b'),结果给我个笑脸,更百思不得其解。
又想到去查ASCII码表,开始找那几个基本上几乎一样,没有什么有用的信息。后来不小心看到一张内容稍微多一点,上面有一栏是“终端显示”,我一
看,前面怎么排列得这么整齐?^A到^Z,难道这个就是Ctrl-A到Ctrl-Z?我猜应该是了,不然找不到其它理由了。你看,^B是2,'b'-
'a'+1就等于2啊!肯定是这个原因!
但是ASCII码前面三十几个具体是干嘛的?网上都说是控制、通信用,但没亲自捣鼓,除了“/t”、“/n”经常用外,其它的没印象啊。如果要追到底,估计要追究到那个久远的年代了,算了,等哪天闲得没事干了再去追吧。
以前只知道emacs能使用ctrl-p、ctrl-n,现在,u-boot的shell、linux的shell中都能使用ctrl-p、ctrl-n等等,它们的原理应该是一样的。
本文假设已经实现了u-boot shell自动补齐、命令历史等功能(就是加多两个宏),并且没有深入追究那些代码来龙去脉。
本文即兴而写,随意看看,不必当真。
下面附上一份经过山人结合网上许多资料整理出的ASCII码表格,表格整理得不美观,但应该不会影响阅读。
|
||||||||||
Dec
|
Hex
|
Oct
|
Char
|
Terminal
|
|
Dec
|
Hex
|
Oct
|
Char
|
|
0
|
0
|
0
|
(null)
|
^@
|
空
|
64
|
40
|
100
|
@
|
|
1
|
1
|
1
|
soh
|
^A
|
文件头的开始
|
65
|
41
|
101
|
A
|
|
2
|
2
|
2
|
stx
|
^B
|
文本的开始
|
66
|
42
|
102
|
B
|
|
3
|
3
|
3
|
etx
|
^C
|
文本的结束
|
67
|
43
|
103
|
C
|
|
4
|
4
|
4
|
eot
|
^D
|
传输的结束
|
68
|
44
|
104
|
D
|
|
5
|
5
|
5
|
enq
|
^E
|
询问
|
69
|
45
|
105
|
E
|
|
6
|
6
|
6
|
ack
|
^F
|
确认
|
70
|
46
|
106
|
F
|
|
7
|
7
|
7
|
bel
|
^G
|
响铃
|
71
|
47
|
107
|
G
|
|
8
|
8
|
10
|
bs
|
^H
|
后退
|
72
|
48
|
110
|
H
|
|
9
|
9
|
11
|
ht
|
^I
|
水平跳格
|
73
|
49
|
111
|
I
|
|
10
|
0A
|
12
|
nl
|
^J
|
换行
|
74
|
4A
|
112
|
J
|
|
11
|
0B
|
13
|
vt
|
^K
|
垂直跳格
|
75
|
4B
|
113
|
K
|
|
12
|
0C
|
14
|
ff
|
^L
|
格式馈给
|
76
|
4C
|
114
|
L
|
|
13
|
0D
|
15
|
er
|
^M
|
回车
|
77
|
4D
|
115
|
M
|
|
14
|
0E
|
16
|
so
|
^N
|
向外移出
|
78
|
4E
|
116
|
N
|
|
15
|
0F
|
17
|
si
|
^O
|
向内移入
|
79
|
4F
|
117
|
O
|
|
16
|
10
|
20
|
dle
|
^P
|
数据传送换码
|
80
|
50
|
120
|
P
|
|
17
|
11
|
21
|
dc1
|
^Q
|
设备控制1
|
81
|
51
|
121
|
Q
|
|
18
|
12
|
22
|
dc2
|
^R
|
设备控制2
|
82
|
52
|
122
|
R
|
|
19
|
13
|
23
|
dc3
|
^S
|
设备控制3
|
83
|
53
|
123
|
S
|
|
20
|
14
|
24
|
dc4
|
^T
|
设备控制4
|
84
|
54
|
124
|
T
|
|
21
|
15
|
25
|
nak
|
^U
|
否定
|
85
|
55
|
125
|
U
|
|
22
|
16
|
26
|
syn
|
^V
|
同步空闲
|
86
|
56
|
126
|
V
|
|
23
|
17
|
27
|
etb
|
^W
|
传输块结束
|
87
|
57
|
127
|
W
|
|
24
|
18
|
30
|
can
|
^X
|
取消
|
88
|
58
|
130
|
X
|
|
25
|
19
|
31
|
em
|
^Y
|
媒体结束
|
89
|
59
|
131
|
Y
|
|
26
|
1A
|
32
|
sub
|
^Z
|
减
|
90
|
5A
|
132
|
Z
|
|
27
|
1B
|
33
|
esc
|
^[
|
退出
|
91
|
5B
|
133
|
[
|
|
28
|
1C
|
34
|
fs
|
^*
|
域分隔符
|
92
|
5C
|
134
|
/
|
|
29
|
1D
|
35
|
gs
|
^]
|
组分隔符
|
93
|
5D
|
135
|
]
|
|
30
|
1E
|
36
|
re
|
^^
|
记录分隔符
|
94
|
5E
|
136
|
^
|
|
31
|
1F
|
37
|
us
|
^_
|
单元分隔符
|
95
|
5F
|
137
|
_
|
|
32
|
20
|
40
|
sp
|
(Space)
|
空格
|
96
|
60
|
140
|
'
|
|
33
|
21
|
41
|
!
|
|
|
97
|
61
|
141
|
a
|
|
34
|
22
|
42
|
"
|
|
|
98
|
62
|
142
|
b
|
|
35
|
23
|
43
|
#
|
|
|
99
|
63
|
143
|
c
|
|
36
|
24
|
44
|
$
|
|
|
100
|
64
|
144
|
d
|
|
37
|
25
|
45
|
%
|
|
|
101
|
65
|
145
|
e
|
|
38
|
26
|
46
|
&
|
|
|
102
|
66
|
146
|
f
|
|
39
|
27
|
47
|
`
|
|
|
103
|
67
|
147
|
g
|
|
40
|
28
|
50
|
(
|
|
|
104
|
68
|
150
|
h
|
|
41
|
29
|
51
|
)
|
|
|
105
|
69
|
151
|
i
|
|
42
|
2A
|
52
|
*
|
|
|
106
|
6A
|
152
|
j
|
|
43
|
2B
|
53
|
+
|
|
|
107
|
6B
|
153
|
k
|
|
44
|
2C
|
54
|
,
|
|
|
108
|
6C
|
154
|
l
|
|
45
|
2D
|
55
|
-
|
|
|
109
|
6D
|
155
|
m
|
|
46
|
2E
|
56
|
.
|
|
|
110
|
6E
|
156
|
n
|
|
47
|
2F
|
57
|
/
|
|
|
111
|
6F
|
157
|
o
|
|
48
|
30
|
60
|
0
|
|
|
112
|
70
|
160
|
p
|
|
49
|
31
|
61
|
1
|
|
|
113
|
71
|
161
|
q
|
|
50
|
32
|
62
|
2
|
|
|
114
|
72
|
162
|
r
|
|
51
|
33
|
63
|
3
|
|
|
115
|
73
|
163
|
s
|
|
52
|
34
|
64
|
4
|
|
|
116
|
74
|
164
|
t
|
|
53
|
35
|
65
|
5
|
|
|
117
|
75
|
165
|
u
|
|
54
|
36
|
66
|
6
|
|
|
118
|
76
|
166
|
v
|
|
55
|
37
|
67
|
7
|
|
|
119
|
77
|
167
|
w
|
|
56
|
38
|
70
|
8
|
|
|
120
|
78
|
170
|
x
|
|
57
|
39
|
71
|
9
|
|
|
121
|
79
|
171
|
y
|
|
58
|
3A
|
72
|
:
|
|
|
122
|
7A
|
172
|
z
|
|
59
|
3B
|
73
|
;
|
|
|
123
|
7B
|
173
|
{
|
|
60
|
3C
|
74
|
<
|
|
|
124
|
7C
|
174
|
|
|
|
61
|
3D
|
75
|
=
|
|
|
125
|
7D
|
175
|
}
|
|
62
|
3E
|
76
|
>
|
|
|
126
|
7E
|
176
|
~
|
|
63
|
3F
|
77
|
?
|
|
|
127
|
7F
|
177
|
del
|
|
1
|