【精品】第8章基于ucosii的程序设计实例

上传人:woxinch****an2018 文档编号:38980973 上传时间:2018-05-10 格式:DOC 页数:22 大小:350KB
返回 下载 相关 举报
【精品】第8章基于ucosii的程序设计实例_第1页
第1页 / 共22页
【精品】第8章基于ucosii的程序设计实例_第2页
第2页 / 共22页
【精品】第8章基于ucosii的程序设计实例_第3页
第3页 / 共22页
【精品】第8章基于ucosii的程序设计实例_第4页
第4页 / 共22页
【精品】第8章基于ucosii的程序设计实例_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《【精品】第8章基于ucosii的程序设计实例》由会员分享,可在线阅读,更多相关《【精品】第8章基于ucosii的程序设计实例(22页珍藏版)》请在金锄头文库上搜索。

1、可编程控制器应用技术与设计实例0第八章第八章第八章 基于基于基于 COS-IICOS-IICOS-II 的程序设计实例的程序设计实例的程序设计实例8.1 实例介绍为了使读者对 COS-II 操作系统有更深的理解,本章将介绍一个在 STM32F103 处理 器平台上使用 COS-II 实时操作系统的程序设计实例。此实例使用英倍特公司提供的 STM103V100 评估板来实现一个简易温度计。该实例使用 STM103V100 评估板自带的高灵 敏度数字温度传感器来传送温度数据,根据实际采样周期的需要,安排了四种不同的采样方 式。采样的条件和周期可以通过键盘输入进行调节,采样得到的结果可以在评估板的液

2、晶屏 上同步显示,并通过串口将采样所得的结果送到上位机。关于 STM103V100 评估板的更多 内容超出本书范围,请读者参阅其它相关资料。8.2 实例分析本节主要分析如何通过基于实时操作系统编程的方法实现整个系统的所有功能。下面 的内容将从任务划分开始,详细说明任务分析的过程。8.2.1 实例任务划分为了更合理的将整个系统划分为不同任务,首先要明确一个好的实时系统应具备那些 特点,即任务划分的基本原则是什么。一般说来,任务划分的基本原则有以下几点: 满足系统“实时性”:一般使用 COS-II 的嵌入式应用系统,对于响应时间要求很 高,如果实时性得不到满足,系统会出现错误甚至导致难以挽回的故障

3、。因此在任务划分时, 保证系统实时性是首要原则。 较少资源需求:多个任务协同运转,依靠操作系统的调度策略。任务之间的同步,任 务之间的通信,内存管理都需要消耗系统资源。所以在任务划分时,尽量将使用同类资源的 应用归入同一任务中,以减少操作系统调度时所消耗的资源。 合理的任务数:同一系统,任务划分的数目越多,每个任务的功能越简单,实现越容 易,但任务数目的增多,加大了操作系统的调度负担,资源开销也随之加大;相反,如果任 务划分的数目太少,会增加每个任务的复杂性,使任务设计难度加大。最极端的情况,当系 统任务数目减少到 1 时,也就失去了使用多任务操作系统的意义。 对一个具体的嵌入式应用系统进行任

4、务划分时,可以有不同的任务划分方案。常用的任务划分方法有:以硬件模块为对象划分任务、以实时性优先原则划分任务和切分耗时任务 等。所谓“以硬件模块为对象划分任务”就是根据系统需求,以硬件模块相关驱动为基础, 根据硬件驱动在系统中的关键性设定优先级的任务划分方法;“实现性优先原则划分任务” 即,将对实时性要求较高的应用划分为单独任务,并赋予较高的优先级来保证整个系统实时 性的要求;而“切分耗时任务”的任务划分方法,顾名思义就是将一些占用大量 CPU 处理 时间的繁琐应用从系统中分离出来,作为一个优先级较低的任务在系统空闲时运行。 根据上述任务划分的原则和方法,本实例被划分为 7 个任务:包括 4

5、个采用任务,1 个 负责和用户交互的键盘任务,1 个显示任务和 1 个向上位机传送数据的串口发送任务。其中, 4 个采样任务分别使用不同的采样条件:延时采样、使用系统时钟节拍采样、定时中断采样 和使用高优先级中断的采样。键盘任务除负责接收用户输入并做出反馈外,还需要完成操作 系统和系统资源的初始化,包括系统中用到的消息队列、邮箱和互斥信号量的创建等。因为 按键任务是第一个启动的用户任务,所以目标板的初始化也由该任务完成。8.2.2 实例任务设计与优先级分配完成系统任务划分后,需要对任务的优先级进行设定。任务优先级分配是否合理,直 接影响到系统的实时性和可靠性。对任务优先级的安排一般遵循以下原则

6、: 外设相关任务安排高优先级:因为外设任务直接与中断服务程序相对应,如果外设任 务优先级低,当需要中断处理时,系统资源可能被高优先级任务占用,而导致中断丢失; 根据任务实现功能的重要性安排优先级:一般情况下,任务越重要优先级越高; 占用关键资源的任务优先级尽量高:只有保证占用关键资源的任务优先运行,才能使 其尽早释放资源,以便其它任务运行; 对于周期性任务,执行周期越短的任务,优先级应越高,以保证其得到及时运行; 当以上条件相近时,耗时越短的任务优先级应越高。这样可以缩短其它就绪任务的延 时时间。 根据以上优先级安排原则,系统中存在的 4 个采样任务实现同样功能且均为一次性任 务。所以,4 个

7、任务的优先级应一致。但在 COS-II 操作系统中,同一优先级不允许存在 多个任务,所以将 4 个采样任务的优先级依次排列,因为它们不可能同时发生,则对于应用 来说,4 个任务的优先级是一致的。 键盘任务是系统运行的第一个任务,负责与用户交互。根据优先级安排原则,将其优 先级定为 7 个任务中的中等级别,设为 15。 显示任务负责将采集的数据显示在 LED 屏上,它由采样任务触发。根据优先级安排原 则,将其优先级定为 7 个任务中的最低优先级,设为 17。 系统中任务的优先级安排如下程序清单所示,void Task_FastSamp(void *pdata); /使用高优先级中断的采样,优先级

8、 5void Task_HookSamp(void *pdata); /使用钩子函数的采样任务,优先级 6void Task_TimerSamp(void *pdata); /使用定时中断的采用任务,优先级 7void Task_DelaySamp(void *pdata); /使用延时函数的采用任务,优先级 8void Task_Send(void *pdata); /串口发送任务,优先级 13可编程控制器应用技术与设计实例2void Task_Key (void *pdata); /键盘任务,优先级 15void Task_Disply(void *pdata); /显示任务,优先级 17

9、程序运行过程中,当系统检测到键盘输入后,根据采样周期的设定值而创建一个采样 任务和串口发送任务 Task_Send() 。4 个采样任务 Task_FastSamp() ,Task_HookSamp() , Task_TimerSamp() ,Task_DelaySamp()和串口发送任务 Task_Send()均为一次性任务, 且在任务完成后自动删除。Task_Disply()为消息队列驱动的任务,根据消息队列传送的 内容进行不同的显示操作。Task_Key()是周期性执行的任务,不断检测键盘输入,并根 据检测结果,做出不同的响应。 键盘任务是系统运行的第一个任务,负责系统初始化和其它任务的

10、创建。该任务运行 后,接收用户输入并根据接收到的输入值启动不同的采样任务。同时,将接收到的输入值通 过消息队列的形式发送到显示任务。 显示任务负责显示用户输入的参数值和采样任务采样得到的数据。 串口发送任务在键盘任务检测到发送操作按键确定时创建。该任务负责从全局采样数 组中读取数据并使用中断方式发送到上位机。全局采样数组是系统初始化时建立的 FIFO 缓 存,通过互斥信号量保护。 4 个采样任务均在键盘接收到用户输入后创建,不同的采样任务使用不同的采样方式进 行采样,并将采样所得数据保存在全局 FIFO 缓存中。所有采样任务在采样过程中的工作就 是检测什么时候采样结束,并且负责将采样所得的数据

11、进行处理。处理完毕后,发送消息通 知显示任务,最后删除自己本身。8.3 任务实现详解开始程序设计之前,首先了解一下主函数。在主函数中,进行了操作系统的初始化, 创建了一个键盘任务,然后,启动多任务操作系统。主程序代码如下:int main(void)#if (OS_TASK_NAME_SIZE = 16) INT8U err;#endifBsp_Init(); /系统外设初始化PWM_IoConfiguration(); /初始化系统时钟OSInit();/* 初始化 OS */Tmr_TickInit(); / 操作系统 Tick 初始化OSTaskCreateExt(Task_Key, /

12、任务指针(void *)0, (OS_STK *)#if (OS_TASK_NAME_SIZE = 16)OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)“Idle task“, OSTaskNameSet(OS_TASK_INIT_PRIO, (INT8U *)“Init task“, #endifOSStart();/* 启动多任务环境 */return(0);从程序中可以看到,当执行 OSStart()后,主函数返回,但了解了 ucos-II 操作系统后, 可以知道这个“return 0”的语句是不可能执行的。在主函数中创建了一个键盘任务 Task_K

13、ey() ,其优先级为 15,负责初始化目标板和根据用户输入创建其他任务。8.3.1 键盘任务键盘任务的主要工作就是周期性扫描键盘,优先级为 15。其程序流程图如图 8.1 所示。可编程控制器应用技术与设计实例4开始目标板初始化串口A/D转换初始化创建显示任务 TaskDisp创建互斥信号量创建消息邮箱创建消息队列按键处理图 8.1 键盘任务程序流程图 程序中,首先进行目标板初始化,目标板初始化过程请参见STM32F103 处理器内部 资源 C 编程与实例一章讲解。之所以将目标的初始化放在第一个任务里,是为了保证该 初始化在 OSStart()执行后完成。值得注意的是,与采样任务相关的 A/D

14、 转换初始化也放在 了这里,这是因为 4 个采样任务都用到了 A/D 转换,放在键盘任务中一次完成,避免了在 每个采样任务中单独初始化而带来的代码冗余。 接下来创建显示任务 Task_Disp() ,屏幕初始化工作放在 该任务中完成。 最后创建了任务轮转不可或缺的一些操作系统资源,包括一个互斥信号量 Sem,一个 邮箱 MyMbox 和一个消息队列 ReMsgQeue,其中消息队列中消息数目定义为 10。 按键处理是这个键盘任务的关键,这个键盘任务中状态转移情况如表 8.1 所示。表 8.1 键盘状态转移表初始状态操作键动作“确定”键flag 状态翻转,进入周期修改状态或退出修改状态“数字”键

15、如果为数字键并且 flag=1,则设定数字有效并显示;否则不响应“清零”键如果 flag=1,则将保存的设定值清零并显示,否则不响应状态 1:状态选定“移动”键如果 flag=0,则进入启动选定状态并显示,否则不响应如果 clflagp=1,则清零 clflagp。如果采样周期为 20ms,则创建钩子函数采样任务“确定”键如果采样周期为 20ms 的整倍数,但不为 20ms,则创建延时函数采样任务。状态 2:启动采样“移动”键进入显示选定状态“确定”键清除上一次显示的采样数据状态 3:清屏操作“移动”键创建发送任务,将采样所得数据送上位机“确定”键创建发生任务,将采样所得的数据发送到上位机状态

16、 4:发送命令状态“移动”键进入周期选定状态“确定”键flag 状态翻转,进入周期修改状态或退出修改状态“数字”键如果为数字键并且 flag=1,则设定数字有效并显示;否则不响应“清零”键如果 flag=1,则将保存的设定值清零并显示,否则不响应“高优先级采样”键如果 flag=1,则创建高优先级采样标志 clflg=1,否则不响应状态 5:采样周期设定状态“移动”键如果 flag=1,则进入条件选定状态并显示,否则不响应 从表 8.1 中可以清晰看出系统被划分成的 5 种状态,且在 5 种状态下,不同的按键动作 产生的不同后果: 状态 1:条件选定状态,处理采样条件设定相关内容; 状态 2:启动采样状态,即创建采样任务。使用一个 UINT16 型的数组保存采样周期 和采样条件,并将数组指针通过创建任务函数参数(void *)指针传递给采样任务; 状态 3:清屏操作,即清除本次采样数据。 状态 4:发送命令状态,将本次采样得到的数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号