1、DVB 开发指南1. 基本知识DVB,数字电视广播,一般按其传输方式,分为: C有线 S卫星 T地面数字电视的传输流程(多路)原始节目流+节目表+节目指南+时分复用传输(TS)流调制,高频搬移载波传输接收,降频中频信号(调制信号)解调TS 流解时分复用多路原始节目流 节目表 节目指南 信源调制/解调将原始音视频数字信号采用数字算法进行编码(得到 ES 流)的过程即为信源调制;将编码信号进行反向编码运算的过程称为信源解调。俗称编码和解码。DVB 规范里面有一系列关于编码和解码的标准,DVB 标清节目采用的最多的视频编码标准是 MPEG2,而音频编码则为 AC-3。除此以外,在高清的场合下,有MP
2、EG4,H.264 等等更大的标准协议族来规范编解码算法。信道调制/解调信道调制指将数字信号加载到传输载波进行传输的过程,比如 DVBS 将以 QPSK 方式将 TS 流调制,DVBC 以 QAM 将 TS 流调制,DVBT 以 COFDM 调制 TS 流等。作为接收端为了得到 TS 流就必须以对应的方式反向进行,此过程就是解调了。2. DVBS上行/下行前端将 TS 流调制发送给转播卫星为信号的上行,下行则是转播卫星将信号广播到地面。上行和下行自然采用不同的波段和频率,是否使用相同的调制方式并不确定。转发器卫星信号通过 QPSK 方式调制,其中频信号的范围是 950MHz2150MHz 。转
3、播卫星将这个范围的中频信号分段,每段对应一个转发器,一个中心频率,我们就以中心频率来指代转发器。转发器相关的参数有中心频率,极化方向,符号率,前向纠错码等等。除了中心频率,其他的参数对于带宽有要求,这样每个转发器中心频率确定后,就对于其所占用的频道带宽有了限制,自然的,在每个转发器的中心频率带宽范围内,就不可能有其他的转发器信号存在, (除非相邻的转发器覆盖不重叠的地面范围),否则地面接收其就无法还原信号。转发器的参数: 波段 C 低于 5150MHz 的载波频率 Ku 高于 5150MHz 的载波频率 极化方向,卫星广播信号有两种极化方式,线性极化和圆极化 线性极化 水平方向 垂直方向 圆极
4、化 左旋圆极化 右旋圆极化 前向纠错码,一般可见到的是 1/2,3/4 ,5/6,7/8。分子为流信号中的有效数据占比,剩下的就是纠错码所占比重。比如 3/4 表明信号分成 4 份,其中有一份是纠错码,剩下 3 份是有效信号。自然的,前向纠错码越大,纠错数据占比越小,那么出错不能恢复的概率就越大,信号质量自然就小了。 符号率,单位:波特率。QPSK 信号每个符号可携带两个 bit 的数据,因此大约可估算某个转发器下的 TS 流动数据传输率:S2fec其中 S 是符号率,fec 为前向纠错码,因此符号率 27500Kps,前向纠错码 3/4 的转发器,其每秒传输的数据大约为27500*1000*
5、2*3/4=41.25Mbits。关于带宽的大致估算:S/2因此对于两个相邻的转发器,如 F1/S1,F2/S2 ,且 F1F2,如果 F1-S1/2F2+S2/2,那么这两个转发器要么不会覆盖同一个地区,要么参数有问题。天线,俗称的“锅” ,对于 C 波段信号,接收天线为圆球面的反射设备,其反射信号交叉于圆球队中心处;Ku 波段信号,接收天线为抛物面的反射设备,反射信号位于抛物面的焦点处。因此,C 波段信号和 Ku 波段信号天线的安装方式是不一样的,前者叫做正馈(天线) ,后者叫做偏馈(天线) 。LNB,本振/降频器,安放于天线的反射焦点处 。LNB 中有有个部件叫做极化片,它的作用是选择某
6、个极化方向的信号。如果是线性极化的 LNB,那么只有符合极化片设定的线极化信号才能通过 LNB,而圆极化信号则不受控制的通过 LNB,如果是圆极化的 LNB,那么只有符合设定的圆极化信号才能通过 LNB,线性极化信号则不受控制的通过 LNB。LNB 的极化方向的设定受机顶盒控制,这就是机顶盒的 13/18V 信号。极化方式和极化方向的关系如下表所示:机顶盒控制信号 LNB 类型 信号类型 通过水平信号 X垂直信号 V左旋 V线性极化右旋 V水平信号 V垂直信号 V左旋 V13V圆极化右旋 X水平信号 V垂直信号 X左旋 V线性极化右旋 V水平信号 V垂直信号 V左旋 X18V圆极化右旋 V若前
7、所述,空中的信号是调制后的,经过搬移后的信号,其频率非常高,LNB 的作用就是把高频搬移的信号再搬移到中频范围(9502150MHz)内,其计算方法为f=Abs( F0-FLNB)其中 F0 是转发器中心频率,F LNB 是 LNB 本振频率,f 就是搬移后的中频频率。需要注意的是,此处 LNB 是不加选择的将所有接收到的信号都搬移到中频频率,所以这里经过 LNB 后得到的是所有频率,而不是某一个频率。射频处理,选择通过的某个单一频率信号,常用的芯片如:rda5812,zl10039,stb6000 等等。信号的选择是由机顶盒控制的,一般通过 qpsk解调芯片的 IIC 总线转发主控芯片的选择
8、指令来完成,经过射频处理之后,非选择的信号就被挡在外面了。信道解调,QPSK,将调制的信号解调得到 TS 流。从此之后,就进入完全的数字信号处理阶段了。常见的 QPSK 处理芯片如海尔的 hi3103.3. 机顶盒STB/IRD/BOX,这些都是常见的机顶盒简称。一般都包含 输入部件 RFin IR,红外遥控接收器 前面板输入按键 输出部件 混合视频输出 LOOPOUT,换回输出,直接将 RFin 转输出 S-VIDEO 色差输出 Spdif,光纤音频输出 UART 输入输出 前面板 led 指示 以太网接口 智能卡 Ci 接口信道解调,QPSK/QAM/CODFM 解调,对于卫星如 Hi30
9、13 芯片。关于信号的评价参数: 信号强度,这是信号的功率电平,越高表明信号电平越大 信号质量 信噪比,信号与噪声的功率比,比值大相对好 误码率,传输错误 bit 占总传输数据的比率,值越小越好信源解调,电视解码器,集成在主芯片内部,其外接的 cvbs 等输出口线已经是经过 tv 编码的格式。节目管理,将收下的节目参数以用户友好的需求进行管理的软件模块,最起码提供浏览,收藏,编辑等等功能。参数管理,卫星/转发器参数,语言设定,定时器,用户锁等等功能电子节目指南 EPG,接收 TS 流中的 EPG 数据,提供浏览界面图文 TELETEXT,VBI,特殊的信息发布平台。CA 系统,与 FTA 对应
10、的加扰节目配合的条件访问系统,常见的如nagra,viaccess ,conax ,irdeto,videoguard,nds,cryptoworks存储器,永久存储程序和用户数据的 flash,程序运行和信源解码所需的 sdram,以及 sram 等等。4. DVB 规范Dvb 规范是在音视频流基础上发展起来的应用于更多场合的协议族。它涉及了原始流的编解码,传输,复用,接口,条件访问,家庭网络,互操作性,托媒体平台,以及隐私策略等等。4.1. 最基本的传输分类入口:DVB-S,关于卫星传输的规范DVB-C,关于有线传输的规范DVB-T,关于地面传输的规范其他 DVB-CS,数字卫星上行发布系
11、统规范 DVB-MS,高于 10GHz 的,基于 DVBS 的调幅微波多点传送,即 MMDS DVB-MC,低于 10GHz 的,基于 DVBS 的调幅微波多点传送,即 MMDS DVB-MT,微波地面系统 DVB-SFN DVB-DSNG,数字卫星新闻收集系统4.2. DVB 的复用规范定义了 SI(业务信息),TXT (图文) ,VBI(图文) ,DATA(数据) 。后面两种我们暂不涉及。4.2.1 SI 业务信息描述了:节目信息,描述了如何搜索到 TS 流中传输的节目。DVB 的节目信息来自两方面,首先它直接沿用了 MPEG2 中对于如何搜索节目相关参数的定义,然后在 DVB 中搭配了一
12、个 SDT 表来描述节目的业务文字信息。这样,在机顶盒中,节目的搜索过程就是从 TS 流中得到相关的描述表,然后把各自对应的信息匹配在一起的过程。与之相关的是 PAT/PMT/SDT,此类表在 TS 流中以较短的间隔时间循环传送,其间隔时间不超过数百毫秒,就是说在任何时候,都可以进行节目搜索的操作而不必等待太长的时间就可以完成。EPG,电子节目指南有两类,一类是当前/后续的信息事件,就是当前正在播放的节目的信息描述,以及当前节目完成后紧接着的节目的信息描述;另一类是长达一周及以上的节目的信息简介。前者循环发送的间隔时间很短,不超过数百毫秒,后者每个循环的周期可能在数十秒以上。因此当前/后续 e
13、pg 可以在需要的时候从码流中获取,而星期 epg 则需要事先缓存,并在需要的时候从缓存中提出去来显示。网络信息,此处的网络指的是运营商的转播网络,某些运营商转播的节目频道数量很多,无法仅仅通过一个转发器就转播所有的频道,因此他们的节目就要通过多个转发器来转播。通过网络信息表(NIT) ,将该运营商的所有频道信息和所在转发器公告出来,这样用户在任何转发器下,只要能够获得 NIT,就能够依次逐步的搜索完所有该运营商的频道。时间信息,码流中以 TDT 表的形式广播系统时间,以此作为机顶盒的时间基准,这样才能正确的现实 epg 等相关信息运行状态,这些信息我们目前并没有应用选择信息,同上4.2.2
14、Txt 图文TXT 图文信息,这是一种相当于公告板之类的信息发布应用。其历史来源于最初电视扫描信号过程中,电子枪回扫时的时隙,因为该时隙不携带有用电视信号,但却实实在在占用了资源(时隙) ,被开发出来用于显示一些相对变化不大的图形信息。TXT 信息编码在 pes 格式中,可能是作为视频信息编码中的一部分传输。机顶盒上 txt 的显示比较像是进行拼图,因为 txt 信息每一条都带有位置/颜色/ 大小,所以他们的显示在屏幕上是固定的,将多条信息组合到一起以后,拼成一个更大的图形信息,最后一整屏显示完全后,用户看到的就是图形化的信息,这些图形化的信息一般都是公告,广告之类的应用。4.3. 条件访问定
15、义了 es(基本流,如影视频流) 的条件访问规范,如 es 流如何被加扰,加扰采用的算法,及在传输中怎样来表达这些加扰信息。4.4. 接口定义了 TS 流从传输中获取再解码显示的接口规范,此接口定义的是机顶盒与外部设备间的规范,DVB-CI 定义了主芯片与 CI 模块间的操作接口, CI 模块从主芯片得到 TS 流,再根据主芯片的指令把 TS 流中指定的节目 ES 流解扰发送给主芯片,再由主芯片解码播放。5. 频道机顶盒上的频道,播放所必需的参数转发器相关参数:卫星/转发器,必需通过此类参数锁定信号Pcr_pid/video_pid/audio_pid,播放时需要此信息解复用 es 流左/右声
16、道/立体声,用户设置参数Ecm_pid/emm_pid,加扰节目需要Program_number/servic_id,在不同的场合有不同的名字,但其实是一样的东西,epg 需要其他参数,频道管理所需编号,1最大设计容量。这个编号就是在用户界面上能看到的数字名称广播/电视属性收藏/喜好/分类其他一般的机顶盒的频道管理,都会(全部或部分)具有以下的基本功能:浏览排序 字母升序 字母降序 卫星排序 转发器频率排序 喜好排序分类收藏,比如电影/戏剧 /音乐/体育等等手工增加频道删除频道编辑频道参数修改频道名称频道存储的设计频道存储分成两级结构,第一级包括频道总数和频道参数入口索引列表,第二级存储频道的
17、相关信息。结构图示如下:有效频道总数 Total索引 INDEX频道参数实体 PROGRAMS最大总数 Htotal其中有效频道总数,指当前数据库中的频道数量,也就是在频道浏览界面能够看到的最大频道号。最大总数,是从该数据库创建以来有效频道总数的最大值,如果新增频道数超过最大总数,则最大总数就是有效频道总数,频道删减,最大总数不变,删减后再增加频道,但不超过最大总数,最大总数也不变。此参数用于频道管理中增删频道参数时分配空间的算法,后面会详细说明。索引,指向频道参数实体的地址。每个索引所在地内存地址相对于索引区起始地址的(考虑每个索引的字长的,比如每个索引使用两字节或者 4 字节)数组偏移加
18、1对应着频道的自然编号。例如要找到频道号 55 的信息,首先计算器索引所在的地址为【55-1】 ,然后从 index【55-1 】取得频道参数的地址,再从该地址获取详细参数。频道参数实体,详细频道参数,在现有的设计中,每个频道详细参数的所占用的存储空间是确定的。频道相关的编程读取频道参数由频道号 N 获取频道详细参数 PP=PROGAMS【INDEX【N-1 】 】删除频道仅修改 INDEX 数据,PROGRAMS 数据不变化。删除时,把待删除频道后面的所有有效频道索引往前挪动一个单位,最后空出来的位置填入待删除的频道索引,如下图所示(图中 FF 指未使用区域): FF FF 可见删除节目不影
19、响 Htotal,Total 会变小,删除后余下的比被删除的频道号大的有效频道编号全部减一,而其索引位置前移一个单位,正好与之匹配。增加频道增加频道时,首先检查 Total 和 Htotal 的关系,若 Total 与 Htotal 相等,则新增频道的索引肯定放在 FF 区域,那么参数实体的存放位置可以根据Total 的值计算得到下一个地址,这个地址是此前从未使用过的。如果 Total小于 Htotal,那么可以肯定此前删除了某个频道,从 Total 的下一个(上图中的一个灰色块)索引地址就能拿到一个可以存放的地址,从而避免在频道存储区中造成空洞而泄漏存储资源。6. OSDOSD 即 On S
20、creen Display 的首字母组合,它是机顶盒交互的屏幕显示,要把这个和机顶盒播放内容区分开来。机顶盒播放的视频信号是信号码流中传来的数据流的解码显示,OSD 是与之独立的东西,在有点界面下既可以看到视频,又可以看到 OSD,只是主芯片将这两者混合进行电视编码输出的结果。一般的 DVB 主芯片都会提供多层 OSD 显示,以便实现复杂的显示任务。OSD 显示驱动一般只提供基本的绘制矩形,点,圆,柱,实心圆,弧线,扇形等功能函数,以及颜色和透明度,对比色的管理,图片显示等。用户界面的显示都是由这些基本的函数堆砌组合显示出来的。此处仅对我们开发的机顶盒方案的 OSD 显示界面进行汇总说明。OS
21、D 界面包含菜单系统和快捷及状态显示。菜单系统的结构主菜单,列出了几个大功能的一级菜单入口,包括安装设置系统设置频道管理电子节目指南 EPG其他CA 设置安装设置,包括天线管理卫星搜索单星搜索恢复出厂设置系统设置OSD 语言屏幕透明度定时器时间设置CA 模式设置父母锁频道管理喜好管理频道编辑节目排序EPG,查看电子节目指南其他,版本信息,串口机对机拷贝CA 设置,受系统设置中 CA 模式设置的影响有不同的显示结果快捷方式快速切换 CA 模式修改共享延时参数状态显示频道信息静音信号状态CA 状态音量声道7. CACA 即条件访问 Conditional Access,指 TS 流中传输的音视频流
22、是经过加扰控制,或者加密的字节流,这种字节流,视频解码器无法解码。必须要有对应加扰 key,即控制字Control Word(CW)的情况下,先反向解扰加密字节流,得到正常的音视频字节流,即俗称清流后,再通过音视频解码器播放。加扰的算法有多种,但在标清时代,大部分都是一样的,只有极少数使用不一样的加扰方式,在这些加扰方式出现的地方,可选的解码芯片也比较少。对音视频流进行加扰以后,CW 的传输就变得极为重要,否则指加扰不传送 CW,谁也看不了了。CA 系统的主要作用就是控制 CW 的传输,获得授权的用户能够通过一定的途径及时得到 CW,未获授权的用户得不到 CW。CW 的传输方式有两种,一种是
23、BISS 方式,一种是常规的 CA 模式。BISSBISS 来自于科学亚特兰大的一个成果,其应用场合大约是在运营商之间通过公共通道传输节目,为了避免被公众不授权的收看,对节目流进行了简单的加扰,并在传输的双方之间共享 CW 以达到目的。现在很多卫星上都有 BISS 节目,其 CW 在相当长的时间内都固定不变,慢慢被发掘出 CW 来,造就了相当大一个市场。BISS 有 3 种标准,其中 BISS-0 没有研究,也没见应用; BISS-1 就是固定的使用一组明文的 CW 来加扰节目;BISS-E 则是隐藏的固定 CW,必须要通过两种可选的算法推导出来。BISS-1 在俄罗斯 90 度卫星,138
24、卫星等都有应用,而 BISS-E 据称在泰国有应用市场。常规 CA此类 CA 控制下的 CW 周期轮换,分成两组密钥,通常称作奇、偶密钥。每个周期更新一组密钥,轮回进行,比如本次替换奇密钥,那么下次就替换偶密钥。因此在每相邻的两个周期间,他们的 CW 起码有一半是相同的。常见的商业运作的 CA 厂家有 irdeto,viaccess,nagra,nds,conx 等等,他们都提供一整套解决方案,包括前端加扰/设备,终端解扰/ 设备。对运营商进行授权和认证,对生产厂家进行授权和认证,对方案设计者提供库代码,进行授权和认证。对终端来说,目前流行的有两种 CA 模式,一种是使用智能卡来解扰,一种是使
25、用 CI设备。智能卡模式下,前端通过 ECM 来传递 CW,以 EMM 来对智能卡进行授权和更新密钥。主机把 EMM 发送给智能卡,智能卡鉴别为合法的 EMM 后更新备用的解密 key;若是ECM,则判别节目的限制级别,选择合适(密钥索引和密钥存续时间)的 key 解密获得CW,主机得到 CW 后设置解扰控制器完成音视频解码。智能卡的访问一般遵循 7816 规范,即使有少部分不遵循这个规范,最起码硬件电路是通用的。CI 模式下,主机将 TS 流整个传送给 CI 模块,以及要播放/ 获取的节目 pid,CI 模块选择对应的音视频流进行解扰,然后再发送给主机,主机直接对清流进行解码播放。CI 规范
26、采用 PCI 总线与主机通信。8. FLASH 和数据库8.1. Flash,非易失性存储器分类 NAND NOR类型 NAND NOR地址和数据线 共用 分开读速度 慢 快擦除/写 快 慢读访问方式 特殊驱动 总线片上运行程序 不可 可特点可擦除重写永久存储擦除次数(寿命)有限擦除以块的方式进行,一般为 4KB,8KB只能将数据单元由 1 写为 0,不能由 0 写为 1,因此如要修改数据,一般需要先备份整个扇区,然后擦除该扇区,最后再写入整个扇区的内容8.2. 数据库结构,根据 FLASH 特点,按照 64KB 的扇区分块管理数据,分块如下电视广播其他参数 卫星 转发器 共享参数 ftp 文
27、件 音量和声道(每个频道保留自己的设置的话) 压缩数据库 原始出厂设置参数8.3. 数据库存储的实现8.3.1 数据存储的分类实现Flash 操作最耗时的是擦除扇区,或者擦除整个 flash。在机顶盒系统中,机顶盒程序肯定不能有擦除整个 flash 的操作,因此可以不予考虑。但对于 flash 来说,要修改数据又必须要擦除扇区,因此我们将需要 flash 保存的数据进行分类:经常会突发保存并且有要求速度的小数据量保存这类数据,把他们组合成一个大的数据结构,在 flash 中划分一个单独的扇区,保存时其地址是增长的:在正常情况下,此扇区只有两部分,前面部分是已写入区,后面部分是空白区。每次保存时
28、,只在空白区的开头写入数据,再下一次的写入地址往后增长。在空白区不足以容纳此数据结构时,擦除此扇区,再从空白区的开头写入数据。这种设计只在开机时需要找到最新(就是位置最靠后的那个结构)的数据,也只在这个时候会读取数据,其他任何时候都是只写不读的(因为在机顶盒开机从 flash 中取得最新数据后,所有的变化都可以在内存中反映出来) 。这种设计加快了保存速度(仅在无空白区时擦除一次) ,而且对于该 flash 扇区的消耗(flash 的写入次数是有寿命限制的,这个限制对于任何一个 bit 都是相同的)是均匀的,因此可以延长 flash 的使用寿命。我们把这种方式称作滚动保存。对于速度要求不那么强烈
29、的大数据量保存滚动保存虽然优点很明显,但明显的不适用于大块的数据块。因此对于大数据块,只能老老实实的按照备份/擦除 /写入的流程进行。为了加快保存速度,我们设计了一个后台保存任务,该任务接受传来的请求,在写入期间,拷贝对应的数据块,按照流程保存数据。如果写入完成后,对应的数据又有了变化,则再次启动写入流程。这样前台任务可以不必等待数据真正保存到 flash 中就可以修改内存中的数据库数据,也加快了前台响应速度。8.3.2Flash 虽然是在断电后可以永久保存数据的存储器,但这只是正常情况下的结果,当对flash 的操作过程中出现特殊情况时,flash 中保存的数据的安全性就值得推敲了。试想在下
30、面的场景中:flash 接收到擦除指令开始擦除到完成擦除这段时间内flash 接收到写入指令开始写入到完成写操作的时间内主机为更新 flash 数据,从开发发出擦除指令到完成写数据帧短时间内任何时刻发生了掉电的情况,那么 flash 对应区块的下次开机的时候的内容都是不确定的。一旦发生这种事故,机顶盒系统最起码的后果就是数据丢失。为了杜绝或者减少这些可能的事故发生后造成机顶盒系统的影响,我们考虑的是增加数据库修改的备份和冗余机制:对于每一个扇区,都有一个对应的扇区作为他的备份,两者的数据仅有更新部分不同每次更新数据时,都直接将最新的数据写入备份区,然后对调当前/备份扇区的身份对于扇区保存的是当
31、前还是备份数据的标志保存在滚动保存区中的结构中,这样仅需在开机时确认身份即可如果备份区没有被有效更新,则当前区的数据可用,代价仅仅是丢失最新的更新如果备份需被更新,但标志没有成功更新,结果同上9. C-OSOS 特点OS 的主要作用是提供多任务环境,管理任务调度,提供应用程序使用的通信机制和 api。在嵌入式运行环境中,由于资源有限,OS 还应当具有高效和节省资源的特性。C-OS 是目前所知的最简单 OS 之一,只提供了基本的 任务调度,OS_Sched 核心调度程序,应用程序不能直接调用,一般通过后面介绍的手段间接调用,或者在中断服务程序中调用 Sleep,OSTimeDly, 进程锁,OS
32、SchedLock/OSSchedUnlock 中断锁,开/关全局中断,这个可以在移植的时候修改 OSFlag,进程间同步的标志 OSMbox,进程间通信邮箱 OSSem,进程间信号量 OSQ,队列 OSMem,内存分配等常规的进程间通信手段。C-OS 不管理文件和进程,它只有任务的概念,并且编译之后生成的是一个大的程序,因此任务可以看作是 PC 上通常意义下的某个进程中的线程的概念。C-OS 没有 bios 或者 POSIX 机制,因此这种系统如果不是特殊处理的话,很难进行部分代码更新。任务缺省情况下,C-OS 的任务只能创建和挂起,不能删除。因此每个任务都应该是一个永不退出的死循环,即使这
33、个任务再也没有事情可做,也只能挂起永不唤醒,而不能从该任务返回,否则整个系统就崩溃了。C-OS 按照任务优先级排定顺序,一般情况下,总是(优先级数值低的)高优先级的任务获得更多以及优先获得 CPU 运行时间片,除非高优先级任务(通过系统 api调用)在等待某个事件。另外在 C-OS 不能存在两个相同优先级的任务,如果一定要这么做,那么后面创建的同优先级任务的结果肯定是失败。任务一般由 OSTaskCreate 创建,在创建时就要指定其堆栈的大小,这个大小必须在设计的时候就估算其需求,太大了浪费空间,太小了发生堆栈溢出的问题的话,系统就崩溃。估算堆栈需要分析在该任务中执行的代码,对其可能的所有函
34、数调用和局部变量好用堆栈的情况估算最大值,再以最大值流出一定的裕量。C-OS 内建一个空转(while(1) ;)的 idle 任务,该任务的优先级最低。因此在创建任务时,指定的优先级不能低于 OS_IDLE_PRIO,即数值必须大于OS_IDLE_PRIO,否则只能得到创建任务失败的结果。在 OS 真正开始起作为 OS 的功能之前,必须调用 OSInit 进行初始化。此后可以创建任务,然后调用 OSStart 启动任务调度功能;在调用 OSStart 之后还可以在创建新的任务。但无论如何,在调用 OSStart 之前必须至少创建了一个任务。挂起任务 OSTimeDly,等待由参数指定的 ti
35、cks 数,在此期间,交出 CPU 控制权 OSTimeDlyHMSM,等待参数指定的时间,交出 CPU OSTaskSuspend,挂起参数指定的优先级的任务 OSxPend,等待信号,如果信号不满足则挂起调用者任务,交出 CPU。x 指Flag,Mbox,Sem,Q 等进程通信 全局变量基于 C-OS 的系统是一个大的程序,毫无疑问,在各任务之间通过全局变量来通信是可以的,但这种机制在功能简单的应用下是可以的,对于复杂的程序,以及有更多的访问需求的情况下,不但带来了代码维护的问题,而且还引入了多任务访问的不同步问题。因此多任务间的通信应当尽量避免简单的使用全局变量来实现。如果一定要使用这种
36、方式,也应当变量的访问使用函数的方法来实现,并且将关键数据的访问通过同步机制来控制,比如开/关中断,进程锁,信号量等。 OSFlag/OSMbox此类通信可以看作是 OS 提供的使用同步机制控制的单一全局变量通信方式。因此类接口只能处理深度为 1 的信号,无法传递复杂信息:信号监听者无法知道信号产生者发了多少次信号。 OSSem此类接口可以弥补 OSFlag/OSMbox 信号深度的缺陷。如果再搭配内存队列,就可以达到下面的 OSQ 的作用。 OSQ队列信号,可以容纳多于一个信号。任务切换所谓的任务切换,即指中断某个正在运行的任务,剥离其 CPU 控制权,唤醒另一个任务。切换任务前,首先要保存
37、当前正在运行的任务的现场,包括: 程序堆栈 CPU 寄存器,协处理器寄存器 切换点下一条要执行的指令地址 如果某类资源不能保存和恢复,那么就必须要保证该类资源的访问在一个不可被打断的环境下运行之后,再恢复要切换到的任务的相关现场,然后跳转到新任务的下一条指令地址处。任务的切换有两种方式,一种是各任务在适当的位置自动交出 CPU 控制权,比如通过 OS 系统调用;另一种是在中断服务程序中,进行任务调度。毫无疑问,第二种方式保证了高优先级的任务可以中断地优先级任务的执行,也简化了应用开发者的任务,因为不需要再精确考虑在什么地方安排任务切换的系统调用更合适。任何一个 OS 应该都会隐藏的使用某个时钟
38、中断来实现基本的任务切换,并且在每次中断产生的时候增加其 tick 计数,这就是 OS 里面始终 tick 的由来。当然为了系统的流畅运行和响应速度,其他中断产生以后也会运行任务调度的代码。C-OS 使用 应用任务循环的最佳设计目标因每个任务都处在不停的循环之中,当所有应用任务都处在等待信号的状态时,只剩下 IDLE 任务在空耗 CPU。而一但某个信号产生了,比如通过中断输入了某个事件,则关注该信号的任务立即可以得到执行,处理完毕之后再次进入等待状态。在这种情况下,CPU 的负载最轻,系统的效率最高。而任务就变成了串行执行的代码,简化了开发者对复杂情况的分析处理。 应用任务优先级安排的一般准则 根据实际应用情况大致设计优先级排列 驱动优先级高,应用优先级低 任务负载低者优先级高,任务负载高者优先级低 前台任务优先级高,后台任务优先级低 常见问题,以下情况编程考虑时应当注意避免 系统调用死锁,常见于加锁以后进行系统阻塞调用 任务间互锁 堆栈溢出 全局变量参数访问不同步 加锁以后进入死循环 高优先级任务中的耗时长的纯指令延时代码,不加控制的运行10. 程序主程序遥控器UARTTUNERSECTION/解复用天线/开关搜索频道EPG 表7816-3动态显示Cccam延时抗反制Ecm 监控异常分析以太网络GPRSFtpdTftpd