μCOS-II程序设计实例-基于SmartARM2200平台PPT演示课件_第1页
μCOS-II程序设计实例-基于SmartARM2200平台PPT演示课件_第2页
μCOS-II程序设计实例-基于SmartARM2200平台PPT演示课件_第3页
μCOS-II程序设计实例-基于SmartARM2200平台PPT演示课件_第4页
μCOS-II程序设计实例-基于SmartARM2200平台PPT演示课件_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C/OS-II程序设计实例,基于SmartARM2200平台,1,2,工程模板介绍,万年历,数据采集系统,UART中间件,I2C中间件,目录,2,工程模板简介,1,工程模板应用|C/OS-II程序设计,目录,3,工程模板应用|C/OS-II程序设计,摸板结构,4,工程模板应用|C/OS-II程序设计,头文件组,头文件主要包含一些宏定义和文件包含操作这些文件一般是为了提高摸板的通用性和方便系统移植而定义的用户在使用时可以根据自己的系统硬件配置和喜好进行修改在工程摸板中主要包含六个头文件,具体描述如下表所示:,5,工程模板应用|C/OS-II程序设计,ARM文件组,ARM文件组主要包含配置文件和SmartARM2200加载和配置文件主要包含六个文件,具体描述如下表所示:,6,工程模板应用|C/OS-II程序设计,用户文件组,用户文件组主要包含main.h,main.c和os_cfg.h三个文件前两个文件有用户自己编写os_cfg.h文件主要是实现操作系统的配置,用户可以根据实际需要进行裁剪具体描述如下表所示:,7,工程模板应用|C/OS-II程序设计,摸板使用步骤,使用摸板建立新工程分为四个步骤主要操作如下:,用户将光盘中的“ARMEXECUTABLEIMAGEFORUCOSLPC2200“文件拷贝到”.ARMADSV1.2STATIONERY,8,工程模板应用|C/OS-II程序设计,摸板使用步骤,将光盘摸板文件放进Stationary目录:,9,在ADS1.2的集成开发环境中选择”新建”操作,用户将光盘中的“ARMEXECUTABLEIMAGEFORUCOSLPC2200“文件拷贝到”.ARMADSV1.2STATIONERY,工程模板应用|C/OS-II程序设计,摸板使用步骤,使用摸板建立新工程分为四个步骤主要操作如下:,10,工程模板应用|C/OS-II程序设计,摸板使用步骤,在ADS集成环境中选择”新建”操作:,11,在ADS1.2的集成开发环境中选择”新建”操作,用户将光盘中的“ARMEXECUTABLEIMAGEFORUCOSLPC2200“文件拷贝到”.ARMADSV1.2STATIONERY,选择工程摸板建立新工程,工程模板应用|C/OS-II程序设计,摸板使用步骤,使用摸板建立新工程分为四个步骤主要操作如下:,12,工程模板应用|C/OS-II程序设计,摸板使用步骤,选择工程摸板建立新工程:,13,在ADS1.2的集成开发环境中选择”新建”操作,用户将光盘中的“ARMEXECUTABLEIMAGEFORUCOSLPC2200“文件拷贝到”.ARMADSV1.2STATIONERY,选择工程摸板建立新工程,按照摸板生成一个新工程,工程模板应用|C/OS-II程序设计,摸板使用步骤,使用摸板建立新工程分为四个步骤主要操作如下:,14,工程模板应用|C/OS-II程序设计,摸板使用步骤,按照摸板生成新工程:,15,工程模板应用|C/OS-II程序设计,目录,16,工程模板应用|C/OS-II程序设计,硬件连接,摸板应用示例是蜂鸣器控制,在SMARTARM2200工控平台上进行测试,硬件连接如下图所示:,蜂鸣器控制电路,跳线连接,17,工程模板应用|C/OS-II程序设计,任务创建,在应用示例中,先按上面的流程建立工程TEST1.MCP.再在工程的主函数MAIN中建立任务TASK0,TASK0任务是初始化硬件.接着创立TASK1,TASK2,TASK3.TASK1,TASK2只是将任务挂起延时.TASK3任务实现蜂鸣器控制.任务之间联系如下图所示:,18,工程模板应用|C/OS-II程序设计,任务创建,MAIN函数,19,工程模板应用|C/OS-II程序设计,任务流程,示例中主函数和个任务的控制流程如下:,20,工程模板应用|C/OS-II程序设计,ISR任务示例,中断示例中先按上面流程创建新工程Timer1_int.mcp,再在主函数中创建任务TASK0和TASKBEEP,TASK0完成硬件初始化.TASKBEEP完成蜂鸣器信号量等待和操作.程序流程如下:,21,下面以示例来说明如何现实ISR与任务间同步。假设定时器1中断服务程序发送信号量,任务完成了信号量的创建并在接收到信号量后让蜂鸣器响一声。处理流程如下。,工程模板应用|C/OS-II程序设计,ISR任务示例,22,voidTimer1_Exception(void)T1IR=0 x01;VICVectAddr=0;OSSemPost(sem);,中断服务程序ISR示例代码如下。,工程模板应用|C/OS-II程序设计,ISR任务示例,23,voidTaskBeep(void*pdata)sem=OSSemCreate(0);OS_ENTER_CRITICAL();/*初始化VIC(省略)*/*初始化定时器1(省略)*/*目标板初始化TargeInit()(省略)*/OS_EXIT_CRITICAL();while(1)OSSemPend(sem,0,读者补出相应的代码,蜂鸣器报警任务示例代码如下。,工程模板应用|C/OS-II程序设计,ISR任务示例,24,2,工程模板介绍,万年历,数据采集系统,UART中间件,I2C中间件,3,uC/OS-II,目录,25,任务间的同步与通信,1,数据采集系统|C/OS-II程序设计,目录,26,一、任务的同步,在实时操作系统中,任务和任务之间往往需要协调运行,这种协调关系,在日常生活里也是屡见不鲜的。为了说明这种协调关系,请看下面的演示:,司机,售票员,启动车辆,关车门,行驶,售票,1、什么是任务的同步?,停车,开车门,、启动车辆,踩油门就可以了;但实际上,你必须等车门关上了才可以启动车辆。,、行驶和售票的行动互不干涉、彼此独立,此时不存在协调关系。,、开车门只要按下开关就可以了;但实际上,你得等司机停车才能开车门,否则就出事故了。,由该演示可知,任务的同步,就是任务的协调运行,你一步、我一步地紧密协作:,任务的同步和通信|数据采集系统,任务的同步,27,一、任务的同步,在实时操作系统中,任务和任务之间往往需要协调运行,这种协调关系,在日常生活里也是屡见不鲜的。为了说明这种协调关系,请看下面的演示:,任务A,任务B,1、什么是任务的同步?,、任务B运行一段时间后,发送信息让任务A启动,与此同时,任务B挂起。,、任务A获得允许运行的信息后,立即启动;完成操作后,发送信息告知任务B,任务B可以启动并执行接下来的操作。,任务的同步和通信|数据采集系统,任务的同步,28,C/OS-II实时操作系统提供了以下通信手段,使某一任务得以向另一任务发送同步信息,从而实现任务同步:,2、任务同步的通信手段,计数信号量;事件标志组;消息邮箱;消息队列。,灵活运用这些通信手段,可满足不同的任务同步需求,请看表1:,任务的同步和通信|数据采集系统,任务的同步,29,2、任务同步的通信手段,表1不同同步手段的应用场合,由上表可知,任务和任务之间不仅可以发送用于协调步伐的“同步”信息,也可以发送有效的数据,实现真正意义的通信。,任务的同步和通信|数据采集系统,任务的同步,30,在嵌入式系统的运行过程中,任务与任务之间必然伴随着数据通信,这种通信可以采用多种方法来实现:,二、任务的通信,全局变量;内存数据块;消息邮箱;消息队列。,灵活运用这些不同的方法,可满足不同的数据通信要求,请看表2:,任务的同步和通信|数据采集系统,任务的通信,31,表2不同通信手段的应用场合,二、任务的通信,介绍完行为同步和通信的基本知识后,接下来再给出实例,以加深理解。,任务的同步和通信|数据采集系统,任务的通信,32,三、操作示例,1、示例简介,利用LPC2000系列ARM相关开发板上已有的资源,可以构筑一个小型的数据采集系统,如下所示:,LPC2000系列ARM相关开发板,串口线,上位机,示例的内容是:按下开发板上的按键、令ARM芯片启动A/D采样;采样结束后,再将采样结果通过串口线发送到上位机显示。,任务的同步和通信|数据采集系统,操作示例,33,2、示例里的任务,在本示例内,划分出了3个用户任务,相关信息如表3所示。,表3任务信息,接下来,将以动画的形式演示该数据采集系统的运转流程,并在每一个运行阶段加以讲解。,任务的同步和通信|数据采集系统,操作示例,34,2、示例演示,(1)初始阶段,三个任务的状态:按键任务在不停扫描按键,查询是否有键按下;采样任务完成一部分工作后挂起,等待按键任务发出启动信号;显示任务挂起,等待采样任务发出启动信号和显示数据。,按键任务,采样任务,显示任务,挂起,挂起,不断扫描,任务的同步和通信|数据采集系统,操作示例,35,2、示例演示,(2)启动采样,按键任务扫描到有按键按下,发出信号量。,按键任务,采样任务,显示任务,挂起,挂起,扫描到按键,采样任务得到了信号量从而就绪,然后在接下来的任务调度中进入运行状态,开始采样。,开始采样,显示任务仍在等待采样任务发送启动信号和采样结果。,任务的同步和通信|数据采集系统,操作示例,36,2、示例演示,(3)发送采样结果,按键任务继续扫描按键。(此时若扫描到按键,将在下一轮处理)。,采样任务,显示任务,采样完毕,可以发送采样结果了,于是发送消息到消息邮箱。,显示任务获得了消息进入就绪状态,然后在任务调度下获得运行机会,将收到的采样结果发送到上位机。,按键任务,不断扫描,采样结束启动显示,开始采样,将采样结果发送至上位机,任务的同步和通信|数据采集系统,操作示例,37,2、示例演示,(1)初始阶段,回到了初始阶段。进行下一轮的数据采集、发送工作。,按键任务,采样任务,显示任务,挂起,挂起,不断扫描,任务的同步和通信|数据采集系统,操作示例,38,任务的同步和通信|数据采集系统,目录,39,ISR主要被用于响应异步事件,在ISR里可触发其它任务的运行,实现ISR和任务的同步。ISR和任务间的同步关系比较简单,它们之间的关系是单向的。任务间的同步就不同了,可是单向亦可是双向的。,一、ISR和任务的同步,、可以看出,ISR始终是控制者,关联任务只能被控制;,、可以看出,任务之间的同步里,某一任务可以是被控制者也可以是控制者。,任务的同步和通信|数据采集系统,ISR和任务的同步,40,ISR和任务间的通信手段包括信号型和数据型,两种手段的应用场合是不同的,请看表4。,二、ISR和任务的通信,表4信号型通信和数据型通信的对比,为了进一步说明,接下来请看下面的实例演示。,任务的同步和通信|数据采集系统,ISR和任务的通信,41,三、实例演示,1、示例简介,示例的内容是:示例进行时,蜂鸣器一直在间歇鸣叫;用户按下板上的按键、触发外部中断;外部中断再触发“读取ADC然后将采样结果发送至上位机”的操作。,利用LPC2000系列ARM相关开发板上已有的资源,可以构筑一个小型的数据采集系统,如下所示:,LPC2000系列ARM相关开发板,任务的同步和通信|数据采集系统,ISR和任务的通信,42,2、示例里的任务,在本示例内,划分出了2个用户任务,相关信息如表5所示。,表5任务信息,接下来,将以动画的形式演示该实例的运转流程,并在每一个运行阶段加以讲解。,任务的同步和通信|数据采集系统,操作示例,43,3、示例演示,这是外部中断未发生时,用户任务执行的情况:,采样和显示任务,初始化硬件,等待信号量,蜂鸣器间歇鸣叫,任务的同步和通信|数据采集系统,操作示例,44,3、示例演示,这是外部中断发生时,用户任务执行的情况:,采样和显示任务,初始化硬件,等待信号量,蜂鸣器间歇鸣叫,发送采样结果,任务的同步和通信|数据采集系统,操作示例,45,3、示例演示,这是外部中断发生时,用户任务执行的情况:,采样和显示任务,初始化硬件,等待信号量,蜂鸣器间歇鸣叫,发送采样结果,任务的同步和通信|数据采集系统,操作示例,46,2,工程模板介绍,万年历,数据采集系统,UART中间件,I2C中间件,uC/OS-II,目录,47,示例简介,1,万年历|C/OS-II程序设计,目录,48,一、示例简介,在这里,通过一个万年历的设计,来说明C/OS-II下程序设计的方法:,利用LPC2000系列ARM相关的开发板和EasyARM串口调试软件(自带一个万年历界面)来实现一个具有以下功能的万年历:,实时显示:不断显示当前的年月日星期、时间信息;时间设置:可设置万年历的时钟和年月日信息(星期信息自动调整),完成设置后,可更新显示。,、开始重设年份;,、设置完后,恢复显示。,、2007年被重设为3007年,此时星期自动完成了调整;,EasyARM串口调试软件自带的万年历界面,接下来,是一个动画演示。它直接表现了最终的万年历效果,这有助于让读者迅速理解示例须达成的任务。,万年历|C/OS-II程序设计,示例简介,49,万年历|C/OS-II程序设计,目录,50,二、示例的实现,1、功能划分,控制,显示时间信息,产生时间信息,从功能来划分,可把示例分成3个模块,请看下图:,“控制”通过操作开发板上的按键,实现:“实时显示”和“时间设置”功能的切换;“时间设置”。,万年历|C/OS-II程序设计,示例的实现,51,二、示例的实现,1、功能划分,控制,显示时间信息,产生时间信息,从功能来划分,可把示例分成3个模块,请看下图:,“产生时间信息”操作开发板上LPC2000系列ARM芯片自带的RTC,即可产生时间信息,用于填充万年历。,万年历|C/OS-II程序设计,示例的实现,52,二、示例的实现,1、功能划分,控制,显示时间信息,产生时间信息,从功能来划分,可把示例分成3个模块,请看下图:,“显示时间”通过板上的UART,按照协议将信息发送至EasyARM串口调试软件,软件上的万年历即可显示出此时的时间信息。不断发送实时时间信息,则万年历会不断显示。,万年历|C/OS-II程序设计,示例的实现,53,二、示例的实现,2、任务设计,根据上面划分出的功能模块实现需求,任务可以划分为:,设置任务;,键盘任务;,显示任务。,周期性地执行。完成目标板和RTC的初始化操作,之后创建“设置任务”和“显示任务”,随后周期性地查询键盘输入,当有键按下,则进行按键处理。,万年历|C/OS-II程序设计,示例的实现,54,二、示例的实现,2、任务设计,根据上面划分出的功能模块实现需求,任务可以划分为:,设置任务;,键盘任务;,显示任务。,周期性地执行。完成目标板和RTC的初始化操作,之后创建“设置任务”和“显示任务”,随后周期性地查询键盘输入,当有键按下,则进行按键处理。,接收到按键消息后才运行。启动后,根据收到的按键信息设置时间,并闪烁显示待设置位,未收到消息则挂起。,万年历|C/OS-II程序设计,示例的实现,55,二、示例的实现,2、任务设计,根据上面划分出的功能模块实现需求,任务可以划分为:,设置任务;,键盘任务;,显示任务。,周期性地执行。完成目标板和RTC的初始化操作,之后创建“设置任务”和“显示任务”,随后周期性地查询键盘输入,当有键按下,则进行按键处理。,接收到按键消息后才运行。启动后,根据收到的按键信息设置时间,并闪烁显示待设置位,未收到消息则挂起。,每过1秒,由RTC秒中断触发该任务的运行。该任务启动后便将当前的RTC数据通过UART发送至上位机的万年历界面进行实时显示。,万年历|C/OS-II程序设计,示例的实现,56,3、任务运行演示,为了说明三个任务的状态转换过程,设计了两个动画演示。演示分为两部分。第一部分,是按键未按下时,三大任务的状态转换过程:,初始化目标板和RTC;,万年历|C/OS-II程序设计,示例的实现,57,3、任务运行演示,为了说明三个任务的状态转换过程,设计了两个动画演示。演示分为两部分。第一部分,是按键未按下时,三大任务的状态转换过程:,创建设置任务和显示任务;,键盘任务,万年历|C/OS-II程序设计,示例的实现,58,3、任务运行演示,为了说明三个任务的状态转换过程,设计了两个动画演示。演示分为两部分。第一部分,是按键未按下时,三大任务的状态转换过程:,创建设置任务和显示任务;,键盘任务,查询是否有按键输入;,在查询按键输入期间,设置任务和显示任务都可以得到运行机会,完成部分工作。,、初始化部分变量后,检查是否收到键盘消息。,、等待信号量,挂起。,万年历|C/OS-II程序设计,示例的实现,59,3、任务运行演示,为了说明三个任务的状态转换过程,设计了两个动画演示。演示分为两部分。第一部分,是按键未按下时,三大任务的状态转换过程:,创建设置任务和显示任务;,键盘任务,查询是否有按键输入;,、初始化部分变量后,检查是否收到键盘消息。,、等待信号量,挂起。,发生秒中断,在中断里发送信号量给显示任务,显示任务就绪,开始发送时间信息到上位机,更新万年历的显示。,、发送时间信息。,万年历|C/OS-II程序设计,示例的实现,60,3、任务运行演示,按键按下时,任务的转换过程如下所示:,创建设置任务和显示任务;,键盘任务,查询是否有按键输入;,、初始化部分变量后,检查是否收到键盘消息。,、等待信号量,挂起。,查到有按键输入,发送按键消息。,万年历|C/OS-II程序设计,示例的实现,61,3、任务运行演示,按键按下时,任务的转换过程如下所示:,创建设置任务和显示任务;,键盘任务,查询是否有按键输入;,、初始化部分变量后,检查是否收到键盘消息。,、等待信号量,挂起。,查到有按键输入,发送按键消息。,、根据键盘消息进行处理。,令被设置位闪烁显示;同时,根据消息内的设置信息设定新的时间。之后,在秒中断发生时,更新的时间信息被发送到上位机。,发生秒中断,、发送时间信息。,万年历|C/OS-II程序设计,示例的实现,62,2,工程模板介绍,万年历,数据采集系统,UART中间件,I2C中间件,uC/OS-II,目录,63,2,简介,1,使用导论,UART中间件|C/OS-II程序设计,目录,64,一、UART中间件简介,嵌入式应用中,UART十分常见,大多数CPU都集成了UART。LPC2000系列ARMUART中间件是UART驱动软件包,用户可用它在C/OS-II下轻松、便利地完成LPC2000系列ARM上的UART操作而无须了解UART寄存器的细节。,关于UART中间件带来的操作便利性,请看下面的一个演示,该演示展示了在“使用UART中间件”和“不使用UART中间件”这两种情况下,用户的开发流程,借此展示使用UART中间件编程带来的好处。,开始播放,请点击,UART中间件|C/OS-II程序设计,UART中间件简介,65,开始,开始,翻阅用户手册,阅读UART的寄存器结构,确定本次操作所需涉及的寄存器,阅读涉及寄存器的位功能说明,写程序,试探程序思路是否可靠、正确,反复调试、摸索,获得初始版本,完成操作(以后可能还会出问题),结束,浏览PPT,迅速理解概况和基本知识,阅读中间件的API说明,了解API的用法,用中间件API编程,直接调试程序,无须考虑底层细节,结束,自己编写UART驱动,直接用中间件编程,UART中间件|C/OS-II程序设计,UART中间件简介,66,小结:,由上面的演示可以看出,使用UART中间件,有助于大大加快开发速度,提高编程效率,同时令用户程序更稳定可靠、更容易调试。,UART中间件|C/OS-II程序设计,UART中间件简介,67,UART中间件结构:,按照API功能的不同,UART中间件的结构可显示如下:,UART中间件|C/OS-II程序设计,UART中间件简介,68,UART中间件结构:,按照API功能的不同,UART中间件的结构可显示如下:,UART中间件|C/OS-II程序设计,UART中间件简介,69,UART中间件结构:,按照API功能的不同,UART中间件的结构可显示如下:,UART中间件|C/OS-II程序设计,UART中间件简介,70,UART中间件结构:,按照API功能的不同,UART中间件的结构可显示如下:,UART中间件|C/OS-II程序设计,UART中间件简介,71,小结:,UART中间件有四大功能模块,由一共12个API组成。详细的API信息,请用户阅读随机赠送的参考书及光盘。,UART中间件|C/OS-II程序设计,UART中间件简介,72,2,使用导论,UART中间件|C/OS-II程序设计,目录,73,二、使用导论,在使用UART中间件进行编程前,有必要知道一些预备知识。本小节即对这些预备知识进行介绍:,装载UART中间件须知,UART中间件的重要使用细节几则,UART中间件的一般应用流程,UART中间件|C/OS-II程序设计,使用导论,74,UART中间件的文件组成,UART中间件是由2个文件组成,请看下表:,UART中间件|C/OS-II程序设计,使用导论,75,UART中间件所需的其它软件包,UART中间件要发挥作用,还需要其它软件包的支持,即队列和字符串处理软件包QueueString,请看左下的图示:,为什么需要这个软件包呢?,UART中间件用到了队列来收发数据,所以需要队列软件来支持;UART中间件的API参数设置是通过分析用户输入的字符串来实现的,所以需要字符串处理软件。,UART中间件|C/OS-II程序设计,使用导论,76,UART中间件API的参数输入,在使用UART中间件所包含的部分API时,用户需以字符串形式输入函数的入口参数,参数都包含在字符串里。请看下面的示例:,charcUartArg=“BaudRate=9600DataBits=8StopBits=1Parity=0RtsControl=0”;,/*定义参数字符串*/,/*将参数字符串填入API*/,uartInit(UART0,cUartArg,NULL);,、用户根据“=”号前的关键字,在“=”号后填写对应的数值;,charcUartArg=“BaudRate=9600DataBits=8StopBits=1Parity=0RtsControl=0”;,charcUartArg=“BaudRate=9600DataBits=8StopBits=1Parity=0RtsControl=0”;,UART中间件|C/OS-II程序设计,使用导论,77,UART中间件API的参数输入,在使用UART中间件所包含的部分API时,用户需以字符串形式输入函数的入口参数,参数都包含在字符串里。请看下面的示例:,charcUartArg=“BaudRate=9600DataBits=8StopBits=1Parity=0RtsControl=0”;,/*定义参数字符串*/,/*将参数字符串填入API*/,uartInit(UART0,cUartArg,NULL);,、用户根据“=”号前的关键字,在“=”号后填写对应的数值;,charcUartArg=“BaudRate=9600DataBits=8StopBits=1Parity=0RtsControl=0”;,、每一个API的对应关键字都不同,用户需要参考该函数的说明;此外,关键字是大小写敏感的。,、所以,小结一下。用户根据函数说明,将填好参数的对应参数字符串送入函数即可完成函数的参数配置了。这种配置方法大大提高了函数的兼容性和易用性。,uartInit(UART0,cUartArg,NULL);,UART中间件|C/OS-II程序设计,使用导论,78,队列在UART中间件里的应用,UART中间件可对硬件缓冲区和软件缓冲区进行操作。其中,软件缓冲区是通过中间件里的队列软件包,抽取处理器自身的部分RAM资源进行管理而实现的。通过队列软件包管理的软件缓冲区,可以大大提高UART通讯的可靠性。当OS有更重要的任务要处理,那么UART须收发的数据可暂时保存在软件缓冲区里,这样就不会造成数据丢失。请看演示:,其它事务,软件缓冲区_接收缓存,在处理其它事务时,UART仍通过中断将接收的数据转移至缓冲区等待处理,UART中间件|C/OS-II程序设计,使用导论,79,使用UART中间件配置UART中断,用户可能会需要利用UART中断来完成自己的事务处理。为了满足该需求,UART中间件提供了让用户自行添加中断处理代码的机制。用户只要在uart.h里找到相应的uart中断服务函数,在函数里添加自己的代码即可。以设置uart0的中断服务函数为例,请看下图:,由于接收中断和发送中断都是使用同一个中断入口,所以用户添加自定义中断处理代码时要注意添加的位置。,UART中间件|C/OS-II程序设计,使用导论,80,UART中间件的应用流程,现在已将应用UART中间件前的预备知识介绍完毕,这里再给出UART中间件的应用流程,给用户一个该软件包应用的整体印象。,开始,设置UART管脚,配置中断,用中间件API编程,用户程序,结束,使用UART前,须对管脚作设置,这部分的工作并没有包括到中间件里;,由于UART中间件是使用中断来进行收发,所以用户需要初始化UART中断,这部分的工作并没有包括到中间件里;,在作好相关的初始化工作后,用户即可直接使用中间件里的API“组装”应用程序了。,UART中间件|C/OS-II程序设计,使用导论,81,2,使用导论,UART中间件|C/OS-II程序设计,目录,82,三、使用机理,为令用户深入理解UART中间件的机制,此处对该中间件的几个重要机制作一阐述:,数据缓冲机制;,数据收发机制;,UART中断和UART任务的通讯。,三个机制间的关系,可用下图揭示:,UART中间件|C/OS-II程序设计,使用机理,83,三、使用机理,为令用户深入理解UART中间件的机制,此处对该中间件的几个重要机制作一阐述:,数据缓冲机制;,数据收发机制;,UART中断和UART任务的通讯。,三个机制间的关系,可用下图揭示:,UART中断,数据收发是在UART中断里进行的;,待收发的数据都先送到数据缓冲区;这个过程也是在UART中断里完成;,UART任务,发送信号量,数据收发和数据缓冲处理都在中断里进行,当这些工作处理完毕后,UART中断须发送信号量通知UART任务,相关工作已完成。,UART中间件|C/OS-II程序设计,使用机理,84,接下来,分别对各机制作一些详细的介绍:,1、数据缓冲机制,在UART中间件的使用中,存在着硬件缓冲区和软件缓冲区两个概念。硬件缓冲区是UART自身所配备的FIFO寄存器,而软件缓冲区占用的是处理器的内部RAM资源。,软件缓冲区的存在,构成了对硬件缓冲区的扩展,有助于UART通讯可靠性的进一步提高。,UART中间件|C/OS-II程序设计,使用机理,85,1、数据缓冲机制,用户也可以根据实际情况对数据缓冲区进行配置:,硬件缓冲区的配置,用户可以配置接收FIFO的触发深度,以配置UART0接收FIFO的触发深度为8为例,请看下面的演示:,设置UART0的接收FIFO触发深度为8个字节,UART中间件|C/OS-II程序设计,使用机理,86,1、数据缓冲机制,用户也可以根据实际情况对数据缓冲区进行配置:,软件缓冲区的配置,用户还可以配置软件缓冲区内接收/发送缓冲区的大小,以配置UART0为例,请看下面的演示:,直接修改这两个数值的大小即可。但是,软件接收缓冲区的大小建议配置为接收FIFO触发深度的整数倍。,UART中间件|C/OS-II程序设计,使用机理,87,2、数据收发机制,如前所述,在本中间件里,UART的数据收发皆是在UART中断里进行。下面分别介绍一下数据收发的过程:,数据接收,当产生接收中断或超时中断时,CPU通过查询状态寄存器,将所收到的数据全部转移至软件接收缓冲区。请看下图:,软件FIFO,硬件FIFO,接收数据,产生中断,处理接收数据,UART中间件|C/OS-II程序设计,使用机理,88,数据发送,先把要发送的所有数据放入软件发送缓冲区,然后再取出其中的第一个数据用查询方式发送,从而触发发送中断;接下来,在发送中断里,软件发送缓冲区内剩余的数据也全部被发送完。相关的过程,请看下图:,软件FIFO,硬件FIFO,发送完一个字节后产生中断,之后一直发送直至发送完毕,将待发送数据送入软件FIFO,UART中间件|C/OS-II程序设计,使用机理,89,3、UART中断和任务,在UART中间件里,由于对软件缓冲区的操作乃至数据的收发都是在UART中断内完成,所以必然面临着UART中断和任务间的协调问题。,前文已述及,UART中断和UART任务是单向同步的关系,它们俩也各有分工:,UART中断负责完成底层的收发操作,并在收发操作完成时,通知UART任务;,UART任务则根据UART中断发送的信号量直接调用中间件里的API完成应用操作。所以,用户可以不用了解底层操作细节,而直接完成UART操作。,UART中间件|C/OS-II程序设计,使用机理,90,3、UART中断和任务,以1个最简单的UART收发操作为例,展示UART中断和UART任务间的关系:,相关的初始化工作都已经做好,令UART0收到上位机发来的数据,然后再发送回去。这样一个过程,是怎样的?,UART中断,UART任务,、初始化后,等待信号量;,、发生中断;,、发出信号量;,、获得信号量;,、中断返回;,、读取收到的数据,然后发送。,UART中间件|C/OS-II程序设计,使用机理,91,2,工程模板介绍,万年历,数据采集系统,UART中间件,I2C中间件,uC/OS-II,目录,92,I2C中间件|C/OS-II程序设计,目录,93,I2C总线(InterICBUS)是Philips推出的芯片间串行传输总线,它以2根连线实现了完善的双向数据传送;并且,由于是通过软件来寻址器件,I2C总线上的器件扩展是灵活而方便的。,本I2C中间件支持C/OS-II操作系统和前后台系统下,对LPC2000系列ARM的I2C总线进行操作。,接下来,对I2C中间件的文件组成作一介绍:,I2C中间件|C/OS-II程序设计,简介,94,I2C总线(InterICBUS)是Philips推出的芯片间串行传输总线,它以2根连线实现了完善的全双工同步数据传送;并且,由于是通过软件来寻址器件,I2C总线上的器件扩展是灵活而方便的。,本I2C中间件支持C/OS-II操作系统和前后台系统下,对LPC2000系列ARM的I2C总线进行操作。,各头文件的包含关系则如下所示:,接下来,介绍I2C中间件包括哪些API:,由上表可见,I2C中间件共包含三大功能模块、9个API。,I2C中间件|C/OS-II程序设计,简介,95,接下来,介绍I2C中间件包括哪些API:,由上表可见,I2C中间件共包含三大功能模块、9个API。,使用I2C中间件也有一定的流程:,I2C中间件只针对I2C部件进行了操作,其它与系统相关的地方如管脚连接和中断向量都需要单独设置。中间件的一般使用流程,如下图所示:,I2C中间件|C/OS-II程序设计,简介,96,小结:,开始,文件组成,API简介,中间件应用流程,结束,介绍了I2C中间件的用途和应用范围;,介绍了I2C中间件的文件组成及各自的作用;,概述了I2C中间件内API的全貌;,中间件概述,为了让读者形成应用I2C中间件的整体印象而介绍了中间件的一般应用流程。,用下面的演示对本小节所叙述的内容作一回顾:,小节的叙述轨迹,I2C中间件|C/OS-II程序设计,简介,97,I2C中间件|C/OS-II程序设计,目录,98,用户在使用中间件进行编程之前,有必要理解一些重要细节。本小节将对以下几个方面展开叙述:,在本中间件里,使用字符串来给API提供入口参数。,在此处介绍钩子函数、也即回调函数的概念。,由于对I2C设备进行读写时要求独占,所以存在阻塞-释放机制。,I2C中间件|C/OS-II程序设计,使用导论,99,中间件里的部分API,是采用字符串来输入入口参数的,字符串的格式如下所述:,关键字0=值0空格关键字1=值1空格关键字2=值2空格,I2C中间件|C/OS-II程序设计,使用导论,100,钩子函数,顾名思义,它“倚靠”在某一个函数内(墙壁),但又可“挂上”其它代码(钩子可挂各种物件)。请看下面的图示:,voidi2c0IRQ(void),i2c0Hook();,voidi2c0Hook(void),/*自定义代码*/,“墙壁”,“钩子”,“所挂物件”,I2C中间件|C/OS-II程序设计,使用导论,101,实际情况里,钩子函数所“挂”的自定义代码如何运行呢?请看演示:,voidi2c0IRQ(void),i2c0Hook();,voidi2c0Hook(void),/*自定义代码*/,I2C中间件|C/OS-II程序设计,使用导论,102,1、阻塞,对于同一个I2C接口,有任务A正对其进行读写操作;而在同时,另一个任务B也要对其进行读写操作。那么,只有待任务A操作完毕,该I2C接口空闲,任务B方可操作I2C接口。于是,需要暂时阻塞任务B的运行。什么时候会发生阻塞呢?,任务调用中间件里的带阻塞功能AP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论