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
个字符是控制字符或通信专用字符,其余均为可显示字符。


你可能感兴趣的:(u-boot移植随笔:u-boot shell与ASCII码)