已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第 2 章 可编程控制器的硬件结构 11 第八章第八章第八章 基于基于基于 COS IICOS IICOS II 的程序的程序的程序设计实设计实设计实例例例 8 1 实例介绍 为了使读者对 COS II 操作系统有更深的理解 本章将介绍一个在 STM32F103 处理 器平台上使用 COS II 实时操作系统的程序设计实例 此实例使用英倍特公司提供的 STM103V100 评估板来实现一个简易温度计 该实例使用 STM103V100 评估板自带的高灵 敏度数字温度传感器来传送温度数据 根据实际采样周期的需要 安排了四种不同的采样方 式 采样的条件和周期可以通过键盘输入进行调节 采样得到的结果可以在评估板的液晶屏 上同步显示 并通过串口将采样所得的结果送到上位机 关于 STM103V100 评估板的更多 内容超出本书范围 请读者参阅其它相关资料 8 2 实例分析 本节主要分析如何通过基于实时操作系统编程的方法实现整个系统的所有功能 下面 的内容将从任务划分开始 详细说明任务分析的过程 8 2 1 实例任务划分 为了更合理的将整个系统划分为不同任务 首先要明确一个好的实时系统应具备那些 特点 即任务划分的基本原则是什么 一般说来 任务划分的基本原则有以下几点 满足系统 实时性 一般使用 COS II 的嵌入式应用系统 对于响应时间要求很 高 如果实时性得不到满足 系统会出现错误甚至导致难以挽回的故障 因此在任务划分时 保证系统实时性是首要原则 较少资源需求 多个任务协同运转 依靠操作系统的调度策略 任务之间的同步 任 务之间的通信 内存管理都需要消耗系统资源 所以在任务划分时 尽量将使用同类资源的 应用归入同一任务中 以减少操作系统调度时所消耗的资源 合理的任务数 同一系统 任务划分的数目越多 每个任务的功能越简单 实现越容 易 但任务数目的增多 加大了操作系统的调度负担 资源开销也随之加大 相反 如果任 务划分的数目太少 会增加每个任务的复杂性 使任务设计难度加大 最极端的情况 当系 统任务数目减少到 1 时 也就失去了使用多任务操作系统的意义 对一个具体的嵌入式应用系统进行任务划分时 可以有不同的任务划分方案 常用的 可编程控制器应用技术与设计实例 12 任务划分方法有 以硬件模块为对象划分任务 以实时性优先原则划分任务和切分耗时任务 等 所谓 以硬件模块为对象划分任务 就是根据系统需求 以硬件模块相关驱动为基础 根据硬件驱动在系统中的关键性设定优先级的任务划分方法 实现性优先原则划分任务 即 将对实时性要求较高的应用划分为单独任务 并赋予较高的优先级来保证整个系统实时 性的要求 而 切分耗时任务 的任务划分方法 顾名思义就是将一些占用大量 CPU 处理 时间的繁琐应用从系统中分离出来 作为一个优先级较低的任务在系统空闲时运行 根据上述任务划分的原则和方法 本实例被划分为 7 个任务 包括 4 个采用任务 1 个 负责和用户交互的键盘任务 1 个显示任务和 1 个向上位机传送数据的串口发送任务 其中 4 个采样任务分别使用不同的采样条件 延时采样 使用系统时钟节拍采样 定时中断采样 和使用高优先级中断的采样 键盘任务除负责接收用户输入并做出反馈外 还需要完成操作 系统和系统资源的初始化 包括系统中用到的消息队列 邮箱和互斥信号量的创建等 因为 按键任务是第一个启动的用户任务 所以目标板的初始化也由该任务完成 8 2 2 实例任务设计与优先级分配 完成系统任务划分后 需要对任务的优先级进行设定 任务优先级分配是否合理 直 接影响到系统的实时性和可靠性 对任务优先级的安排一般遵循以下原则 外设相关任务安排高优先级 因为外设任务直接与中断服务程序相对应 如果外设任 务优先级低 当需要中断处理时 系统资源可能被高优先级任务占用 而导致中断丢失 根据任务实现功能的重要性安排优先级 一般情况下 任务越重要优先级越高 占用关键资源的任务优先级尽量高 只有保证占用关键资源的任务优先运行 才能使 其尽早释放资源 以便其它任务运行 对于周期性任务 执行周期越短的任务 优先级应越高 以保证其得到及时运行 当以上条件相近时 耗时越短的任务优先级应越高 这样可以缩短其它就绪任务的延 时时间 根据以上优先级安排原则 系统中存在的 4 个采样任务实现同样功能且均为一次性任 务 所以 4 个任务的优先级应一致 但在 COS II 操作系统中 同一优先级不允许存在 多个任务 所以将 4 个采样任务的优先级依次排列 因为它们不可能同时发生 则对于应用 来说 4 个任务的优先级是一致的 键盘任务是系统运行的第一个任务 负责与用户交互 根据优先级安排原则 将其优 先级定为 7 个任务中的中等级别 设为 15 显示任务负责将采集的数据显示在 LED 屏上 它由采样任务触发 根据优先级安排原 则 将其优先级定为 7 个任务中的最低优先级 设为 17 系统中任务的优先级安排如下程序清单所示 void Task FastSamp void pdata 使用高优先级中断的采样 优先级 5 void Task HookSamp void pdata 使用钩子函数的采样任务 优先级 6 void Task TimerSamp void pdata 使用定时中断的采用任务 优先级 7 void Task DelaySamp void pdata 使用延时函数的采用任务 优先级 8 void Task Send void pdata 串口发送任务 优先级 13 第 2 章 可编程控制器的硬件结构 13 void Task Key void pdata 键盘任务 优先级 15 void Task Disply void pdata 显示任务 优先级 17 程序运行过程中 当系统检测到键盘输入后 根据采样周期的设定值而创建一个采样 任务和串口发送任务 Task Send 4 个采样任务 Task FastSamp Task HookSamp Task TimerSamp Task DelaySamp 和串口发送任务 Task Send 均为一次性任务 且在任务完成后自动删除 Task Disply 为消息队列驱动的任务 根据消息队列传送的 内容进行不同的显示操作 Task Key 是周期性执行的任务 不断检测键盘输入 并根 据检测结果 做出不同的响应 键盘任务是系统运行的第一个任务 负责系统初始化和其它任务的创建 该任务运行 后 接收用户输入并根据接收到的输入值启动不同的采样任务 同时 将接收到的输入值通 过消息队列的形式发送到显示任务 显示任务负责显示用户输入的参数值和采样任务采样得到的数据 串口发送任务在键盘任务检测到发送操作按键确定时创建 该任务负责从全局采样数 组中读取数据并使用中断方式发送到上位机 全局采样数组是系统初始化时建立的 FIFO 缓 存 通过互斥信号量保护 4 个采样任务均在键盘接收到用户输入后创建 不同的采样任务使用不同的采样方式进 行采样 并将采样所得数据保存在全局 FIFO 缓存中 所有采样任务在采样过程中的工作就 是检测什么时候采样结束 并且负责将采样所得的数据进行处理 处理完毕后 发送消息通 知显示任务 最后删除自己本身 8 3 任务实现详解 开始程序设计之前 首先了解一下主函数 在主函数中 进行了操作系统的初始化 创建了一个键盘任务 然后 启动多任务操作系统 主程序代码如下 int main void if OS TASK NAME SIZE 16 INT8U err endif Bsp Init 系统外设初始化 PWM IoConfiguration 初始化系统时钟 OSInit 初始化 OS Tmr TickInit 操作系统 Tick 初始化 OSTaskCreateExt Task Key 任务指针 可编程控制器应用技术与设计实例 14 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 endif OSStart 启动多任务环境 return 0 从程序中可以看到 当执行 OSStart 后 主函数返回 但了解了 ucos II 操作系统后 可以知道这个 return 0 的语句是不可能执行的 在主函数中创建了一个键盘任务 Task Key 其优先级为 15 负责初始化目标板和根据用户输入创建其他任务 8 3 1 键盘任务 键盘任务的主要工作就是周期性扫描键盘 优先级为 15 其程序流程图如图 8 1 所示 第 2 章 可编程控制器的硬件结构 15 开始 目标板初始化 串口A D转换初始化 创建显示任务 TaskDisp 创建互斥信号量 创建消息邮箱 创建消息队列 按键处理 图 8 1 键盘任务程序流程图 程序中 首先进行目标板初始化 目标板初始化过程请参见 STM32F103 处理器内部 资源 C 编程与实例 一章讲解 之所以将目标的初始化放在第一个任务里 是为了保证该 初始化在 OSStart 执行后完成 值得注意的是 与采样任务相关的 A D 转换初始化也放在 了这里 这是因为 4 个采样任务都用到了 A D 转换 放在键盘任务中一次完成 避免了在 每个采样任务中单独初始化而带来的代码冗余 接下来创建显示任务 Task Disp 屏幕初始化工作放在 该任务中完成 最后创建了任务轮转不可或缺的一些操作系统资源 包括一个互斥信号量 Sem 一个 邮箱 MyMbox 和一个消息队列 ReMsgQeue 其中消息队列中消息数目定义为 10 按键处理是这个键盘任务的关键 这个键盘任务中状态转移情况如表 8 1 所示 表 8 1 键盘状态转移表 可编程控制器应用技术与设计实例 16 初始状态操作键动作 确定 键flag 状态翻转 进入周期修改状态或退出修改状态 数字 键如果为数字键并且 flag 1 则设定数字有效并显示 否则不响应 清零 键如果 flag 1 则将保存的设定值清零并显示 否则不响应 状态 1 状态 选定 移动 键如果 flag 0 则进入启动选定状态并显示 否则不响应 如果 clflagp 1 则清零 clflagp 如果采样周期为 20ms 则创建钩子函数采样任务 确定 键 如果采样周期为 20ms 的整倍数 但不为 20ms 则创建延时函数 采样任务 状态 2 启动 采样 移动 键进入显示选定状态 确定 键清除上一次显示的采样数据状态 3 清屏 操作 移动 键创建发送任务 将采样所得数据送上位机 确定 键创建发生任务 将采样所得的数据发送到上位机状态 4 发送 命令状态 移动 键进入周期选定状态 确定 键flag 状态翻转 进入周期修改状态或退出修改状态 数字 键如果为数字键并且 flag 1 则设定数字有效并显示 否则不响应 清零 键如果 flag 1 则将保存的设定值清零并显示 否则不响应 高优先级采 样 键 如果 flag 1 则创建高优先级采样标志 clflg 1 否则不响应 状态 5 采样 周期设定状态 移动 键如果 flag 1 则进入条件选定状态并显示 否则不响应 从表 8 1 中可以清晰看出系统被划分成的 5 种状态 且在 5 种状态下 不同的按键动作 产生的不同后果 状态 1 条件选定状态 处理采样条件设定相关内容 状态 2 启动采样状态 即创建采样任务 使用一个 UINT16 型的数组保存采样周期 和采样条件 并将数组指针通过创建任务函数参数 void 指针传递给采样任务 状态 3 清屏操作 即清除本次采样数据 状态 4 发送命令状态 将本次采样得到的数据通过串口发送到上位机 状态 5 采样周期设定状态 用户可以在该状态下根据自己的采样需要通过不同的按 键设置系统采样周期 这个键盘任务的代码清单如下 void TaskKey void pdata INT8U err INT16U Fdiv INT16U cl 100 INT16U cfg 320 INT16U cond 2 第 2 章 可编程控制器的硬件结构 17 INT8U Key Key0 clflg 0 INT8U locad 0 locas 0 INT8U Keyarr 4 clrs 0 flag 0 pdata pdata TargetInit 硬件初始化 UOFCR 05 U0IER 0 x02 U0LCR 0 x83 Fdiv Fpclk 16 115200 设置波特率 U0DLM Fdiv 256 U0DLL Fdiv 256 U0LCR 0 x03 PINSEL1 0 x00400000 IO2DIR 0 xff 16 设置 LED 为输入 IO2SET 0 xff 16 Key Key0 未按键或与上次不同 Key0 Key 记录本次按键 continue 可编程控制器应用技术与设计实例 18 if Key 11 Key0 0 数字键 0 9 键码值分别为 1 10 else Key0 Key 10 4 个命令键 swich locas case0 switch Key0 case0 if flag cl cl 10 Key 1 周期显示信息更改 break case1 if flag clflg 1 cl 50 采样周期和条件保存 breake case2 if flag locad locas 1 5 break case3 flag flag break case4 if flag cl 0 清零周期设置 breake break case1 swich key0 case0 if flag cl cl 10 Key 1 显示信息更改 break 第 2 章 可编程控制器的硬件结构 19 case2 if flag locad locas 1 5 break case3 flag flag break case4 if flag cfg 0 清零条件设置 breake break case2 if Key0 2 locad locas 1 5 else if Key0 3 cond 0 cl cond 1 cfg if clflg clflg 0 清除高优先级采样标志 创建高优先级采样任务 将采样条件传说给采样任务 OSTaskCreate TaskFiqSamp void cond else if cl 20 采样周期为系统节拍时钟时间 创建节拍钩子函数采样任务 OSTaskCreate TaskhookSamp void cond else if cl 20 0 创建中断采样任务 将采样条件传送给采样任务 OSTaskCreate TaskIntSamp void cond else OSTaskCreate TaskDelaySamp void cond 可编程控制器应用技术与设计实例 20 break case3 清屏条件下 if Key0 2 locad locas 1 5 else if Key0 3 clrs 1 Keyarr 0 0 清屏命令标志 break case3 if Key0 2 locad locas 1 5 else if Key0 3 创建串口发生任务 优先级 13 OSTaskCreate TaskSend void cond break if clrs Keyarr 0 ox0f else clrs 0 if locad locas Keyarr 1 0 xff Keyarr 2 locas locas locad else if Keyarr 1 flag Keyarr 2 cl 256 Keyarr 3 cl 256 else Keyarr 1 1 16 Key 0 break OSTimeDly 1 8 3 2 显示任务 显示任务的主要作用是初始化屏幕 显示按键的操作结果和系统采样结果 其任务优 先级为 17 显示任务流程图如图 8 2 所示 开始 初始化LED 显示按键输入提示 显示操作按键 有消息 分类处理 Y N 图 8 2 显示任务程序流程图 显示任务代码清单如下 void Task Disp void pdata 可编程控制器应用技术与设计实例 22 INT8U err pt k 10 INT16U x 0 y INT8U p 63 a pdata pdata GUI Init 初始化 LCM GUI HLine 0 160 320 WHITE 水平线 for err 1 err 8 err GUI HLine 0 err 20 320 BLUE 绘制表格 for err 1 err 16 err GUI RLine 20 err 0 160 BLUE GUI SetColor BLUE WIHITE For err 0 err 2 err GUI LoadPic 24 err k 165 p 24 21 p 显示周期默认信息 显示条件默认信息 while 1 pt INT8U OSQPend ReMsgQeue 0 等待消息队列 if pt 0 0 OSMutexPend ReMsgQeue 0 等待消息队列 if pt 0 0 OSMutexPend Sem 0 for x 0 x Samp 0 x y 160 Samp x 1 160 3000 if x 0 else GUI Point x y BLACK OSMutexPost Sem else if pt 0 0 x0f 第 2 章 可编程控制器的硬件结构 23 if pt 1 0 xff Dispm pt 2 pt 2 1 5 pt 2 pt 3 else if pt pt 1 新的采样开始 else y 160 pt 1 GUI Point x y RED x else OSMutexPend Sem 0 获取互斥信号量 for x 0 x Samp 0 x y 160 INT8U Samp x 1 160 3000 GUI Point x y RED OSMutexPost sem 程序开始阶段 标号 处定义了一个指向包含 63 个元素的一维数组的指针 并且将这 个指针赋值为 a 该数组包含的内容为汉字库 限于篇幅 关于汉字库的内容请参见相关资 料 任务开始运行后进行显示初始化 如标号 处所示 显示的具体实现在标号 之 间完成 该部分内容可结合 STM32F103 处理器内部资源 C 编程与实例 一章加深理解 标号 出显示了采样周期值和采样条件值 代码 处的无限循环等待显示的驱动消息 可编程控制器应用技术与设计实例 24 消息格式定义如表 8 2 所示 表 8 2 消息队列内容解析 第一字节第二字节第三 四字节命令解析 0 x00 清除上次显示内容 0 xff 原位置坐标光标移到 0 x0 x 周期数据 显示最新周期数据 x 的值决定 显示颜色 0 xff 0 x1x 条件数据 显示最新条件数据 x 值决定显 示颜色 0 xff 新的采样任务开始 0 xf0 采样值 显示采样值 0 xff 高优先级采样显示 8 3 3 使用延时函数的采样任务 使用延时函数的采样任务流程如图 8 3 所示 第 2 章 可编程控制器的硬件结构 25 开始 变量定义和初始化 保存采样周期和采样 条件 发送开始信号 采样结束 释放互斥信号量 Y N 获取互斥信号量 采样 数据处理并保存 发送数据给显示任务 删除任务并结束 图 8 3 延时函数的采样任务流程图 此任务有键盘任务创建 采样任务结束后删除任务本身 保存采样周期和条件就是保 存发送给显示任务的任务参数 在键盘任务中已经提到过 延时任务的程序清单如下 void Task DelaySamp void pdata INT8U err Samparr 4 INT16U c1 cfg i pt INT32U Temp 可编程控制器应用技术与设计实例 26 pt INT16U pdata 获取采样周期 cl pt 0 cfg pt 1 Samp 0 cfg Temp ADDR Samparr 0 0 xf0 Samparr 1 0 xff OSQPost ReMsgQeue void Samparr OSTimeDly 1 OSMutexPend Sem 0 获取互斥信号量 IO2CLR 0 xff 16 指示采样开始 for i 1 i cfg 1 i 设置通道 并开始第一次采样 等待采样结束 再次启动转换 等待采样转换结束 保存采样结果 Samparr 1 INT8U 160 Samp i 3000 OSQPost ReMsgQeue void Samparr SOTimeDlyHMS 0 0 0 cl OSMutexPost Sem IO2SET 0 xff 16 OSTaskDel OS PRIO SELF 此实例中 采样结束后 采样任务通过消息队列将采样结束消息发送给显示任务 值 得一提的是 存放采样信息的全局数组要用互斥信号量来保护 以避免发送和读取任务同时 操作该数组而带来的数据错误 8 3 4 使用时钟节拍钩子函数的采样任务 对于采样周期是 1 个时钟节拍的采样任务 为了保证延时的准确性 不用操作系统提 第 2 章 可编程控制器的硬件结构 27 供延时函数 而用时钟节拍钩子函数来完成 所谓钩子函数 是由操作系统本身提供的空函 数 可以由用户在需要的时候实现 以方便用户编程 本实例中所实现的钩子函数源代码程 序清单如下 void TaskHookSamp void pdata INT8U err Samparr 4 INT16U pt cl cfg i pt INT16U pdata cl pt 0 cfg pt 1 Samparr 0 0 xf0 Samparr 1 0 xff OSMutexPend Sem 0 获取互斥信号量 OSQPost ReMsgQeue void Samparr 向显示任务发送开始采样信息 OSTimeDly 1 Samp 0 cfg 保存采样条件 cfgal cfg IO2CLR 0 xff 16 指示采样开始 for i 0 i cfg i Samp i 1 INT16U OSMboxPend MyMbox 0 获取并保存转换结果 samparr 1 INT16U Samp i 1 160 3000 OSQPost ReMsgQeue void Samparr 向显示任务发送消息 OSMutexPost Sem IO2SET 0 xff 16 指示采样结束 OSTaskDel OS PRIO SELF 删除自己 void OSTimeTickHook void static INT32U Temp 静态变量 if cfgal 0 Temp ADDR 可编程控制器应用技术与设计实例 28 进行第一次采样 等待采样结束 再次启动采样 等待采样结束 OSMboxPost MyMbox void cfgal 完成一次采样 从程序中可以看到 时钟节拍钩子函数在每个系统时钟中断时都会执行 但只有在采 样任务发生信号后才会进行采样操作 该函数负责接收采样得到的数据 并处理和保存 并 通过消息队列发生给显示任务 8 3 5 使用定时中断的采样任务 该实例中采样周期设定的最小值是 1ms 可以利用定时器 T1 的 ISR 完成 在定时采样任务执行过程中将采样的条件与完成次数比较 如果达到了采样条件中预 设的采样次数 就关掉采样中断 中断服务函数的流程如图 8 4 所示 开始 关中断 复位定时中断并通知 中断控制器中断结束 开中断 进行数据采样 发生采样数据 出口 第 2 章 可编程控制器的硬件结构 29
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年青海农牧科技职业学院单招职业适应性考试必刷测试卷带答案
- 2026年大兴安岭职业学院单招职业技能测试必刷测试卷完美版
- 2026年重庆科技大学单招职业倾向性考试必刷测试卷及答案1套
- 2026年苏州经贸职业技术学院单招职业适应性考试必刷测试卷完美版
- 2025广东广州市白云区农业农村局第一次招聘政府雇员1人参考题库及答案详解(各地真题)
- 2026年上海电力大学单招综合素质考试必刷测试卷附答案
- 2025年驻马店市县区事业单位联考西平县招聘10人参考题库附答案详解(综合题)
- 2026年金山职业技术学院单招职业适应性测试必刷测试卷带答案
- 东方航空秋招试题及答案
- 2026年泉州华光职业学院单招职业技能测试题库含答案
- 数通L2(HCS-Pre-Sales-IP)认证考试题库(含答案)
- 动画片对幼儿亲社会行为的影响
- 国家义务教育质量监测四年级心理健康测试卷3+问卷(附答案)
- 《纸质文物修复与保护》课件-03纸质文物病害类型
- 厌氧氨氧化(ANAMMOX)工艺介绍课件
- 园林花卉病虫害防治技术
- 2020初中物理自制教具-初中物理自制教具大全
- C++可视化编程技术研究与应用
- 2024年甘肃省普通高中信息技术会考试题(含24套)
- 全面提升医疗质量等文件专题考试试题及答案
- 办公区临建迁移方案
评论
0/150
提交评论