将μc/os-ii实时嵌入式操作系统移植到epson八位单片机上来开发短信息电话机。此电话机除普通电话的通用功能外,还增加了短消息收/发功能、信息浏览与查阅功能、信息点播与信息订阅功能等。
关键词 短信息电话机 实时操作系统 μc/os-ii
1 背景
后pc时代的到来,使人们开始越来越多地接触到一个新的概念——嵌入式产品。手机、pda(如商务通)等均属于手持式嵌入式产品,vcd机、机顶盒等也属于嵌入式产品,而车载gps系统、数控机床、网络冰箱等同样都属于嵌入式产品。信息电器具有信息服务功能,如网络浏览、视频点播、文字处理、电子邮件、个人数字助理等。后pc时代,家用电器将向数字化和网络化发展,计算机都将嵌入到电视机、冰箱、微波炉、电话等中,并通过家庭控制中心与internet连接,转变为智能网络家电;还可以实现远程医疗、远程教育等。据估计未来十年间,信息家电(网络冰箱、机顶盒、家庭网关、数字机顶盒等)总量可达到1~1.5亿台,总市场需求将达到900~1500亿元。
short messages phone(短信息电话机)是一种操作简便、成本低廉的固定电话信息终端产品。它集成了网络和智能电话的优点,是一种基于信息网络的,具有交互功能的信息终端产品,可以通过固定电话网络与信息中心进行数据双向传送。
2 系统功能及其实现方案
2.1 功能特点
短信息电话机除了实现普通电话机的通用功能外,还增加了短消息收/发、信息浏览与查阅、信息点播、信息订阅、电话簿、来电号码显示与存储、通话记录、来电转移、呼叫等待、呼叫限制、对屏幕的灰度进行设置、对回执进行设置以及时钟和日历功能、闹钟功能、特色铃声功能、记事本功能等。
短信息电话机还可以和信息中心在线交互,查看信息中心提供的信息(例如天气预报、电视预告、电影预告、股价查询、话费查询、区号邮编查询、新闻栏目、彩票信息等等),还可以订阅一些自己喜欢的信息。在线浏览的信息取决于信息中心提供的信息。
短信息电话机就像是一个固定的手机。手机的功能几乎它都具备。
2.2 硬件方案
(1)mcu的选择
mcu是整个方案的核心,由它来处理cpe(客户端设备)与iis(集成信息系统),控制整个电话机的各个功能部件。由于人机界面对速度的要求不是很高,数据通信速度也相对较低,一般的8位mcu就能够满足方案的要求。我们选择epson 的eoc88系列的e0c88104芯片。
(2) 数据信号的解/编码
① fsk信号的解码。fsk(频移键控)的解码选用***华邦公司的w91030。它是用同步串口与mcu连接的,不仅能提供fsk的解码,而且还能提供cas信号的检测(cas信号是iis与cpe连接时下传的一个很重要的握手信号)和振铃检测,是一款很实用的芯片,但它的成本较高。如果用分离器件,也能做到fsk解码,但这样做没有经过验证,风险较大。
② dtmf信号的解码。选用的是9170,这一款芯片是很通用的。
③ dtmf信号的编码。选用的是***华邦公司的w91082,同样是以同步串口与mcu相连接。
④ fsk的编码。fsk信号的编码不是必需的,考虑到fsk传送的效率要比dtmf高20~28倍,当然最好选用fsk上传方式。由于相应的fsk的编码器件价位很高,本方案采用了低成本的软件方式作为后备模块。
(3) 语音电路
目前选用的是philips公司的tea1098。该器件集成了普通话音放大、消侧音及免提功能,实用方便,但价位有点高。考虑到我们初次接触电话电路,而且这部分也不是关键技术,为了缩短研发周期,选择这款芯片是比较合适的。
2.3 软件方案
本系统选用μc/os-ii操作系统,将其移植到所选的mcu上。在main中建立一个起始任务
starttask。
int main (void){
osinit();
ostaskcreate((void*)starttask,(void*)0x00,(os_stk )&starttaskstkstart_task_stk_size-1],0);
osstart();
return 0;
}
起始任务中,首先建立一系列的信号量和邮箱:
sem_int_ring = ossemcreate(0) ;唤醒振铃任务
sem_any_smtask = ossemcreate(0) ;唤醒短消息任务
sem_int_keyboard = ossemcreate(0) ;唤醒键盘任务
sem_int_clocktask = ossemcreate(0) ;唤醒时钟中断
mbox_any_ui= osmboxcreate((void *)0);唤醒ui任务
mbox_int_hook= osmboxcreate((void *)0);唤醒摘挂机任务
然后,用ostaskcreate()函数建立6个任务。任务名分别为:handsettask(摘/挂机任务)、ringtask(响铃任务)、keytask(键盘任务)、smtask(短消息任务)、uitask(用户界面(ui)任务)、clocktask(时钟任务)。最后,在起始任务中将它本身删除掉。
(1) 摘/挂机任务
当拿起听筒或放下听筒时,就产生中断。在中断中,调用osmboxpost(mbox_int_hook,msg_int_hook)来唤醒摘/挂机任务,同时清除中断标志。msg_int_hook[0]=0x00为摘机,msg_int_hook[0]=0x01为挂机。
摘/挂机任务不断调用osmboxpend(mbox _int_hook,0,&err)来获得信箱。获得信箱后,根据msg_int_hook[0]中的值,就知道是摘机还是挂机,然后调用osmboxpost(mbox_any_ui,msg_any_ui)来唤醒ui任务。msg_any_ui [0]=任务号1,msg_any_ui [1]=0x00为摘机,msg_any_ui [1]=0x01为挂机。
在挂机的时候,如果先前是在响铃的时候摘机的,那么ui任务把它当做已接来电处理;如果不是在响铃的时候摘机的,那么在挂机的时候把它当做已拨电话处理。
(2) 振铃任务
当铃声来到时,就产生中断。在这个中断中,调用ossempost(sem_int_ring)来唤醒振铃任务。
响铃任务调用ossempend(sem_int_ring,0,&err)来获得信号量。获得信号量后,就把下传的号码接收下来;根据号码就可以知道是短信息,还是普通电话。
① 当是短信息时,就调用ossempost(sem_any _smtask)来唤醒短消息任务;
② 如果是电话,就响铃,同时调用osmboxpost(mbox_any_ui,msg_any_ui)来唤醒ui任务。这时msg_any_ui[0]=任务号2,从msg_any_ui[1]开始存的是来电时间和电话号码,然后调用ossempend(sem_int_ring,ring_recv_timeout,&err),来延时响铃一段时间。
如果在这段时间内没有接电话,那么必然会超时,于是就清除铃声中断,同时调用osmboxpost(mbox_any_ui,msg_any_ui)来唤醒ui任务,这时msg_any_ui[0]=任务号2,msg_any_ui[1]=0xff表示铃声结束。ui任务把它当作未接来电处理。
如果在这段时间内接电话,就必然唤醒摘/挂机任务。如果从响铃到对摘/挂机任务处理完毕所需要的总时间还没有到ring_recv_timeout,那么,当时间到了,ui任务也会收到铃声结束的消息;但此时,ui任务不对它做任何处理。
响铃任务如何区别是正常的电话还是信息中心的来电信息呢?其实很简单。信息中心也是一个终端,是由一个特定的号码来确定的。就像用不同的电话号码来区别不同的用户一样。这样响铃任务就可以根据电话线上下传的号码,来确定是哪种情况了。
(3) 键盘任务
有按键按下时,产生一中断,在中断服务子程序中调用ossempost(sem_int_keyboard)来唤醒键盘任务,同时清除中断标志。键盘任务调用ossempend(sem_int_keyboard,0,&err)来获得信号量。获得信号量后,键盘任务将调用osmboxpost(mbox_any_ui,msg_any_ui)唤醒ui任务。
msg_any_ui[0]为任务号3, msg_any_ui[1]为键值。
(4) 短消息任务
该任务调用ossempend(sem_any_smtask,0,&err)获得信号量。当获得信号量后,通过标志位判别是准备上传数据还是下传数据。
① 下传数据时,将下传的数据放在recv_buf[]中,然后调用osmboxpost(mbox_any_ui,msg_any_ui)唤醒ui任务。msg_any_ui [0]=任务号4,从msg_any_ui [1]开始存的是从recv_buf[]中筛选过的数据。这是在连上后从信息中心下载信息的情况,其中msg_any_ui [1]存的是信息的种类号,种类号都是大于0x80h小于0xffh的;没有连上信息中心或者是连上之后完成任务。这时recv_buf[1]存的就是0xff;如果刚刚连上,就在recv_buf[1]存0x01。
② 如果用户需要发送短消息任务,先将信息存在msg_send_buf[]中,然后ui任务调用ossempost(sem_any_smtask),将该任务激活。该任务提取存在msg_send_buf[]中的信息后,包装后保存在send_buf[],然后将其发出去。
(5) 用户界面任务
ui任务一直在等待消息。当它被激活时,根据存在msg_any_ui[255]中的不同数据进行不同的处理。详述见“3.用户界面任务详述”。
(6) 时钟任务
单片机每10ms产生一个中断,在这个中断服务子程序中,对clock_count减1。当减为0时,就调用ossempost(sem_int_clocktask)唤醒时钟任务;同时,clock_count重新回到100。这样每1s,就会调用一次ossempost(sem_int_clocktask)。时钟任务调用ossempend(sem_int_clocktask,0,&err)获得信号量。当获得信号量时,就更新时间。如果在23:59:59的时候更新时间,那就要同时更新日期和星期。如果此时ui任务处于待机状态,时钟任务就调用osmboxpost(mbox_any_ui,msg_any_ui)来唤醒ui任务。msg_any_ui[0]为任务号0x06。时钟任务只是负责更新时间,显示时间是由ui任务在待机的时候来完成的。
3 用户界面任务详述
在所有这些任务中,用户界面任务做的工作相对比较烦琐。首先,根据放在msg_any_ui[255]中的第一个字节,判断是什么任务激活了本任务。
① 如果是摘/挂机任务激活的,再判断第二个字节的值,根据值的不同知道是挂机还是摘机。如果是挂机,就在液晶上显示待机画面。如果是摘机,就在液晶上显示打电话图标和有关的字样,并等待键盘任务送来的数字键,将其显示出来。(只有主动向外打电话才显示数字键,在接电话按数字键转接时不显示数字键。)
② 如果是振铃任务激活的,就将msg_any_ui[255]中接下来的来电号码、时间和来电图标显示在液晶上。
③ 如果是键盘任务激活的,就根据3号任务放在msg_any_ui[255]中的键值和当前的工作模式做不同的处理。
如果是在摘机模式下,就只是响应数字键和#*键,并每按一个键就通过5号任务号码发出去。
如果是在挂机模式下,那么,就可以响应数字键和有关操作菜单的键(包括进入各个子菜单的快捷键、上下键、左右键、返回上级菜单键、快速返回待机画面的键、确定键、删除键、拼音输入法/字母输入法/数字输入法/短语输入法切换键)。各个菜单是不同的状态,通过键值和原来的状态可以知道现在该进入什么状态。然后根据新得到的状态,进行相应的液晶刷新和完成相应的功能。比如添加、删除、查找电话簿;添加、删除、查找通话记录;编辑短消息并发送出去,删除草稿箱里的短消息;写记事本,设置闹钟、时间、日期,设置信箱的密码,设置信息中心的号码等。
如果是在与信息中心的连接模式下,那么就可以响应上下键,确定键(进入下级菜单),返回上一级菜单,通过选择返回这个选项来实现。
④如果是短消息任务激活的,就根据msg_ any_ui[255]中的命令码,来确定该信息的模块种类是信息下载管理模块、信息上传管理模块、信息询问管理模块,或者是屏幕信息输出管理模块,然后,再根据msg_any_ui[255]中接下来的信息做相应的处理。
⑤ 如果是时钟任务激活的,ui任务就刷新界面上的时间、日期和星期这些信息。
4 调试环境与调试成果
此程序用epson公司的s1c88 c-compiler编译器编译,用epson公司的ice88ur 的e0c88系列在线仿真器进行仿真。在仿真器下仿真完毕后,再脱机运行。试验结果令人满意,达到了预期的效果。
Uber计划将自动化技术整合到旗下共享单车和共享电动滑板车项目中去
如何获得准确的入耳式心率和SpO2监测
立柱机器人码垛机的详细介绍
可在p型与n型间转换的新式晶体管问世
三合一食品安全检测仪具体的使用步骤介绍
使用μC/OS-II操作系统的短信息电话机
普强千察语音质检系统
豪威集团发布“一站式”TWS真无线耳机的解决方案
旋转变压器与编码器的区别
IP地址,IP地址是什么意思
360宣布推出汽车安全大脑
verilog语言实现任意分频
差异数据传输有什么区别?
学术圈又出糟心新闻!NLP领域众专家谴责匿名攻击者
风电、太阳能和储能技术成本大幅度下降,储能将成为实用替代方案
冀雅电子为客户研发电加热功率分配与温度控制系统
新一代STT-MRAM升级到12nm,适用于各种嵌入式领域
远场距离除了10λ和2D^2/λ还有别的吗?
Go运行时:4年之后
华为p40升级鸿蒙系统步骤 教程如下