专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

一个小而美的嵌入式shelllettershell

  源码地址:https:github。comNevermindZZTlettershell1Lettershell简介
  熟悉Linux的朋友的都知道,shell包裹在内核之外的人机交互界面,用于用户和内核之间打交道的功能,类似于windowsCMD。通过Shell将输入的命令与内核通讯,好让内核可以控制硬件开正确无误的操作工作。Shell有着不同的分类,比如Bourneshell(sh),Kornshell(ksh)、Cshell(csh)、Bourneagainshell(bash)、tcsh。其中最常用的有csh和bash。Shell本身是一个用C语言编写的程序,它是用户使用UnixLinux的桥梁,用户的大部分工作都是通过Shell完成的。
  然而在嵌入式中,由于资源有限,自然很少使用shell,但随着MCU的资源越来越丰富,一些适用于嵌入式的shell工具也就问世了,本问将要介绍的是Lettershell,Lettershell是一个体积极小的嵌入式shell,当前最新版本是3。X。
  Lettershell有如下功能:命令自动补全,使用TAB键补全命令命令帮助,使用help〔command〕显示命令帮助帮助补全,输入命令后双击TAB键补全命令帮助指令快捷键,支持使用CTRLAZ组合按键直接调用函数shell变量,支持在shell中查看和修改变量值,支持变量作为命令参数登录密码,支持在shell中使用登录密码,支持超时自动锁定2Lettershell移植
  Shell是一个命令行交互式形式存在,那最常规的就是使用MCU的串口资源了,当然也可使用USB模拟的虚拟串口。
  Lettershell的移植比较简单,既然需要占用串口资源,那么首先要准备一个裸机工程,该工程需要事先串口的收发,关于串口的实现请参看逼着文章:
  标准库:https:bruceou。blog。csdn。netarticledetails79341769
  HAL库:https:bruceou。blog。csdn。netarticledetails109190370
  笔者本文以标准库为例讲解。
  1。复制源码
  首先下载lettershell,然后在工程中新建Lettershell目录,将lettershell目录下的src的文件复制到工程目录MiddlewaresLettershell中。
  2。新建接口文件
  在工程用户目录下新建shellport。c和shellport。h文件,当然也可以放在User目录。
  3。配置工程
  打开Keil,添加相应的文件。
  然后添加相应的头文件路径。
  接下来就是实现Lettershell的收发。
  发送代码如下:brief用户shell写paramdata数据voiduserShellWrite(chardata){USARTSendData(USART1,(uint8t)data);等待发送完毕while(USARTGetFlagStatus(USART1,USARTFLAGTC)RESET);}
  接收采用中断的方式,代码如下:briefThisfunctionhandlesUSART1Handler。paramNoneretvalNonevoidUSART1IRQHandler(void){uint8tch;接收中断缓冲if(USARTGetITStatus(USART1,USARTITRXNE)!RESET){chUSARTReceiveData(USART1);chUSART1DR;调用shell处理数据的接口shellHandler(shell,ch);}}
  还需要实现Lettershell初始化接口。brief用户shell初始化voiduserShellInit(void){shell。writeuserShellWrite;shellInit(shell,shellBuffer,512);}
  最后在主函数中初始化即可。briefmianparamNoneretvalintintmain(void){配置SysTick为10us中断一次SysTickInit();USART1配置模式为1152008N1,中断接收USART1Config();userShellInit();for(;;){Delayms(50);}}
  好了,这就移植完成了,编译、下载,连接串口1,使用xshell等工具,打印信息如下:
  很简单吧。3Lettershell应用3。1Lettershell宏定义
  在开发Lettershell应用前,需要知道Lettershell的宏定义,其宏定义在shellcfg。h文件。ifndefSHELLCFGHdefineSHELLCFGHbrief是否使用默认shell任务while循环,使能宏SHELLUSINGTASK后此宏有意义使能此宏,则shellTask()函数会一直循环读取输入,一般使用操作系统建立shell任务时使能此宏,关闭此宏的情况下,一般适用于无操作系统,在主循环中调用shellTask()defineSHELLTASKWHILE1brief是否使用命令导出方式使能此宏后,可以使用SHELLEXPORTCMD()等导出命令定义shell命令,关闭此宏的情况下,需要使用命令表的方式defineSHELLUSINGCMDEXPORT1brief是否使用shell伴生对象一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象defineSHELLUSINGCOMPANION0brief支持shell尾行模式defineSHELLSUPPORTENDLINE0brief是否在输出命令列表中列出用户defineSHELLHELPLISTUSER0brief是否在输出命令列表中列出变量defineSHELLHELPLISTVAR0brief是否在输出命令列表中列出按键defineSHELLHELPLISTKEY0brief是否在输出命令列表中展示命令权限defineSHELLHELPSHOWPERMISSION1brief使用LF作为命令行回车触发可以和SHELLENTERCR同时开启defineSHELLENTERLF1brief使用CR作为命令行回车触发可以和SHELLENTERLF同时开启defineSHELLENTERCR1brief使用CRLF作为命令行回车触发不可以和SHELLENTERLF或SHELLENTERCR同时开启defineSHELLENTERCRLF0brief使用执行未导出函数的功能启用后,可以通过exec〔addr〕〔args〕直接执行对应地址的函数attention如果地址错误,可能会直接引起程序崩溃defineSHELLEXECUNDEFFUNC0briefshell命令参数最大数量包含命令名在内,超过8个参数并且使用了参数自动转换的情况下,需要修改源码defineSHELLPARAMETERMAXNUMBER8brief历史命令记录数量defineSHELLHISTORYMAXNUMBER5brief双击间隔(ms)使能宏SHELLLONGHELP后此宏生效,定义双击tab补全help的时间间隔defineSHELLDOUBLECLICKTIME200brief管理的最大shell数量defineSHELLMAXNUMBER5briefshell格式化输出的缓冲大小为0时不使用shell格式化输出defineSHELLPRINTBUFFER128briefshell格式化输入的缓冲大小为0时不使用shell格式化输入noteshell格式化输入会阻塞shellTask,仅适用于在有操作系统的情况下使用defineSHELLSCANBUFFER0brief获取系统时间(ms)定义此宏为获取系统Tick,如HALGetTick()note此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定defineSHELLGETTICK()0briefshell内存分配shell本身不需要此接口,若使用shell伴生对象,需要进行定义defineSHELLMALLOC(size)0briefshell内存释放shell本身不需要此接口,若使用shell伴生对象,需要进行定义defineSHELLFREE(obj)0brief是否显示shell信息defineSHELLSHOWINFO1brief是否在登录后清除命令行defineSHELLCLSWHENLOGIN1briefshell默认用户defineSHELLDEFAULTUSERletterbriefshell默认用户密码若默认用户不需要密码,设为defineSHELLDEFAULTUSERPASSWORDbriefshell自动锁定超时shell当前用户密码有效的时候生效,超时后会自动重新锁定shell设置为0时关闭自动锁定功能,时间单位为SHELLGETTICK()单位note使用超时锁定必须保证SHELLGETTICK()有效defineSHELLLOCKTIMEOUT0601000endif
  shellcfg。h文件已经注释了,笔者就不再赘述了。3。2Lettershell内置命令
  在Lettershell中默认内置了一些shell命令,在shell中输入help后回车或者直接按下Tab键,就可以打印当前系统支持的所有命令。
  按下Tab键后可以列出当前支持的所有命令。以下为按下Tab键后打印出来的当前支持的所有显示Lettershell中的命令,左边是命令名称,右边是关于命令的描述:
  自定义shell命令
  自定义的shell命令,可以在shell模式下被运行,将一个命令导出到shell模式可以使用如下宏接口:SHELLEXPORTCMD(attr,name,func,desc)
  参数
  描述
  attr
  命令属性
  name
  命令名
  func
  命令函数
  desc
  命令描述
  原型如下:defineSHELLEXPORTCMD(attr,name,func,desc)constcharshellCmdname〔〕name;constcharshellDescname〔〕desc;constShellCommandshellCommandnameSECTION(shellCommand){。attr。valueattr,。data。cmd。nameshellCmdname,。data。cmd。function(int()())func,。data。cmd。descshellDescname}
  导出无参数命令时,函数的入参为void,示例如下:voidhello(void){printf(hellolettershell!);}导出到命令列表里SHELLEXPORTCMD(SHELLCMDPERMISSION(0)SHELLCMDTYPE(SHELLTYPECMDFUNC),hello,hello,hello);
  系统运行起来后,在shell控制台按tab键可以看到导出的命令,运行hello命令,运行结果如下所示:
  导出有参数的命令时,还可传入参数。导出有参数命令示例如下:voidparametertest(intnum,charstr){printf(parametertest:numd,strs!r,num,str);}导出到命令列表里SHELLEXPORTCMD(SHELLCMDPERMISSION(0)SHELLCMDTYPE(SHELLTYPECMDFUNC),parametertest,parametertest,parametertest);
  系统运行起来后,在shell控制台按tab键可以看到导出的命令,运行parametertest命令,运行结果如下所示:
  值得注意的是,命令参数的最大个数在中shellcfg。h配置,默认最大是8,但是命令占了一个参数,因此用户可用的应该是7个。briefshell命令参数最大数量包含命令名在内,超过8个参数并且使用了参数自动转换的情况下,需要修改源码defineSHELLPARAMETERMAXNUMBER8
  Lettershell不仅可以使用命令的方式运行程序,还可像Linux的终端一样,还能通过上下键能选择历史命令,历史命令的个数默认最大为5个。brief历史命令记录数量defineSHELLHISTORYMAXNUMBER5
  非常的方便,Lettershell很强大,还有很多功能可玩,本文先讲到这里,后面再深入讲解Lettershell的设计思想。

冬游黔东南,天天来过节11月4日,记者从省政府新闻办召开的新闻发布会上获悉,黔东南民族文化丰富多彩。走进冬季的黔东南,就沉浸在歌的海洋舞的世界。黔东南州是全国30个少数民族自治州之一,总人口488。65再见了!荷塘变农田,三圣乡再无荷塘月色近日,网络流传出一张照片,照片内的内容让很多成都人大吃一惊!从2022年10月13日起,荷塘月色区域启动农田整治区复耕复垦工作!换句话说成都人的记忆三圣乡荷塘月色,以后就莫得了!这1924年的河北唐山马兰峪,皇家墓葬旁百姓生活的真实影像河北唐山遵化马兰峪是清东陵所在地,这里有着规模宏大的清代皇室墓葬群,埋葬着五个皇帝十五位皇后一百三十六位妃嫔三个阿哥和两名公主,共一百六十一名皇室成员。1924年,美国摄影师甘博和云南福建联手共同打造新高铁,沿线这两地有福了,将快速发展改革开放以来,我国一直注重于经济发展,现在我国已成为了世界上的第二大经济体,祖国的强大是我们肉眼可见的,从前的吃饱穿暖变成了,现在的吃好喝好,社会的发展提高了我们的生活水平。许多省出境旅游开放后你最想去的国家2019年春节一场突如其来的新冠疫情改变了众多人的人生轨迹。这也是到目前为止在国外度过的最后一个春节,作为一名出境领队(啰嗦一下带客人出国旅游的叫领队,在国内带团的叫导游)像往年的中国天眼发现诡异宇宙云团,比银河系大20倍史蒂芬五重奏被一团巨大的宇宙云包裹着。CSANASAESASTScI一个国际科研团队近日用中国的天眼(五百米口径球面射电望远镜,FAST)在飞马座发现了一团神秘的宇宙云。这团宇宙云陈思进我在美国治痛风颠覆全部中国概念医生们常常说,健康是1,而其余的财富地位权力等等都是后面的0,如果没有了1,所有的0都是没有意义的。不过,大部分人都要等到失去了健康之后,才能懂得这个道理。虽然现代医学科技能够治愈中国足协处罚部分欠薪俱乐部中国青年报客户端北京11月5日电(中青报中青网记者郭剑)北京时间今天中午,中国足协官网刊登通知,公布对河北足球俱乐部(中超)武汉长江足球俱乐部(中超)和湖南湘涛足球俱乐部(中乙)各中国好声音第十一次集结华少如约而至助力梦想国内音综领域的王牌综艺中国好声音,以音乐的名义,在今年夏天完成了第十一次集结。一如既往邀请了在不同音乐沃土中成长起来的顶尖导师们李克勤廖昌永李玟李荣浩梁静茹。自8月5日起的每周五晚新疆一天彻底乱了!邱彪上任,补进大小外援,齐麟则在秀恩爱今天对于新疆的变动确实是大,毕竟连续曝光签约的消息,不过全队实力确实是在提升。特别是对于邱彪来说,他加盟新疆队之后,肯定可以让球队变得更为强势。因为在深圳的时候,邱彪的执教能力是不风向真的变了!本田欲将生产线撤出中国,中国汽车却加速出海风向变了,一路称霸中国的本田汽车,却在前段时间传出要将生产线撤出中国市场的消息。自1998年进入中国市场以来,本田汽车销量一贯良好,经常仅次于大众和丰田,排在国内汽车市场第三位,为
理想全新L8内饰曝光理想ONE换代,长联屏变组合屏今日,又有关于换代理想ONE的消息流出了。汽车博主理想嘉大D发布了理想L8内饰的谍照,这也是该车内饰首次得到曝光。理想ONE换代后将更改命名,变为L8,内部代号X02,它也将基于理脸上有斑怎么办?教你5个小妙招,让皮肤干净嫩滑脸上有色斑影响美观,黄褐斑老年斑晒斑雀斑等都让人烦恼,脸上有斑要怎么调理呢?1。保证睡眠时间熬夜睡眠不足,会让皮肤衰老,色素沉着会更厉害。保证8小时的睡眠时间,最好睡前做做轻柔运动喋血复仇大更新正式上线现已可以投票踢人昨天(6月8日),TurtleRockStudios发布了多人求生类射击游戏喋血复仇的6月大更新。在新增了腐化卡传奇物品以及新外观的同时,还发布了丧尸和卡片的新平衡补丁,并优化了游史上第三高套装!乐高正式发布10303翻滚过山车!2个大回环新的尖叫旅程开启了!乐高集团正式发布了10303翻滚过山车,包含2个大回环及直立部分,高度近1米!套装含有3756片颗粒,售价3399元,将于7月1日上市。这是第一个带回环的乐高过考试期间,有考生把高考数学题发到群内?官方作出回应导语高考不仅是学生人生中的大事,还是一个家庭的大事。为了备战高考,学生寒窗苦读十多年,流了很多汗水,付出了很多心血。好在有家长在学生的身后默默地支持着学生,为学生支付教育经费,家长6月8日油价最新消息喜迎十一涨,92号汽油全面调价6月8日全国油价调整消息现在是6月8日下午15点40分,国际原油价格发生变化,全国92号汽油也将进行全面调价,总体呈现十一涨!国际原油价格方面截止8日下午1500,纽约商品交易所7同级新标杆,东风标致新款408正式亮相,搭载1。6T6AT日前,Auto情报处从相关渠道获得了,东风标致新款408的实拍图和最新信息,新车将采用全新的设计风格,预计在年内正式上市从实拍图来看,新车在外观方面跟全新一代308基本保持一致,车激活运动基因!本田全新思域Hatcback版正式亮相目录,溜背亮了上一代思域之所以能成为街车,均衡且运动化的设计功不可没,直白点就是偏运动化的造型勾起了年轻一代消费群体的所有兴趣,价格也适中,而新一代思域三厢版虽说是传承全新的家族元素(通俗点说就果然气势十足,全新领克0303正式亮相目录,实车看着更带感新一代领克0303其实毫无悬念,原因很简单,早就曝光了,3月22日的专利申报图里就已正式现身,实车无非就是比专利申报图晚了两个多月而已,当然了目录申报图中的实车造型还是要比专利申报伊儿汗国阿八哈的统治1265年2月,旭烈兀去世后,长子阿八哈继承其位。阿八哈仍然住在阿塞拜疆,但他把都城从蔑剌合迁到了桃里寺。在处理与忽必烈的关系上,他秉承了旭烈兀的宗旨,他把自己当作忽必烈的副手,并朋友圈早上好说说正能量图片,拼搏成就梦想,撸起袖子加油干生活不是等着暴风雨过去,而是学会在风雨中起舞!周四,早上好!幻想在漫长的生活中顺水行舟的人,他的终点在下游。只有敢于扬起风帆顶恶浪的勇士,才能争到上游。周四,早上好!如果事与愿违,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网