查看: 3093|回复: 3

NXP LPC1768宝马开发板 第三十六章 宝马1768——uC/OS-II

[复制链接]

该用户从未签到

发表于 2015-3-30 15:57:15 | 显示全部楼层 |阅读模式
分享到:
宝马LPC1768——uC/OS-II
本部分主要讲解宝马LPC1768关于uC/OS-II的有关例程,包括移植,任务调度,信号量的使用,消息队列的使用,以及邮箱的使用。帮助大家对于uC/OS的理解以及快速的使用。
一、uC/OS-II移植
首先我们要从uC/OS的官网下载基于LPC1768的例程,方便移植。网址:http://micrium.com/downloadcenter/download-results/?searchterm=hm-nxp&supported=true。在官网下载的例程解压之后,可以得到五个文件夹,如下图所示。
图片7.png
uCOS-II文件夹下source文件夹中所有的文件,以即Port文件夹中os_cpu.hos_cpu_a.asmos_cpu_c.cos_dbg.c四个文件,
EvalBoards文件夹中的app_hooks.cos_cfg.happ_cfg.h,三个文件。
注意:
(1)部分文件要注意对应编译器,选择不同的编译器,要选择对应的文件,如os_cpu_a.asm文件。
(2)app_cfg.h文件中,定义的是用到一些任务的优先级,以及任务的堆栈大小的设置,要注意一个重要的宏定义#define  OS_TASK_TMR_PRIO     (OS_LOWEST_PRIO - 2)
把对应的文件添加到工程目录之后,注意修改以下几个地方,首先是启动文件。
在启动文件startup_LPC17xx.s中,第6970行,是软件中断以及系统定时器的中断服务函数名字。
图片6.png
修改成如下所示:
图片5.png
然后对应的下面也需要修改。
图片4.png
图片3.png
最后注意在进行任务调度之前对系统定时器进行初始化,使其能够进行任务切换。
图片2.png
最后在主函数中写入对应的系统初始化,以及建立任务,启动任务就可以了。
图片1.png

回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-3-31 13:45:52 | 显示全部楼层
二、任务调度实验
本节主要说明任务调度实验,实现ucosii的任务之间的调度,怎么来实现任务之间的切换。
1、实验说明
该实验主要用来说明操作系统之间的任务调度,如何创建任务,任务之间的抢占,高优先级抢占低优先级任务,以及任务的删除。
2、程序说明
首先我们要看主函数如下所示,主函数中,首先是对外设一些初始化,比如例程当中用到的LEDIO口以及串口的初始化。然后调用系统初始化函数,完成系统的初始化,最后启动多任务的调度。
图片5.png
然后看启动的任务,
图片4.png
在该任务中,首先是调用了BSP_Start()函数。该函数的作用就是对系统定时器的初始化,并启动。下面分别启动了两个任务,并给每个任务赋予了一个名字。
下面是两个任务的代码,这两个任务都是一个死循环,其中第一个任务是通过延时,实现LED灯的闪烁。第二个任务是,进入任务后,循环延时,延时结束之后,自己删除任务2
图片3.png
图片2.png
3、实验结果
因为任务2的优先级比较高,所以首先运行的是任务2,所以任务2输出打印,然后进行延时,此时进入任务1,开始运行,然后对LED进行控制,随后也会进行延时,然后是这两个任务轮流进行运行。当任务2循环延时结束的时候,它会删除任务2,则下面就只剩下任务1在运行。
其中在下面的运行结果图中,注意到有一个AppTask1 is running打印过程当中,被打断了,这是因为在任务1运行过程当中,高优先级的任务2,延时结束,进入就绪状态,所以任务2抢占了任务1,所以就打印输出了AppTask2 is running,打印输出结束之后,再次延时挂起,这是任务1继续运行,打印输出余下的数据。直到任务2被删除,则只剩下任务1运行。
图片1.png

回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-4-1 14:00:27 | 显示全部楼层
三、信号量实验
本节主要介绍操作系统任务之间的通信方式——信号量,实现不同任务之间的数据交换。
1、实验说明
信号量是操作系统当中实现任务之间通信作用,在该实验中,首先创建一个信号量,然后在一个任务当中不停的释放信号量,另外一个任务请求信号量。
2、程序说明
首先看主函数,前面是外设以及操作系统的初始化,接下来创建一个任务函数,最后启动多任务调度。
图片5.png
在创建的任务当中,创建了信号量,同时创建了两个任务。
图片4.png
任务1首先无限等待请求信号量,第二个参数是等待的节拍数,当为0的时候,是无限等待。直到获取信号量之后,程序才会继续往下执行。然后是再次请求信号量,这个函数是直接返回的,如果没有信号量,则直接返回,而不会把任务挂起等待。
图片3.png
任务2是释放信号量,释放了两次信号量,然后进行延时,挂起任务。
图片2.png
3、实验结果
从实验结结果,可以看到首先创建信号量成功,因为赋的初值是1,所以创建信号量之后,就已经存在一个信号量,所以在任务二中,有连续释放两个信号量,这时候任务2延时被挂起,任务一开始执行,获得三次信号量成功。随后再次获得信号量的时候,因为已经没有信号量了,所以任务1被挂起等待信号量,这时候,任务2延时结束,任务2开始运行,再次释放两个信号量,然后延时挂起,任务1开始运行,前两次获得信号量成功,最后一次获得信号量失败,因为任务2只是释放了两个信号量。这里可以看到OSSemAccept()函数在请求不到信号量的时候,是不会挂起任务等待信号量的,而是直接返回的。只有OSSemPend()函数才会在请求不到信号量的时候,把任务挂起,一直到获得信号量,或者超时返回。
图片1.png

回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2015-4-2 11:07:12 | 显示全部楼层
四、消息队列
本节主要讲述操作系统的另外一个通信方式——消息队列。
1、实验说明
该实验主要讲解消息队列的应用,信号量以及消息队列都是用作任务之间通信,信号量是为了同步两个任务之间的信息。而消息队列可以传递给另外一个任务一个指向字符串的指针,可以在两个任务之前传递信息。
2、程序说明
主函数中对外设和操作系统进行初始化,创建一个任务,启动多任务调度。
图片1.png
启动任务中,设置systick,并创建消息队列,然后清空消息队列。创建两个任务
图片2.png
任务1当中,首先是获取消息,等待100个时钟节拍。并打印是否获取成功,然后是LED灯闪烁。
图片3.png
任务2当中,是发送消息到队列当中,并打印输出是加入到队列当中,当队列满的时候,就不能把消息加入到队列当中了,然后延时挂起任务,等待任务1读取消息。
图片4.png
3、实验结果
在程序中我们可以看到,任务1的运行时间大概是任务2的运行时间的两倍,所以当任务2放入消息队列里面两条信息的时候,任务1才读取一条信息。所以在下面的时候,会出现队列已满的情况。
图片5.png

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-3-29 04:06 , Processed in 0.134648 second(s), 22 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.