SDLu的uCOS II 入门学习笔记(2)多任务

SDLu的uCOS II 入门学习笔记(2)多任务

ID:42370360

大小:258.00 KB

页数:4页

时间:2019-09-13

SDLu的uCOS II 入门学习笔记(2)多任务_第1页
SDLu的uCOS II 入门学习笔记(2)多任务_第2页
SDLu的uCOS II 入门学习笔记(2)多任务_第3页
SDLu的uCOS II 入门学习笔记(2)多任务_第4页
资源描述:

《SDLu的uCOS II 入门学习笔记(2)多任务》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、S.D.Lu的uC/OSII入门学习笔记(2):多任务初学者的疑惑对于一个单片机学习者,如果从未接触过嵌入式操作系统,就会觉得它是非常复杂而神秘的。从我个人的经历说起,之前写的所有程序都是在单片机上“裸奔”的。开始学习OS之前,对OS存在几个疑惑:1.一个CPU如何同时执行多个任务?答:CPU不能同时执行多个任务,甚至不能同时执行两个任务。每一个时刻,CPU只能执行一个任务。2.CPU如何运行多个任务呢?答:CPU是通过分时复用的方法运行多个任务的。也就是把时间切分成一个一个的时间片段,一个时间片段运行一个任务,然后下一个时

2、间片段运行另一个任务。应注意的是,一个时间片段并不一定能完整的运行一个任务,一个任务可能需要若干个时间片段才能从头到尾将代码运行一遍。3.这些任务是相互独立的吗?如果不是独立的,它们之间又有什么联系?答:这些任务可以是相互独立的,也可以是相互联系的。举两个简单的例子。(1):假设有两个任务,一个是用P1.0口控制LED闪烁,3次/秒;另一个是用P1.1口控制LED闪烁,2次/秒。那么这两个任务就是相互独立的。(2):假设有两个任务,一个是测量外部输入的方波信号的频率;另一个是控制一个LCD显示模块,显示该方波信号的频率值。那

3、么这两个任务就是有联系的,它们有公共的资源,即(数据)频率值。当然,这里的例子并不准确,因为这些任务太简单了,完全可以用一个任务来完成,根本不需要OS。这里只是用于说明,两个任务之间存在联系的情况。如果出现多个任务访问同一资源时,比如两个任务都可以对一个变量进行赋值,就会发生冲突。如何解决这些冲突呢?这就是需要OS来进行管理。这只是OS的工作之一,其最重要的工作是进行任务之间的切换。本篇实验将在上一篇的基础上进行,将运行两个任务,每个任务控制一个LED的亮灭。例2-1先修改程序,编译运行。main文件不用修改。增加一个任务T

4、ask_LED2()。1.修改app_cfg.h文件增加新增任务Task_LED2的一些设置项定义。这两个设置项将在创建任务的时候使用。4/42.修改app.h文件在app.h文件声明Task_LED2。3.修改app.c文件a).定义Task_LED2的任务堆栈每个任务必须有任务堆栈,任务堆栈的作用将在后面介绍。b).在app.c中编写Task_LED2任务函数体。c).在Task_LED任务中创建Task_LED2。4.修改led.h文件在led.h中对LED2()进行宏定义。我的板子LED2在PD2上,接法和上一篇的L

5、ED1相似。所以宏定义如下:5.修改led.c文件。增加PD口的初始化代码。4/4通过上面的修改,我们在μC/OSII中增加了一个任务。编译,下载到板子上运行,两个LED不停的闪烁,一个每秒闪烁1次,另一个每秒闪烁2.5次。本篇实验中虽然有两个任务,但是它们是独立的,它们之间没有公共资源,没有进行任何通信。下面按照修改文件的顺序进行介绍相关细节。步骤1中,定义了任务的优先级别。优先级别是μC/OSII进行任务调度的依据,μC/OSII总是运行当前就行任务中优先级别最高的任务。优先级数值越小,优先级别越高。步骤1中还定义了任务

6、堆栈的大小。μC/OSII中任务的堆栈大小具体多大为宜,目前我未查到相关资料,暂且不讨论。步骤3中定义了任务堆栈。μC/OSII进行任务调度时,会从一个任务跳转到另一个任务,任务堆栈就是用于存储跳转断点的。步骤3中,在任务1中创建任务2,这在μC/OSII中非常常见。在启动μC/OSII之前,往往只创建一个任务,即启动任务,其他任务在启动任务中创建。有些任务会在其他任务中创建。观察两个任务的函数体可知,他们的共同点是,都有一个while(1)死循环。既然都是死循环,那么单片机是如何在这两个任务中跳转的呢?这就是μC/OSII

7、操作系统的工作了。OSTimeDlyHMSM()是μC/OSII提供的延时函数,但是该函数和我们“裸奔”程序中的延时函数有实质上的区别。在“裸奔”程序中,延时函数一般是通过消耗CPU的时间来实现的。而OSTimeDlyHMSM()在任务中调用的时候,事实上只执行一次,将定时时间设定好之后,延时的任务就交个μC/OSII系统了。该函数延时的最小单位是一个系统“心跳”时钟周期。OSTaskCreate()函数的原型如下:第一个参数是一个指向任务的指针,即是一个函数指针。第二个参数是传递给任务的参数,是一个指针,如果要创建的任务有

8、输入参数,可以通过该指针传递。第三个参数在指向任务堆栈栈顶的指针。任务堆栈是一个OS_STK类型的数组,所以该参数是指向OS_STK数据的指针。第四个参数用于指定要创建任务的优先级别。要注意,μC/OSII中每个任务的优先级别是唯一的,不能创建相同优先级的任务。对照我们创建的任务Task_

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。