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保存起来——为了实现命令历史,又牵出另外的很复杂的过程。解析输入的字符就完成了,至于之后的处理,依然是很复杂的很复杂的过程。
找啊找啊,终于发现这么几行:
case CTL_CH('a'): BEGINNING_OF_LINE(); break; case CTL_CH('c'): /* ^C - break */ *buf = '/0'; /* discard input */ return (-1); case CTL_CH('f'): if (num < eol_num) { getcmd_putch(buf[num]); num++; } break; case CTL_CH('b'): if (num) { getcmd_putch(CTL_BACKSPACE); num--; } break; case CTL_CH('d'): if (num < eol_num) { wlen = eol_num - num - 1; if (wlen) { memmove(&buf[num], &buf[num+1], wlen); putnstr(buf + num, wlen); } getcmd_putch(' '); do { getcmd_putch(CTL_BACKSPACE); } while (wlen--); eol_num--; } break;
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控制字符定义。 |
||||||||||
u-boot移植随笔:u-boot shell与ASCII码相关推荐
- u-boot移植随笔:让u-boot shell支持tab、命令历史
u-boot移植随笔:让u-boot shell支持tab.命令历史 前两天一直在想一个问题,u-boot的shell怎么不支持命令自动补齐,命令历史呢?由于受linux的shell影响,只要其它的& ...
- 移植U-Boot.1.3.1到S3C244和S3C2410
移植U-Boot.1.3.1到S3C244和S3C2410 首先,U-Boot1.3.1还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的.2440和2410的区别在我移植1.2.0的文 ...
- u-boot移植随笔:u-boot的内存分布图
花了两天时间来专门研究u-boot的内存分布,这个图网上已经有了,但只是大致图形,没有详细.深入解析.所以自己就专门画了图,添加一些东西. 此外,还专门测试了一下u-boot下全局变量.未初始化变量等 ...
- u-boot移植随笔:自定义u-boot命令点灯
u-boot移植随笔:自定义u-boot命令点灯 前几天一不小心在CSDN论坛上发帖散分,同时许诺完成点灯就结账,经过努力,终于可以在u-boot的shell中输入自定义的命令来点灯了.下面简单讲一下 ...
- u-boot移植随笔:System.map文件格式
u-boot移植随笔:System.map文件格式 背景:正在努力看u-boot代码,已经研究了两三天,内容太多,一时难理清头绪.不过有一定的linux基础,也懂点gnu扩展,elf格式,连接器还没有 ...
- Spring Boot Profile使用详解及配置源码解析
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 二师兄 来源 | 程序新视界 在实践的过程中我 ...
- Linux移植随笔 tslib
前段时间让Tslib搞晕头了,原来一切都是版本惹的祸.本文只是一个随笔,随笔者,随意用笔写下心得而已,因此不必较真.正如我所欣赏的"乘兴而来,兴尽而返"一样.--估计当年王子猷是赏 ...
- Linux移植随笔:终于解决Tslib的问题了【转】
转自:http://www.latelee.org/embedded-linux/porting-linux-tslib.html 前段时间让Tslib搞晕头了,原来一切都是版本惹的祸.本文只是一个随 ...
- 构建Spring Boot RESTful服务+ Spring Boot执行器
总览 什么是REST? REST(代表状态转移)是Web构建的体系结构样式,已成为用于Web应用程序的标准软件设计模式 . 代表性国家转移一词最早由REST的发起人,HTTP规范的主要作者之一Roy ...
最新文章
- flash 入门课知识小结
- Asp.net中的Cache--HttpRuntim.Cache 和 HttpContext.Current.Cache
- 成功解决当Win10系统进行深度学习的时候发现系统C盘满了,教你如何正确卸载一些非必要的内容
- insert在python中的用法_python中insert用法是什么_后端开发
- springboot @PropertySource+@Value注入properties配置文件属性值
- 如何用木板做桥_如何辨别使用的公园椅是否需要保养
- 搜狗输入法怎么清除输入记忆 搜狗输入法清除输入记忆方法
- 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
- 【codevs1001】舒适的路线,心累的冰茶几
- private函数php,php怎么修改private
- 通向财务自由之路08_入市或市场时机选择
- 如何在Mac视频中添加表情符号
- python系列九:python3迭代器和生成器
- Python学习总结(1)——编程准备和基本语法
- resin session共享 redis_Spring Boot 利用Redis实现session共享
- win10怎么设置默认输入法_微软拼音输入法怎么设置快捷短语
- oracle的创建视图,oracle 创建视图
- 【实习周报】2019年6月 前端开发实习工作周报汇总
- 成都理工大学计算机考研资料汇总
- html左侧悬浮音乐插件,固定在网页底部的HTML5音乐播放器插件代码
热门文章
- 小红书重拳治理虚假种草 再起诉3家通告平台、MCN机构
- 9999元起!荣耀Magic V今日首销:首款骁龙8折叠屏旗舰
- 鸿蒙OS加持!华为MatePad2系列将搭载骁龙888/麒麟9000芯
- 京东公布3.8“她的节”消费数据:奢品服饰成交额同比增长170%
- 苹果发明超薄触摸显示技术:iPhone 12系列有望首发搭载
- 头条搜索回应百度:不交钱也会保护品牌词搜索
- vivo X30系列发布会邀请函曝光:名副其实的“望远镜”
- 快播王欣:区块链今天最重要的成果还只是理念布道
- 前魅族科技高级副总裁李楠:iPhone 11的工业设计完全崩盘
- 小红书疑似被下架 官方回应正在积极沟通