下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、S.D丄u的uC/OS II入门学习笔记(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文件不用修改。增加一个任务 Task_LED2()。1修改app_cfgh文件增加新增任务Task_LED2的一些设置项定义。0506070B09W1112f *承來张A * A Jc "殳 -jp-州亡蛰
4、总先* A長氓氓咲头*糕査金*去#defin« SIARTUP TASK PRI04设置栈大小单位為os STK )林并* 薛dtfinwTHEE _ 8DTASK LED2-STK 5i¥e这两个设置项将在创建任务的时候使用。2修改app.h文件在app.h文件声明Task_LED2。去靑去先古先窝*素青靑長書青犬畫为背*/j天廉衣求晴靑先萧講長菁黄書之夷畫 耳目 户I 壬 voi<l Tmmk LED (void *:_ar j); void Task LED2(void *p arg);3.修改app.c文件a) .定义Task_LED2的任务堆栈01 Fl#i
5、 nclude "includes. h w"定义栈02片03 |OS_STK task_led2_stklTAK_LED2STK_SIZE704每个任务必须有任务堆栈,任务堆栈的作用将在后面介绍。b) .在app.c中编写Task_LED2任务函数体。17 void Task_LED2 (void *p_arg)1013(192021222324.2526(iroidi p_argswhile (1)< LED2 ( ON Ji ;OSTimeDlyHMSM (0f Dr LED2 ( OFFJi ;OSTimeDlyHMSM (Df 0z20D);0f 20D);
6、并没有用到,防止编译能提示瞥告c) .在 Task_LED 任务中创建 Task_LED2。防止垠译器撻示警告131920214. 修改led.h文件LED1在led.h中对LED2()进行宏定义。我的板子LED2在PD2上,接法和上一篇的相似。所以宏定义如下:#def j-ne LED2 (a) if (a)GPIO_SetBits (GPIOD, GPIO_Pin_2 ) elsegfio Reset-Bits (gpiod, gpio Pin 2)5. 修改led.c文件。增加PD 口的初始化代码。25 void LED_GPIO_Config |void)GPIO_InitTypeDe
7、f GPI 0_I nit St ruct u ;/穿文个 GPTO, InitTypeDefR 亡亡 APBSPe riphClocik 亡 tad?El 亡 U APB 2 Peri ph tPIOA f ENABLE) ; /V 使 R巨 GPHOA 的刖* 屮 门二给结构体各个成员賦tfGPIO_Init ST ructu re, GPIQ_Pin = GPIO_Pin_0;/ / PA EjI frg Pin_BG nQJL n it St ruct u r i G PH 匸日 p® 初 =GPlO_Sp* « d_5 QMHz;/ / 最斋 输出 速率 50MH
8、zG PI0_I nit St CXiCt, utBr GPI O_Mo de = GPTO_M*?dq_Out_OD ;/ / 开 i刷谕出/ / -二-初始化心工0A&PIO_Init (GPIOAr 4GPIO_Init.St ruct ure );rcc_apb2periphclockCmd (rc:C_aps2 P&riph_GPIOD * enable) ?/f更月伫cjphdd的时*中H二给縮旃体备伞成员GPI0_Init:.St meture . GID_Pin = GPIO_Pin_2;/选中 ED 口的 Piri-NGPlO_In.it 9t. ructur
9、e <&PlO_Speed = &PIO_Speed_5OHHz ?/jS:离輸出 ® SOMHzGPlo2Init s?t ructure GPlQ2Hode = GPlo_Mode_Out _OD;/ / 开;i扁谕出“ 一二-初皓化 GEHO»_GPio mit (GPIOD, 4GPIo rnitstructur*)-通过上面的修改,我们在 卩C/OS II中增加了一个任务。编译,下载到板子上运行,两个LED不停的闪烁,一个每秒闪烁 1次,另一个每秒闪烁2.5次。本篇实验中虽然有两个任务,但是它们是独立的,它们之间没有公共资源,没有进行任 何通
10、信。下面按照修改文件的顺序进行介绍相关细节。步骤1中,定义了任务的 优先级别。优先级别是卩C/OS II进行任务调度的依据,卩C/OS II总是运行当前就行任务中优先级别最高的任务。优先级数值越小,优先级别越高。步骤1中还定义了任务堆栈的大小。卩C/OS II中任务的堆栈大小具体多大为宜,目前我未查到相关资料,暂且不讨论。步骤3中定义了任务堆栈。 卩C/OS II进行任务调度时,会从一个任务跳转到另一个任 务,任务堆栈就是用于存储跳转断点的。步骤3中,在任务1中创建任务2,这在卩C/OS II中非常常见。在启动卩C/OS II之前, 往往只创建一个任务,即启动任务,其他任务在启动任务中创建。有
11、些任务会在其他任务中 创建。观察两个任务的函数体可知,他们的共同点是,都有一个while(1)死循环。既然都是死循环,那么单片机是如何在这两个任务中跳转的呢?这就是卩C/OS II操作系统的工作了。OSTimeDlyHMSM()是卩C/OS II提供的延时函数, 但是该函数和我们 “裸奔”程序中的 延时函数有实质上的区别。在“裸奔”程序中,延时函数一般是通过消耗CPU的时间来实现的。而OSTimeDlyHMSM()在任务中调用的时候,事实上只执行一次,将定时时间设定好 之后,延时的任务就交个 卩C/OS II系统了。该函数延时的最小单位是一个系统“心跳”时 钟周期。OSTaskCreate()
12、函数的原型如下:INT8U OSTskCreate (raid ( * task)(void * pd) T“措向任齐的指师void * pdata,/传递给任务的書数OS.STK任务堆栈栈®的捞针INT8U prio"描迄任务优先级别的参数第一个参数是一个指向任务的指针,即是一个函数指针。第二个参数是传递给任务的参数,是一个指针,如果要创建的任务有输入参数,可以通 过该指针传递。OS_STK类型的数组,所以 卩C/OS II中每个任务的优先级"创建任务2TASK_LED2_PRIO);第三个参数在指向任务堆栈栈顶的指针。任务堆栈是一个 该参数是指向OS_STK数据的指针。第四个参数用于指定要创建任务的优先级别。要注意, 别是唯一的,不能创建相同优先级的任务。OSTaskCreate (Task LED2, (void *) D,&task_led2_stkTASK_LED2_STK_SIZE-1f对照我们创建的任务 Task_LED2的代码:第一个参数是任务任务的名称,即函数名。由于我们的任务没有参数,所以第二个参数为一个空指针。第三个参数传递的是一个地址,该地址是Task_LED2任务堆栈的最后一个元素的地址。(为什么是传递最后一个的地址, 而不是第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育经历及在校奖惩制度
- 文明施工管理奖惩制度
- 关于消防维修奖惩制度
- 班级如何设计奖惩制度
- 员工培训期间奖惩制度
- 采购流程以及奖惩制度
- 幼儿园考试奖惩制度细则
- 如何制定团队奖惩制度
- 亚马逊员工考核奖惩制度
- 公司潜在推动奖惩制度
- 2026云南楚雄市司法局第一批司法协理员招聘10人考试参考试题及答案解析
- 2025年02月陕西省国际信托股份有限公司2025年招考笔试历年常考点试题专练附带答案详解试卷2套
- 2026年阜新高等专科学校单招职业技能测试题库必考题
- GB/T 5973-2026起重机械钢丝绳绳端固接接头
- 中央预算资金34个细分领域资金分布比例及项目申报实操
- 2026马年春节开学第一课课件:用英语讲述我的中国年
- 2026年南京机电职业技术学院单招职业适应性测试题库附答案解析
- 蒲公英介绍教学课件
- 2026青海海东公安招录32名人民警察备考题库及答案详解(夺冠系列)
- 2026北森测评试题及答案
- 2026西藏自治区教育考试院招聘非编工作人员11人备考考试题库及答案解析
评论
0/150
提交评论