




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、uShell项目开发1目录1绪论 .3.2需求分析 .5.2.1环境需求 . 硬件环境: .软件环境:.功能需求.5.2.2软件构成 .开发条件.开发期间.开发语言.开发使用的技术、知识 .82.2.5主要术语介绍. 其他 .9.3概要设计 .103.1模块概述 .1.03.1.1模块结构图 .103.1.2模块中单元的详细描述 .1 13.2外部模块接口表 .123.3内部单元接口表 .133.4状态迁移图 .213.5人机界面实现方法 .223.6异常处理 .233.7执行时间估
2、计 .233.8源码目录文件结构 .254详细设计 .284.1主要数据结构描述 .284.1.1格式化输出 .284.1.2函数查找 .29uShell项目开发24.1.3关键结构说明.304.2参考资料.314.3单元设计.314.3.1函数一览表 .314.3.2宏定义一览表 .345系统测试与分析 .365.1测试环境.365.2测试方法.365.3测试用例.365.4测试结果.385.5测试总结.396成果演示 .406.1查看系统当前任务.4.06.2查看系统当前相关系统资源.406.3挂起任务.426.4演示总结.427结论 .43致谢.错误!未定义书签。参考文献 .44uShe
3、ll项目开发31绪论TRON (The Real-time Operating system Nucleus 是由东京大学坂村健博士于1984年提出的实时嵌入式操作系统。规范经过多年发展,TRON已成为日本电子产业现行的基础构架,这一系统已经安装到了全球30亿到40亿台家用电子产品当中,远远超过 Windows的普及程度。尽管在个人电脑领域知名度几乎 为零,但TRON现在却占据了全球微处理器操作系统市场上大约60%的份额,成为低价高性能嵌入式系统的典范。但随着嵌入式系统的高功能、网络化,软件 开发和调试都变得非常复杂。TRON相关软件的可移植性、可重用性出现了问题。 为了实现更为理想的实时操作
4、系统的嵌入式计算结构,出现了T-Engine项目计划,为了更进一步实现标准化,基于 TRON的T-Kernel由此而来。T-E ngine是为了在短时间内高效开发实时嵌入式系统而设计的,由标准化硬 件结构和标准开源实时操作系统核心(T-Kernel)组成的嵌入式标准开放平台。 在T-Engine开发过程中,搭载的CPU为可变的,而规定了其他硬件结构规范、 操作系统核心界面规范、对象数据格式规范等要素,使TRON在标准化的基础结构上,具备充分的外围资源及开发环境。 这个开放式标准平台结构的最大目标 是将CPU从基础结构中独立出来,使在T-Kernel上开发的中间件可不依存于 CPU 结构而移植。
5、T-Kernel是运行于标准T-Engine/片Engine硬件平台上的标准实时操作系统 核心软件。与其他开源软件所不同的是,它是单一源代码软件,具有强标准化特 点,以保证其作为各种中间件发布的平台。操作系统与外部最主要的接口就叫做 shello shell是操作系统最外面的一层。 它不属于内核部分,而是在核心之外。shell管理使用者与操作系统之间的交互: 等待使用者输入,向操作系统解释使用者的输入,并且处理各种各样的操作系统 的输出结果。在当今嵌入式开发过程中,如何提高开发效率,缩短开发周期至关重要。在 T-Kernel在嵌入式领域运用如此广泛,而在设计与研发当中,如果有与 T-Kerne
6、l 相关的开发研究调试运用工具无疑会给开发者带来便捷, 提高开发效率,同时对 于想要学习和研究的开发者,是否能通过一种便捷实践的方式来学习T-Kernel, uShell项目开发4而uShell能满足这些要求,uShell是基于T-Kernel操作系统上的一个命令行应用 程序,主要功能是通过串口输入命令,根据命令来查询和修改T-Engine开发板上 T-Kernel中的任务、邮箱、事件标志、信号量、内存池系统资源状态。这样在开 发过程中随时查询修改相关信息,可方便地进行调试,缩短开发周期从而在开发 过程中提高开发效率。同时对于学习研究T-Kernel的开发者来说,不是单从理论 方面来认知它,需
7、要理论学习的同时加以实践,而uShell能为开发者提供实践途 径,从而为开发者提高学习和研究 T-Kernel的效率。uShell项目开发52需求分析环境需求2.1.1硬件环境:在该项目中,使用的硬件是 atmel公司的AT91SAM9261开发板,主板为单 板设计,CPU直接集成在主板上。AT91SAM9261是以 ARM926EJ-S ARM Thumb 处理器为核心的完全的片上系统, 它扩展了 DSP指令集和Jazelle Java加速器。 主时钟频率 190MHz,性能高达 210 MIPS。外部总线接口包括支持同步 DRAM( SDRAM )和支持静态存储器的控制器,并有特殊接口电路
8、以支持 NOR FLASH、NAND Flash。该项目中会把 mot 文件加载至U NOR FLASH,NOR FLASH 为16bit 4M字节。在开发uShell过程中,主要功能是通过串口输入命令,根据命 令来查询和修改T-Engine开发板上T-Kernel中的任务、邮箱、事件标志、信号 量、内存池系统资源状态。为了调试和烧制可执行文件到开发板的flash上我们还需要J-Link。2.1.2软件环境:AT91SAM9261开发板上加载的是嵌入式实时操作系统 T -Kernel。为了把我 们的T-Kernel操作系统和我们开发的程序集成到一个可执行文件上,我们需要专 门的SDK,其中集成
9、了 T-Kernel操作系统,同时包含了 T-Kernel操作系统的内 核API的接口,出了这些当然其中还包含有一部分标准 C库。除了比较重要的SDK夕卜,我们需要一个集成开发环境,该开发环境要具备 两个条件,第一,它能加载我们的 SDK,第二,它的编译器要是 GCC ARM编 译器。这里我们使用的是具有强大插件功能Eclipse集成开发环境,当然其中还得安装一些插件。uShell项目开发62.1.3功能需求功能概要1. USH是作为T-Kernel的应用运行的程序,它具有如下功能:2. 根据命令,参考/操作T-Kernel的各种状态。3. 用户程序的加载和卸载。4. 当处于等待输入命令状态时
10、,在超级终端上显示下面的提示符:5. USH%6. 接受用户输入命令并执行。7. 以*开始的行是注释,被视为无效输入。8. 命令中有数值参数和字符串参数。9. 数值参数有如下输入方法:10. H后面连接的是16进制的数字串(09, AF)或者Ox后面连接的是16 进制的数字串(09, AF)11. 后面连接的是10进制的数字串(09)12. B后面连接的是2进制的数字串(01)13. 无前缀的数字串的进制,为radix命令设定的默认进制。详细功能can wup撤消对任务的唤醒请求chg pri更改任务的优先级clr flg清除EventFlag的位模式del tsk删除任务frsm tsk强制
11、解除任务的所有挂起get reg参考任务的寄存器信息h帮助命令lodspg执行用户扩展模块prompt提示符设定radix基数的设定ref alm参考系统中 Alarm handler的状态uShell项目开发7ref cyc参考系统中Cyclic handler的状态ref flg参考系统中Eve nt Flag的状态ref mbf参考系统中Message Buffer的状态ref_mbx _参考系统中Mailbox的状态ref_mpf_ 参考系统中固定大小内存池的状态ref_mpl _ 参考系统中可变大小内存池的状态ref_mtx _ 参考系统中 Mutex的状态ref_por _ 参考系
12、统中Rendezvous Port的状态ref_sem _ 参考系统中信号量的状态ref_tsk_ 参考系统中任务的状态rel_wai _ 解除任务的等待状态rot_rdq _ 反转同优先级任务队列的执行时序rsm_tsk_强制解除任务的一次挂起set_flg_ 设置 Event Flag的位模式set_pow _ 设定系统的省电模式sig_sem _ 释放信息量计数值sta_tsk _ 启动任务sus_tsk_ 挂起任务ter_tsk_ 强行终止任务wup_tsk _ 唤醒任务软件构成2.2.1开发条件Shell是作为一个T-Kernel下可以动态加载的应用程式运行的222开发期间开发期间:
13、2010/3/15-2010/5/21uShell项目开发82.2.3开发语言开发语言:C选择理由:C语言一直是嵌入式系统开发的最佳选择,基于C语言的开发有代码执行效 率高,可移植性好,能访问硬件等特性,且 T-Kernel提供的接口是C语言接口, 因为整个项目我们都要用到T-Kernel的内核接口,所以我们选择用 C语言。2.2.4开发使用的技术、知识除了要熟悉整个开发过程中用到的开发环境Eclipse外,这里我们还得熟悉的掌握T-Kernel操作系统的内核API,及T-Kernel操作系统中的任务(类似于进 程)的调度关系,因为在这个项目中我们会创建三个主要的任务, 分别负责管理,接受输入
14、,处理输入的命令。当然任务间的通信也是我们这个项目中的一个非常 重要的部分,输入的命令是通过T-Kernel中的一种通信机制把用户输入的命令传 给别一任务进行解析,并作出相应的处理的。最后我们还要用到一个重要的技术 就是嵌入式开发的调试技术,这是在嵌入式开发中不可少也不能少的一个部分。2.2.5主要术语介绍任务:并行程序执行的基本单元称为“任务”。一个任务的程序是顺序执行 的;而多个不同任务的程序却是并行执行的。 该并行处理只是概念上的现象。 通 过内核控制任务间的时间共享来实现并行执行。由晞:邮箱是一个通过在系统(共享)内存空间传递消息实现同步和通信的 对象,它包含一个用来发送消息的消息队列
15、和一个用于等待消息的任务队列。事件标志:当任务要与多个任务同步时,就要用到事件标志。事件标志是一 个用来实现同步的对象,由多个位组成,用来指示对应事件存在的标志,除了有 用来指示对应事件存在的位模式外,事件标志还有一个等待事件标志的任务队 列,当等待队列中的任务发现它等待的那个位被标记了,这时它会被从等待任务队列删除并把它转换为就绪状态。消息缓冲区:消息缓冲区是一个通过传递大小可变的消息来实现同步和通信 的对象。每个消息缓冲区有一个等待发送消息的消息队列,和一个等待接收消息 uShell项目开发9的任务队列。在本项目中,输入的命令通过串口传给输入任务, 输入任务与解析 任务之间的同步和通信是通
16、过消息缓冲区实现的。任务间同步:即任务间信息的同步(传递)。2 2 6其他项目管理按照T-Engine实验室规定,采用SVN作为源码管理工具。流程按 照天府软件园有限公司 PEO中心开发流程进行。编码规范也使用天府软件园C代码编码规范。uShell项目开发103概要设计模块概述Shell主要的功能是通过串口输入命令,根据命令来调用T-Kernel的系统功能 调用,进而查询或者改变系统对象的状态。为了考虑以后重用、扩展、移植、本 地化,在设计时考虑以下的思想:采用一个Mai n入口程序和三个任务的结构:Ma in主要负责启动一个管理任 务,管理任务负责启动另外二个任务, 其中一个任务是负责监听输
17、入命令,格式化后,转为内部的消息,另外一个任务是负责根据消息,查询命令函数表,执行 相应的功能查询单元。1. 采用命令函数表管理所有的命令和对应的参数检查函数、执行函数。2. 所有的命令功能按照任务、事件标志、信号量、内存,邮箱,周期,警报,通用等分类归入相应的单元。3. 采用携带时间戳的命令结构,便于统计命令的执行时间。4. 单独的语言单元保存错误信息和提示信息,这样容易进行本地化。5. 单独设计错误处理机制,统一处理严重错误。6. 单独的扩展库单元保存所有针对标准 C库函数和T-Kernel系统函数的扩 展函数,共同函数必须设计成为可以重入的结构。7. 不使用系统静态资源和固定内存,便于可
18、重加载。3.1.1模块结构图uShell项目开发11uShellUSH O01USH O02TKL厂USH_Parseo3SH_I撐撐USH_lnputStrinTKL O03GridTimeT-kernel丄DSOSSMRTC本概要设计采用结构图的方法,逐层分解模块,一直到以文件为单位的单元,结构图参见下图DriversCon soleSerial IO图模块中单元的详细描述模块详细描述见表3.1,该表对图3.1中的各个模块的单元类型,及对相应 功能模块做了简要功能描述。表3.1模块详细描述No.单元名单元类型功能描述1USH_Mai n普通Shell的入口,创建及启动USH
19、 Kerl任务。2USH_Kerl任务管理任务,启动时创建 USH_Parse和USH_lnput任务, 退出时结束 USH_Parse和USH_Input任务;创建任务 间用的消息缓冲区USH MainUSH Kerl103102USH 107USH I01USH 104rorTKUSH一_O01KT06TK O02TK O03 占TK-O04USH_I08USH SH 109TK O01.匕 TK-O5TKTKuShell项目开发123USH_I nput任务获取用户的输入并格式化,并将格式正确的命令通过消息缓冲区发给任务 USH Parse进行处理。uShell项目开发134USH_Pa
20、rse任务接受消息缓冲区发送的用户命令,解析后,查询命令函数表,并执行命令功能函数。5USH_Tsk普通执行 Task 相关命令,包括 ref_tsk、sta_tsk、del_tsk、 sus_tsk、ter_tsk 、wup_tsk、can_wup、rsm_tsk、 frsm_tsk 、rel_wai 、chg_pri。6USH_Flg普通执行事件标志相关命令,包括ref_flg 、clr_flg 、set_flg 。7USH_Mpf普通执行固定内存池相关命令,包括ref_mpf。8USH_Cyc普通执行周期性处理相关命令,包括ref cyc。9USH_Sem普通执行信号量相关命令,包括re
21、f sem、sig sem。10USH Mbx普通执行邮箱相关命令,包括ref mbx。11USH Alm普通执行警报处理相关命令,包括ref alm 。12USH_Comm普通执行其他一些命令,包括set_pow、h/?、prompt、sleep、radix、exit、date。13USH_La ng普通公共单兀,疋乂所有错误提小和命令提小等信息,便于本地化。14USH Error普通公共单元,定义错误处理的机制,统一处理错误。15TKL_Stri ng普通公共单元,扩展T-Kernel下C标准库的字符串处理 函数。16TKL_Time普通公共单元,扩展T-Kernel下C标准库的时间日期处
22、 理函数。17TKL Grid普通公共单元,扩展命令行下表格输出函数。外部模块接口表外部接口的详细描述,见表3.2表3-2外部模块接口表No.接口 ID接口接口类型接口内容描述1USH O01ER mai n( W ac, B *av)函数Shell 作为 T-Kernel 应uShell项目开发14用的入口函数2USH_O02 wup_tsk USH_KerllD命令通过命令唤醒 USH_Kerl任务内部单元接口表内部接口的详细描述,见表3.3。表3.3内部模块接口表No.接口 ID接口接口类型接口内容描述1.1USH_I01void USH_Kerl(INT stacd,VP exi nf
23、)任务作为创建USH_Kerl任务的入口函数。1.2USH_I01ID USH_KerlI ni t(void)函数初始化USH_Kerl任务。2.1USH_I02void USH_Parse(INT stacd,VP exi nf)任务作为创建USH_Parse任务的入口函数。2.2USH_I02ID USH_ParseI ni t(void)函数参数任务初始化3.1USH_I03void USH_I nput(INT stacd,VP exi nf)任务作为创建USH_lnput任务的入口函数。3.2USH I03ID USH_I nputl ni t(void)函数任务参数初始化4.1U
24、SH_I04ID USH_CommCreFlg(void)函数作为创建事件标志的函 数。4.2USH_I04TMO USH_CommGetSlpTim(void)函数返回睡眠时间的入口函 数。5.1USH_I05ER tk_s nd_ mbf(ID stacd, VP msg,INT msgsz, TMO tmout)消息缓冲区输入监听任务向缓冲区发 送消息。5.2USH_I05INT tk_rcv_mbf(ID stacd, VP msg, TMO tmout)消息缓冲区从消息缓冲区接收消息。6.1USH I06-uShell项目开发157.1USH_IO7ER USH_TskDel(W P
25、arC nt,UB *paParStr)函数删除任务的入口7.2USH_IO7ER USH_TskChkDel(W ParC nt,UB *paParStr)函数核对删除任务的命令的参数7.3USH_I07ER USH_TskSta(W ParC nt,UB *paParStr)函数启动任务的入口7.4USH_I07ER USH_TskChkSta(W ParC nt,UB *paParStr)函数核对启动任务的命令的参 数7.5USH_I07ER USH_TskTer(W ParC nt,UB *paParStr)函数终止其他任务的入口7.6USH_I07ER USH_TskChkTer(W
26、 ParC nt,UB *paParStr)函数核对终止其他任务命令的参数7.7USH_I07ER USH_TskChkChgPri(W ParC nt,UB *paParStr)函数改变任务的优先级7.8USH_I07ER USH_TskChkChgPri(W ParC nt,UB *paParStr)函数核对改变任务的优先级的命令的参数7.9USH_I07ER USH_TskRef(W ParC nt,UB *paParStr)函数查询任务状态的入口7.10USH_I07ER USH_TskChkRef(W ParC nt,UB *paParStr)函数核对查询任务状态的命令的参数uShe
27、ll项目开发167.12USH_IO7ER USH_TskWup(W ParC nt,UB *paParStr)函数唤醒其他任务的入口7.13USH_IO7ER USH_TskChkWup(W ParC nt,UB *paParStr)函数核对唤醒其他任务的命令的参数7.14USH_I07INT USH_TskCa nWup(W ParC nt,UB *paParStr)函数取消唤醒其他任务的入口7.15USH_I07INT USH_TskChkCa nWup(W ParC nt,UB *paParStr)函数核对取消唤醒其他任务的命令的参数7.16USH_I07ER USH_TskRelWa
28、i(W ParC nt,UB *paParStr)函数释放等待状态的入口7.17USH_I07ER USH_TskChkRelWai(W ParC nt,UB *paParStr)函数核对释放等待状态的命令的参数7.18USH_I07ER USH_TskSus(W ParC nt,UB *paParStr)函数挂起其他任务的入口7.19USH_I07ER USH_TskChkSus(W ParC nt,UB *paParStr)函数核对挂起其他任务的命令的参数7.20USH_I07ER USH_TskRsm(W ParC nt,UB *paParStr)函数恢复挂起其他任务的入口7.21USH
29、_I07ER USH_TskChkRsm(W ParC nt,UB *paParStr)函数核对恢复挂起其他任务的命令的参数uShell项目开发177.22USH_IO7ER USH_TskFrsm(W ParC nt,UB *paParStr)函数强制恢复挂起其他任务的入口7.23USH_IO7ER USH_TskChkFrsm(W ParC nt,UB *paParStr)函数核对强制恢复挂起其他任务的命令的参数7.24USH_I07ER USH_SemSig(W ParC nt,UB *paParStr)函数释放信号量的入口7.25USH_I07ER USH_SemChkSig(W Pa
30、rC nt,UB *paParStr)函数核对释放信号量的命令的参数7.26USH_I07ER USH_SemRef(W ParC nt,UB *paParStr)函数查询信号量状态的入口7.27USH_I07ER USH_SemChkRef(W ParC nt,UB *paParStr)函数核对查询信号量状态的命令的参数7.28USH_I07ER USH_FlgClr(W ParC nt,UB *paParStr)函数清除事件标志的入口7.29USH_I07ER USH_FlgChkClr(W ParC nt,UB *paParStr)函数核对清除事件标志的命令的参数7.30USH_I07E
31、R USH_FlgRef(W ParC nt,UB *paParStr)函数查询事件标志的入口7.31USH_I07ER USH_FlgChkRef(W ParC nt,UB *paParStr)函数核对查询事件标志的命令的参数uShell项目开发187.32USH_IO7ER USH_FlgSet(W ParC nt,UB *paParStr)函数设置事件标志的入口7.33USH_IO7ER USH_FlgChkSet(W ParC nt,UB *paParStr)函数核对设置事件标志的命令的参数7.34USH_I07ER USH_MbxRef(W ParC nt,UB *paParStr)
32、函数查询邮箱状态的入口7.35USH_I07ER USH_MbxChkRef(W ParC nt,UB *paParStr)函数核对查询邮箱状态的命令的参数7.36USH_I07ER USH_MpfRef(W ParC nt,UB *paParStr)函数查询固定内存池大小的状态的入口7.37USH_I07ER USH_MpfChkRef(W ParC nt,UB *paParStr)函数核对查询固定内存池大小状态的命令的参数7.38USH_I07ER USH_AlmRef(W ParC nt,UB *paParStr)函数查询警报处理程序的状态的入口7.39USH_I07ER USH_Alm
33、ChkRef(W ParC nt,UB *paParStr)函数核对查询警报处理程序状态的命令的参数7.40USH_I07ER USH_CycRef(W ParC nt,UB *paParStr)函数查询周期性处理程序的状态的入口7.41USH_I07ER USH_CycChkRef(W ParC nt,UB *paParStr)函数核对查询周期性处理程序的状态的命令的参数uShell项目开发197.42USH_IO7ER USH_TskGetReg(W ParC nt,UB *paParStr)函数获得任务寄存器的内容的入口7.43USH_IO7ER USH_TskGetChkReg(W P
34、arC nt,UB *paParStr)函数核对获得任务寄存器的内容的命令的参数7.44USH_I07ER USH_TskRotRdq(W ParC nt,UB *paParStr)函数翻转就绪队列的入口7.45USH_I07ER USH_TskRotChkRdq(W ParC nt,UB *paParStr)函数核对翻转就绪队列的命令的参数7.46USH_I07ER USH_TskSetPow(W ParC nt,UB *paParStr)函数设置电源模式的入口7.47USH_I07ER USH_TskSetChkPow(W ParC nt,UB *paParStr)函数核对设置电源模式的命
35、令的参数7.48USH_I07ER USH_CommChkPar(W ParC nt,UB *paParStr)函数核对参数的合法性7.49USH_I07ER USH_CommHelp(W ParC nt,UB *paParStr)函数输出帮助信息的入口7.50USH_I07ER USH_CommChkHelp(W ParC nt,UB *paParStr)函数核对输出帮助信息的命令的参数7.51USH I07UB USH CommGetRadix(void)函数进制的设定的入口7.52USH_I07ER USH_CommExit(W ParC nt,函数退出系统的入口uShell项目开发20
36、UB *paParStr)7.53USH_IO7ER USH_CommChkExit(W ParC nt,UB *paParStr)函数核对退出系统的命令的参 数7.54USH_IO7ER USH_CommDate(W ParC nt,UB *paParStr)函数显示和设定日期的入口7.55USH_I07ER USH_CommChkDate(W ParC nt,UB *paParStr)函数核对显示和设定日期的命令的参数7.56USH_I07UB* USH_CommGetPrompt(void)函数获取当前提示符的指针8.1USH_I08ER USH_CommSetPrompt(W ParC
37、 nt,UB *paParStr )函数设置提示符的入口8.2USH_I08ER USH_CommChkSetPrompt(W ParC nt,UB *paParStr)函数核对设置提示符的命令的参数8.3USH_I08ER USH_CommSetRadix(W ParC nt,UB *paParStr)函数设置进制的入口8.4USH_I08ER USH_CommChkSetRadix(W ParC nt,UB *paParStr)函数核对设置进制的命令的参 数9.1USH I09void USH La ngMsg(W MsgID)函数输出提示信息的函数10.1TKL_O01UW TKL_St
38、ri ng2Array(B* pStri ng,B* aStrArray ,UW Row,B* pDelimiter)函数把字符串按照指定的多个 分隔符转换成数组,返回 实际转换的数组维数,同 时源字符串的前后空格会 被删除10.2TKL O01UB TKL Stri ngTrim(函数去除字符串前后的空格,uShell项目开发21B* pSourStr)返回实际删除的空格数10.3TKL_O01 B* TKL_Stri nglower(B* pSourStr)函数转换字符串为小写,返回转换后的字符串指针10.4TKL_O01B* TKL_Stri ngUpper(B* pSourStr)函数
39、转换字符串为大与,返回转换后的字符串指针10.5TKL_O01UW TKL_Stri ngtol(B *pStr,UB Base)函数按照指定进制把字符串转换为整数10.6TKL_O01BOOL TKL_Stri nglsDigit(B *pStr)函数判断字符串中是否为数字串,是返回真10.7TKL_O01UW TKL_ltoStri ng(UW Val,B *pStr,UB Base,UB MaxLe n)函数按照指定的进制和最大长 度,把32位整数转换为字 符串,返回转换后的字符 串长度11.1TKL_O02ER TKL_Gridl nit(TKL GRID* pGrid)函数初始化表信
40、息11.2TKL_O02ER TKL_GridColI nit(TKL_GRID* pGrid,B* pTitle,UW Width,TKL_GRID_ALIGNMENTAlig n)函数初始化列信息11.3TKL_O02ER TKL_GridColAddl nt(TKL_GRID* pGrid,W Val,W Cnt)函数增加整型列数据11.4TKL_O02ER TKL_GridColAddStr(TKL_GRID* pGrid,B* Val,函数增加字符型列数据uShell项目开发22W Cnt)11.5TKL_O02ER TKL_GridPutTitle(TKL_GRID* pGrid)
41、函数输出定义的Grid的标题 行11.6TKL_O02ER TKL_GridPutRow(TKL_GRID* pGrid)函数输出定义的Grid的数据 行11.7TKL_O02W TKL_GridGetCols(TKL_GRID* pGrid)函数获得Grid列数12.1TKL_O03ER TKL_TimeSet(struct tm * pTime)函数设置日期时间struct tm 参见标准库time.h12.2TKL_O03ER TKL_TimeGet( struct tm * pTime)函数获得日期时间12.3TKL_O03BOOL TKL_TimelsYear(UB* pYear)函
42、数判断是否是年字符串12.4TKL_O03BOOL TKL_TimeIsM on( UB* pMon)函数判断是否是月字符串12.5TKL_O03BOOL TKL_TimelsMday(UB* pMday)函数判断是否是日字符串12.6TKL_O03BOOL TKL_TimelsHour(UB* pHour)函数判断是否是时字符串12.7TKL O03BOOL TKL TimeIsMi n( UB* pMi n)函数判断是否是分字符串12.8TKL O03BOOL TKL TimelsSec(UB* pSec)函数判断是否是秒字符串3.4状态迁移图状态迁移图见图3.2,该图显示出T-Kerne
43、l内核中任务的几大重要状态,本 项目中的三个任务主要是在running、ready waiting态之间切换,监听输入的任 务长时间处于running态,等待接收用户命令的输入,而响应命令的任务多数处 于waiting态等待事件标志的发生,当它等待的事件标志位被设置后,它转入ready 态。而管理任务则在建立好监听任务和处理任务后长时间处于ready态,直到接uShell项目开发23ReadypreemptionRunningdispatchtk wup tsk()waitWaitingtk_sta_tsk()tk_ext_rak()tk_ter_tsk()tk_exc_tsk()到的命令为e
44、xit,才转为running态去结束监听任务、处理任务和自己,最终系 统推出停止运行。3.5人机界面实现方法在本项目中,人机界面较为简单,不需要图形界面等复杂界面的显示, 只是 对输入的命令显示相应的反馈信息。考虑到这些需求以及设计的简单化,我们采 用的是串口输出显示。米用串口调试助手,在串口调试助手上显示所输出的信息。串口设置:115200bps的波特率、8位数据传输、1位停止位、无奇偶校验位。 但是,在输出过程中,很重要的是需要调用 TKL_Grid单元定义输出格式。要使输出结果简单明了,操作简单,在进行设计输出时需要遵循以下的几个要求:1.命令的输入采用整行输入的方式,在按下回车键后,表
45、明命令已输入完tk_ter_tsk()图3.2状态前移图uShell项目开发24成,输入任务通过消息缓冲区发送输入命令到解析任务。2. 反馈信息的输出采用tm_putstring函数,是T-kernel内核具有的字符串输 出函数,以整行方式输出。3. 表格式的输出,采用TKL_Grid单元,TKL_Grid单元里提供格式化输出 信息的所有函数底层接口,按照何种格式输出,完全由用户自己定义, 通过只提供底层函数由用户自定义输出可以缩小代码量及提高性能。3.6异常处理暂不实现。3.7执行时间估计uShell的一个命令执行包括从串口获取用户命令,然后对命令解析,并调用 相应的命令处理函数,最后将信息
46、返回。一个命令的执行时间包括了通过从串口 收到数据开始,以及命令的处理时间。命令执行时间的计算由USH_Parse负责执行和输出。uShell命令处理的时间如下表。表3.4命令执行时间表No.命令执行时间(ms)说明1 ref_tsk6046 个 tsk2 ref_tsk 22291 个 tsk3 sta tsk304 del_tsk305 sus_tsk306 ter_tsk307 wup_tsk308 can _wup309 rsm tsk3010 frsm tsk3011rel wai3012 chg_pri 5,12926uShell项目开发2513ref_flg54710 个 flg
47、14ref_flg 21231 个 flg15clr_flg3016set_flg3017ref_mbx760 个 mbx18ref_sem67915 个 sem19ref_sem 21081 个 sem20sig_sem3021ref_mbf800 个 mbf22ref_mpf720 个 mpf23ref_mpl830 个 mpl24ref_mtx800 个 mtx25ref_alm800 个 alm26ref_cyc800 个 eye27get_reg8028ref por800个29rot_rdq800个30set pow3031Lodspg-取决于程序大小32Un Ispg-取决于程序
48、大小33*134h/?81835h12836Prompt3137Prompt “ IMS ”238Sleep-除非手动唤醒39Radix2440Radix H241Exit-uShell项目开发2654Date663.8源码目录文件结构源码目录文件结构表3.5源码目录文件结构描述No.一级目录二级目录文件功能描述1 in clude所有单兀的头文件2uShelluShell单元目录3USH_Mai n.hT-Kernel入口模块4USH_Kerl.h管理模块头文件5USH_I nput.h输入模块头文件6USH_Parse.h命令处理模块头文件7USH_Tsk.h任务相关命令处理8USH_Fl
49、g.h事件相关命令处理9USH_Mpf.h内存池相关命令处理10USH Cyc.h周期程序命令处理11USH Sem.h信号量命令处理12USH Mbx.h邮箱命令处理13USH_Alm.h警报命令处理14USH_Comm.h通用模块15USH_La ng.h语言模块16USH Error.h错误处理17TKLTKL单元目录18TKL Stri ng.h底层字符串处理19TKL Time.h时间处理20TKL_Grid.h格式化输出21 src所有单元的源程序22uShelluShell模块目录23USH Mai n.cT-Kernel入口模块uShell项目开发2724USH_Kerl.c管
50、理模块头文件25USH_I nput.c输入模块头文件26USH_Parse.c命令处理模块头文件27USH_Tsk.c任务相关命令处理28USH_Flg.c事件相关命令处理29USH_Mpf.c内存池相关命令处理30USH_Cyc.c周期程序命令处理31USH_Sem.c信号量命令处理32USH_Mbx.c邮箱命令处理33USH_Alm.c警报命令处理34USH_Comm.c通用模块35USH_La ng.c语言模块36USH_Error.c错误处理37TKLTKL单元目录38TKL_Stri ng.c底层字符串处理39TKL Time.c时间处理40TKL_Grid.c格式化输出41.gd
51、bi nit42Makefile43 tbat9144Makefile45ushell.mot执行文件(不带调试)46 Tbat91.dabug47Makefile48ushell.mot执行文件(带调试信 息)49 .cdtproject工程文件50 .project工程文件51 ReadMe.txt自述文件uShell项目开发2852 SccClear.bat清理VSS的vssver.sccuShell项目开发294详细设计4.1主要数据结构描述4.1.1格式化输出输入命令执行后需要产生大量的输出, 所以,格式化的输入输出语句是需要 经常调用的,通常的格式化方法是把输出的信息放入一个十字链
52、表结构中,然后一起输出。但是十字链表的查找,插入操作很费时间,而且还涉及到动态分配和 释放内存等相当耗费时间的处理过程。内存泄露问题也很难控制,针对这种情况, 本课题特别设计了一种静态链表的数据结构, 我们采用填充一行数据输出一行数据,以求达到时间和空间的相对合理,结构定义如下:#defi ne MAX_WIDTH (32)#defi ne MAX_COLUMN (20)typedef enum TKL_GRID_ALIGNMENTLEFT,/*左对齐*/RIGHT/*右对齐*/ TKL_GRID_ALIGNMENT;/*输出信息的对齐方式 */*表的列单元结构*/typedef struct
53、 COLUMNB dataMAX_WIDTH;/*数据最大宽度 */B titleMAX_WIDTH;/*标题最大宽度 */UW width;/*标题和数据存放的宽度*/uShell项目开发30TKL_GRID_ALIGNMENT alignment;/* 对齐方式 */ COLUMN;/*表结构*/typedef struct TKL_GRIDCOLUMN columnsMAX_COLUMN; /* 表格总列数 */W columnNumber;/*格式化表格当前列数 */ TKL_GRID;4.1.2函数查找该项目中,我们的工作是通过得到用户的命令然后解析输出相应的信息给用 户,在设计过程
54、中我们采用一个命令对应一个函数的形式,以方便命令的处理, 这就引出一个问题就是得到命令后要去函数集中查找对应这个命令的处理函数 是哪一个,当然很多方式可以得到预期的目的,但是考虑到查询速度、扩展性等各方面原因,我们这里采用的是一个双链键树结构。它的查询的时间复杂度为 O(1),查询到对应函数需要执行的次数是以命令长度成1:1的关系的。数据结构定义如下:/*树节点类型*/typedef enum NODEKINDBRANCH, /*树的分支节点 */LEAF /*树的叶子节点 */NODEKIND;/* -键树节点结构-*/typedef struct TRIENODEenum NODEKIND
55、 kind; /*当前树节点类型 */unionvoid * record;/*存储函数指针 */uShell项目开发31struct TRIENODE * ptr27;/*当前节点的孩子节点 */;trieNode,*trieTree;4.1.3关键结构说明Allld结构体类型,存放了项目中建立的所有资源的ID,包括3个任务,1个标志事件组、1个消息缓冲区:typedef structID tskldA,tskldB,tskldC; /* 任务 ID */ID flgld;/* 事件标志 ID */ID mbfid;/*消息缓冲区ID */ allId;T_CTSK结构体类型,存放了建立一个
56、任务需要设置的所有属性,在uShell项目中,创建任务时需初始化 exinf、tskatr、task、itskpri、stksz变量。typedef struct t_ctsk VP exi nf;/*存放任务扩展信息的地址*/ATR tskatr;/*任务属性*/FP task;/*任务启动地址*/PRI itskpri;W stks z;/*任务启动时的优先级*/*用户堆栈大小(字节)*/UB dsname8; /* 对象名称 */VP bufptr;/*用户缓冲区*/ T_CTSK;在uShell项目中创建任务时,allId和T_CTSK结构类型初始化如下/*入口函数说明,以下是入口函数
57、创建任务 A的过程*/EXPORT INT UshellMai n(void) UshellMa inallId taskId;T_CTSK ctskA;uShell项目开发32/* TaskA是负责监听输入命令 */uShell项目开发33/*任务属性设置*/*任务地址*/*任务优先级*/*堆栈大小*/*扩展信息,存放着任务和缓冲区及标志事件组的ID */ctskA.exi nf = (VP)(& taskld);ctskA.tskatr = TA_HLNG | TA_RNGO; ctskA.task = &TaskA;ctskA.itskpri = 21;ctskA.stksz = 102
58、4;4.2参考资料表4.1参考资料表序号资料名称1USHM要设计2UML嵌入式C3 卩 T-Kernel Specification(详细说明书)1.01.00_en4源码开放的嵌入式实时操作系统T-Kernel4.3单元设计4.3.1函数一览表该函数一览表只列出了部分我们实现的函数接口及功能描述,表中描述的函数接口主要是用来处理与任务相关的命令和格式化输出相关的接口。表4.2函数一览表文件名ush_tsk.h ush_tsk.c块名函数ID函数原型类型功能描述USH_Tsk7.1ER USH_TskDel(W parC nt,UB *paParStr)函数删除任务的入口uShell项目开发3
59、47.2ER USH_TskChkDel(W parC nt,UB *paParStr)函数核对删除任务的命令的参数7.3ER USH_TskSta(W parC nt,UB *paParStr)函数启动任务入口7.4ER USH_TskChkSta(W parC nt,UB *paParStr)函数核对启动任务的命令的参数7.5ER USH_TskTer(W parC nt,UB *paParStr)函数终止其他任务的入口7.6ER USH_TskChkTer(W parC nt,UB *paParStr)函数核对终止其他任务命令的参数7.7ER USH_TskChgPri(W parC n
60、t,UB* paParStr)函数改变指定任务的优先级7.8ER USH_TskChkChgPri(W parC nt,UB* paParStr)函数检查 USH TskChgPri中的参数7.9ER USH_TskRef(W parC nt,UB* paParStr)函数参考系统中任务的状态,查询指定的任务的状态信息7.10ER USH_TskChkRef(W parC nt,UB* paParStr)函数检查USH TskRef中的参数USH_Tsk7.12ER USH_TskWup(W parC nt,UB *paParStr)函数唤醒其他任务的入口uShell项目开发357.13ER
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购销合同(十二)
- 转让建筑资质范本合同范本
- 期货干货知识培训课件
- 海南农村建房合同范本
- 工程材料转卖合同范本
- 小区机械车位合同范本
- 食品采购补充合同范本
- 价格保密合同范例
- 临时路面工程合同范例
- 化工居间协议合同范本
- 汽车检测技术课件 任务六 检测汽车平顺和通过性能
- 2024年云南省初中学业水平考试地理试卷含答案
- ASTM-A269-A269M无缝和焊接奥氏体不锈钢管
- 工程施工赶工措施方案
- 生猪屠宰兽医卫生检验人员理论考试题及答案
- 杭州市卫生健康委员会所属事业单位招聘考试真题
- 九年级分流工作实施方案
- 楼盘、园区开荒保洁服务方案(投标方案)
- 《Python编程基础》课程标准
- 中职教育一年级下学期数学《两点间的距离公式和中点坐标公式》微课教学设计
- 捷信达酒店前台管理系统V8
评论
0/150
提交评论