1.12k likes | 1.27k Views
μC/OS-II 程序设计实例. —— 基于 SmartARM2200 平台. 1. 3. 4. 5. 目 录. 工程模板介绍. 数据采集系统. 2. 万年历. uC/OS-II. UART 中间件. I 2 C 中间件. 2. 示例实现. 目录. 工程模板应用 | μC/OS-II 程序设计. 1. 工程模板简介. ARM 文件组. 内核文件组. 1. 5. 模板结构. 头文件组. 主函数. 2. 4. 用户文件组. 3. 头文件组 : 主要是包含头文件和配置信息.
E N D
μC/OS-II程序设计实例 ——基于SmartARM2200平台
1 3 4 5 目 录 工程模板介绍 数据采集系统 2 万年历 uC/OS-II UART中间件 I2C中间件
2 示例实现 目录 工程模板应用| μC/OS-II程序设计 1 工程模板简介
ARM文件组 内核文件组 1 5 模板结构 头文件组 主函数 2 4 用户文件组 3 头文件组:主要是包含头文件和配置信息 ARM文件组: 主要是包含操作系统和开发板硬件相关的配置信息 内核文件组:主要是包含UC/OS操作系统源文件 用户文件组:主要包含用户需要配置的.H文件和除主函数外的.C文件 主函数:即用户编写的MAIN.C函数 摸板结构 工程模板应用| μC/OS-II程序设计
头文件组 工程模板应用| μC/OS-II程序设计 头文件主要包含一些宏定义和文件包含操作.这些文件一般是为了提高摸板的通用性和方便系统移植而定义的.用户在使用时可以根据自己的系统硬件配置和喜好进行修改.在UC/OS工程摸板中主要包含六个头文件,具体描述如下表所示:
ARM文件组 工程模板应用| μC/OS-II程序设计 ARM文件组主要包含UC/OS配置文件和SmartARM2200加载和配置文件.主要包含六个文件,具体描述如下表所示:
用户文件组 工程模板应用| μC/OS-II程序设计 用户文件组主要包含main.h,main.c和os_cfg.h三个文件.前两个文件有用户自己编写. os_cfg.h文件主要是实现操作系统的配置,用户可以根据实际需要进行裁剪.具体描述如下表所示:
拷贝工程摸板 摸板使用步骤 工程模板应用| μC/OS-II程序设计 使用摸板建立新工程分为四个步骤.主要操作如下: 用户将光盘中的“ARM EXECUTABLE IMAGE FOR UCOS LPC2200“文件拷贝到”..\ARM\ADSV1.2\STATIONERY
摸板使用步骤 工程模板应用| μC/OS-II程序设计 将光盘摸板文件放进Stationary目录:
拷贝工程摸板 打开ADS,选择”新建”操作 摸板使用步骤 工程模板应用| μC/OS-II程序设计 使用摸板建立新工程分为四个步骤.主要操作如下: 用户将光盘中的“ARM EXECUTABLE IMAGE FOR UCOS LPC2200 “文件拷贝到”..\ARM\ADSV1.2\STATIONERY 在ADS1.2的集成开发环境中选择”新建”操作
摸板使用步骤 工程模板应用| μC/OS-II程序设计 在ADS集成环境中选择”新建”操作:
拷贝工程摸板 打开ADS,选择”新建”操作 选择工程摸板建立新工程 摸板使用步骤 工程模板应用| μC/OS-II程序设计 使用摸板建立新工程分为四个步骤.主要操作如下: 用户将光盘中的“ARM EXECUTABLE IMAGE FOR UCOS LPC2200 “文件拷贝到”..\ARM\ADSV1.2\STATIONERY 在ADS1.2的集成开发环境中选择”新建”操作 选择工程摸板建立新工程
摸板使用步骤 工程模板应用| μC/OS-II程序设计 选择工程摸板建立新工程:
拷贝工程摸板 打开ADS,选择”新建”操作 选择工程摸板建立新工程 按照摸板生成新工程 摸板使用步骤 工程模板应用| μC/OS-II程序设计 使用摸板建立新工程分为四个步骤.主要操作如下: 用户将光盘中的“ARM EXECUTABLE IMAGE FOR UCOS LPC2200 “文件拷贝到”..\ARM\ADSV1.2\STATIONERY 在ADS1.2的集成开发环境中选择”新建”操作 选择工程摸板建立新工程 按照摸板生成一个新工程
摸板使用步骤 工程模板应用| μC/OS-II程序设计 按照摸板生成新工程:
1 工程模板简介 2 示例实现 目录 工程模板应用| μC/OS-II程序设计
硬件连接 工程模板应用| μC/OS-II程序设计 摸板应用示例是蜂鸣器控制,在SMARTARM2200工控平台上进行测试,硬件连接如下图所示: 跳线连接 蜂鸣器控制电路
任务创建 工程模板应用| μC/OS-II程序设计 在应用示例中,先按上面的流程建立工程TEST1.MCP.再在工程的主函数MAIN中建立任务TASK0,TASK0任务是初始化硬件.接着创立TASK1,TASK2,TASK3.TASK1,TASK2只是将任务挂起延时.TASK3任务实现蜂鸣器控制.任务之间联系如下图所示:
TASK1 TASK3 TASK2 TASK0 任务创建 工程模板应用| μC/OS-II程序设计 MAIN 函数
任务流程 工程模板应用| μC/OS-II程序设计 示例中主函数和个任务的控制流程如下:
ISR任务示例 工程模板应用| μC/OS-II程序设计 中断示例中先按上面流程创建新工程Timer1_int.mcp,再在主函数中创建任务TASK0和TASKBEEP,TASK0完成硬件初始化.TASKBEEP完成蜂鸣器信号量等待和操作.程序流程如下:
ISR任务示例 工程模板应用| μC/OS-II程序设计 下面以示例来说明如何现实ISR与任务间同步。假设定时器1中断服务程序发送信号量,任务完成了信号量的创建并在接收到信号量后让蜂鸣器响一声。处理流程如下。
更新中断优先级 清除中断标志 发送信号量 ISR任务示例 工程模板应用| μC/OS-II程序设计 中断服务程序ISR示例代码如下。 void Timer1_Exception (void) { T1IR = 0x01; VICVectAddr = 0; OSSemPost (sem); }
创建信号量 初始化工作 蜂鸣器响 延时60个节拍 蜂鸣器灭 延时60个节拍 进入临界段 退出临界段 等待信号量 ISR任务示例 工程模板应用| μC/OS-II程序设计 蜂鸣器报警任务示例代码如下。 void TaskBeep (void *pdata) { …… sem = OSSemCreate(0); OS_ENTER_CRITICAL(); /* 初始化VIC(省略) */ /* 初始化定时器1(省略) */ /* 目标板初始化TargeInit() (省略) */ OS_EXIT_CRITICAL(); while (1) { OSSemPend(sem, 0, &err); IO0CLR = BEEP; OSTimeDly(60); IO0SET = BEEP; OSTimeDly(60); } } 读者补出相应的代码
1 4 5 目 录 工程模板介绍 数据采集系统 2 万年历 3 uC/OS-II UART中间件 I2C中间件
2 ISR和任务之间的同步和通信 目录 数据采集系统| μC/OS-II程序设计 1 任务间的同步与通信
① ② ③ 任务的同步 任务的同步和通信| 数据采集系统 一、任务的同步 1、什么是任务的同步? 在实时操作系统中,任务和任务之间往往需要协调运行,这种协调关系,在日常生活里也是屡见不鲜的。为了说明这种协调关系,请看下面的演示: 司机 售票员 启动车辆 关 车 门 由该演示可知,任务的同步,就是任务的协调运行,你一步、我一步地紧密协作: 行 驶 售 票 停 车 开 车 门 ① 、启动车辆,踩油门就可以了;但实际上,你必须等车门关上了才可以启动车辆。 ② 、行驶和售票的行动互不干涉、彼此独立,此时不存在协调关系。 ③ 、开车门只要按下开关就可以了;但实际上,你得等司机停车才能开车门,否则就出事故了。
在理解了“任务同步”的概念后,再来看看μC/OS-II实时操作系统所提供的用于实现“任务同步”的通信手段。在理解了“任务同步”的概念后,再来看看μC/OS-II实时操作系统所提供的用于实现“任务同步”的通信手段。 任务的同步 任务的同步和通信| 数据采集系统 一、任务的同步 1、什么是任务的同步? 在实时操作系统中,任务和任务之间往往需要协调运行,这种协调关系,在日常生活里也是屡见不鲜的。为了说明这种协调关系,请看下面的演示: 任务A 任务B ① 、任务B运行一段时间后,发送信息让任务A启动,与此同时,任务B挂起。 ② 、任务A获得允许运行的信息后,立即启动;完成操作后,发送信息告知任务B,任务B可以启动并执行接下来的操作。
任务的同步 任务的同步和通信| 数据采集系统 2、任务同步的通信手段 μC/OS-II实时操作系统提供了以下通信手段,使某一任务得以向另一任务发送同步信息,从而实现任务同步: • 计数信号量; • 事件标志组; • 消息邮箱; • 消息队列。 灵活运用这些通信手段,可满足不同的任务同步需求,请看表1:
任务的同步 任务的同步和通信| 数据采集系统 2、任务同步的通信手段 表1 不同同步手段的应用场合 由上表可知,任务和任务之间不仅可以发送用于协调步伐的“同步”信息,也可以发送有效的数据,实现真正意义的通信。
任务的通信 任务的同步和通信| 数据采集系统 二、任务的通信 在嵌入式系统的运行过程中,任务与任务之间必然伴随着数据通信,这种通信可以采用多种方法来实现: • 全局变量; • 内存数据块; • 消息邮箱; • 消息队列。 灵活运用这些不同的方法,可满足不同的数据通信要求,请看表2:
任务的通信 任务的同步和通信| 数据采集系统 二、任务的通信 表2 不同通信手段的应用场合 介绍完行为同步和通信的基本知识后,接下来再给出实例,以加深理解。
操作示例 任务的同步和通信| 数据采集系统 三、操作示例 1、示例简介 利用LPC2000系列ARM相关开发板上已有的资源,可以构筑一个小型的数据采集系统,如下所示: 串口线 上位机 LPC2000系列ARM相关开发板 示例的内容是:按下开发板上的按键、令ARM芯片启动A/D采样;采样结束后,再将采样结果通过串口线发送到上位机显示。
操作示例 任务的同步和通信| 数据采集系统 2、示例里的任务 在本示例内,划分出了3个用户任务,相关信息如表3所示。 表3 任务信息 接下来,将以动画的形式演示该数据采集系统的运转流程,并在每一个运行阶段加以讲解。
操作示例 任务的同步和通信| 数据采集系统 2、示例演示 (1) 初始阶段 按键任务 • 三个任务的状态: • 按键任务在不停扫描按键,查询是否有键按下; • 采样任务完成一部分工作后挂起,等待按键任务发出启动信号; • 显示任务挂起,等待采样任务发出启动信号和显示数据。 不断扫描 采样任务 挂起 显示任务 挂起
操作示例 任务的同步和通信| 数据采集系统 2、示例演示 (2) 启动采样 按键任务 按键任务扫描到有按键按下,发出信号量。 扫描到按键 采样任务得到了信号量从而就绪,然后在接下来的任务调度中进入运行状态,开始采样。 采样任务 挂起 开始采样 显示任务 显示任务仍在等待采样任务发送启动信号和采样结果。 挂起
操作示例 任务的同步和通信| 数据采集系统 2、示例演示 (3) 发送采样结果 按键任务 按键任务继续扫描按键。(此时若扫描到按键,将在下一轮处理)。 不断扫描 采样任务 采样完毕,可以发送采样结果了,于是发送消息到消息邮箱。 开始采样 采样结束 启动显示 显示任务获得了消息进入就绪状态,然后在任务调度下获得运行机会,将收到的采样结果发送到上位机。 显示任务 将采样结果 发送至上位机
操作示例 任务的同步和通信| 数据采集系统 2、示例演示 (1) 初始阶段 按键任务 回到了初始阶段。进行下一轮的数据采集、发送工作。 不断扫描 采样任务 挂起 显示任务 挂起
1 任务间的同步与通信 2 ISR和任务之间的同步和通信 目录 任务的同步和通信| 数据采集系统
关联任务 同步信号发送 ISR 同步信号发送 任务 任务 同步信号发送 ISR和任务的同步 任务的同步和通信| 数据采集系统 一、ISR和任务的同步 ISR主要被用于响应异步事件,在ISR里可触发其它任务的运行,实现ISR和任务的同步。 ISR和任务间的同步关系比较简单,它们之间的关系是单向的。任务间的同步就不同了,可是单向亦可是双向的。 • 、可以看出,ISR始终是控制者,关联任务只能被控制; • 、可以看出,任务之间的同步里,某一任务可以是被控制者也可以是控制者。
ISR和任务的通信 任务的同步和通信| 数据采集系统 二、ISR和任务的通信 ISR和任务间的通信手段包括信号型和数据型,两种手段的应用场合是不同的,请看表4。 表4 信号型通信和数据型通信的对比 为了进一步说明,接下来请看下面的实例演示。
串口线 上位机 ISR和任务的通信 任务的同步和通信| 数据采集系统 三、实例演示 1、示例简介 利用LPC2000系列ARM相关开发板上已有的资源,可以构筑一个小型的数据采集系统,如下所示: LPC2000系列ARM相关开发板 示例的内容是:示例进行时,蜂鸣器一直在间歇鸣叫;用户按下板上的按键、触发外部中断;外部中断再触发“读取ADC然后将采样结果发送至上位机”的操作。
操作示例 任务的同步和通信| 数据采集系统 2、示例里的任务 在本示例内,划分出了2个用户任务,相关信息如表5所示。 表5 任务信息 接下来,将以动画的形式演示该实例的运转流程,并在每一个运行阶段加以讲解。
蜂鸣器任务 • 、系统初始化 ① 系统初始化时,先运行“采样和显示”任务。 ③ • 、蜂鸣器任务启动 • 、等待信号量有效 由于此时信号量无效,采样和发送任务挂起,CPU控制权交给其它就绪任务。 此时优先级最高的就绪任务是蜂鸣器任务,于是蜂鸣器任务启动。 操作示例 任务的同步和通信| 数据采集系统 3、示例演示 这是外部中断未发生时,用户任务执行的情况: 采样和显示任务 • 初始化硬件 • 等待信号量 蜂鸣器间歇鸣叫
发生外部中断 蜂鸣器任务 • 、发生外部中断 外部中断发生。蜂鸣器任务被中断。 • 、ISR发送信号量 • 、回复到初始状态 发送完采样结果后,继续等待下一个外部中断,蜂鸣器任务又开始运行。 “采样和显示任务”获得了信号量,立即进入就绪状态,由于该任务优先级最高,于是立即运行。 操作示例 任务的同步和通信| 数据采集系统 3、示例演示 这是外部中断发生时,用户任务执行的情况: 采样和显示任务 • 初始化硬件 ③ • 等待信号量 蜂鸣器间歇鸣叫 • 发送采样结果
发生外部中断 蜂鸣器任务 • 、发生外部中断 外部中断发生。蜂鸣器任务被中断。 • 、ISR发送信号量 • 、回复到初始状态 发送完采样结果后,继续等待下一个外部中断,蜂鸣器任务又开始运行。 “采样和显示任务”获得了信号量,立即进入就绪状态,由于该任务优先级最高,于是立即运行。 操作示例 任务的同步和通信| 数据采集系统 3、示例演示 这是外部中断发生时,用户任务执行的情况: 采样和显示任务 • 初始化硬件 ③ • 等待信号量 蜂鸣器间歇鸣叫 • 发送采样结果
1 3 4 5 目 录 工程模板介绍 数据采集系统 2 万年历 uC/OS-II UART中间件 I2C中间件
2 示例的实现 目录 万年历| μC/OS-II程序设计 1 示例简介
示例简介 万年历| μC/OS-II程序设计 一、示例简介 在这里,通过一个万年历的设计,来说明μC/OS-II下程序设计的方法: 利用LPC2000系列ARM相关的开发板和EasyARM串口调试软件(自带一个万年历界面)来实现一个具有以下功能的万年历: 接下来,是一个动画演示。它直接表现了最终的万年历效果,这有助于让读者迅速理解示例须达成的任务。 • 实时显示:不断显示当前的年月日星期、时间信息; • 时间设置:可设置万年历的时钟和年月日信息(星期信息自动调整),完成设置后,可更新显示。 • 、开始重设年份; • 、2007年被重设为3007年,此时星期自动完成了调整; EasyARM串口调试软件自带的万年历界面 • 、设置完后,恢复显示。
1 示例简介 2 示例的实现 目录 万年历| μC/OS-II程序设计