u-boot移植随笔:u-boot shell与ASCII码

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码表格,表格整理得不美观,但应该不会影响阅读。

 

                         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 、本表列出了 ASCII 字符集。每一个字符有它的十进制值,十六进制值,终端上的显示结果, ASCII 助记名,和 ASCII 控制字符定义。
2 ASCII 字符 60—7Fh 不能被存储到内存单元或数据记录文件。这些值被转变到 40h - 5Fh 范围内的等价大写形式。这些字符可以被存到缓冲区,并且在通讯时被发送和接收。
3 ASCII 0-1F 7F 33 个字符是控制字符或通信专用字符,其余均为可显示字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值