- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
uCOS-III学习笔记
UCOS-III学习笔记
一.知识要点
用户代码不允许调用任务函数,任务一旦创建只能由UCOS-III调用
每个任务都必须创建创建自己的堆栈,可以静态分配或由malloc()动态分配,但类型只能为CPU_STK
任务优先级数越小越高,设置范围1~OS_CFG_PRIO_MAX-2,OS_CFG_PRIO_MAX在OS_CFG.h中定义,系统默认的最大优先级为10,统计任务的优先级在os_CFG_app.h中定义。
系统默认的一些优先级:
统计任务:11
OS_CFG_TICK_TASK_PRIO :10
分配堆栈大小时:1K=256
OSTaskCreate()里面有些指针没有意义。
推荐在调用OSStart()函数之前只创建一个任务,因为此时UCOS-III可以统计CPU的使用率
每个任务都是一个无限循环,通过调用延时函数OSTimeDly()或OSTimeDlyHMSM()等待一个事件而被挂起。
任务不像C函数,没有return的。
只运行一次的任务结束时必须调用OSTaskDel()删除自己。
任务在等待事件时不会占用CPU
一旦堆栈被动态分配就不能再回收,对于不需要删除的任务,建议动态分配堆栈
uC/OS-III 允许用户在调用 OSStart() 之前创建任意个任务,但当用到统计任务统计 CPU 的使用率时,调用 OSStart() 之前只允许创建1个任务,给这个任务一个相当高的优先级。统计任务本身也有优先级OS_CFG_STAT_TASK_PRIO,在os_CFG_app.h中定义。,此优先级排倒数第二,第一是空闲任务。
任务要获得共享资源使用权就必须先获得互斥信号量(mutex),使用完后要释放
mutex。
消息队列是任务与任务间的通信,未接受到消息队列的任务会被暂时挂起,处于等待接受的状态。
OSTimeDly(),任务调用这个函数后就会被挂起直到期满。
二.单任务应用程序
多任务管理程序
统计任务
这部分可以参考UCOS-ii的
/article/1974b289a1ebd7f4b0f77469.html
进入OSStatTaskCPUUsageInit函数后会多次调用其他函数,最后进入OS_StatTaskInit函数,此函数会创建统计任务(鼠标一直往下拉到底就会看到任务创建,如下图),任务优先级默认为最大值-2.
进入任务函数,在任务函数中会主动计算结果,并提供用户接口,
内存管理
1.uC/OS-III 可以获得连续的内存块
2.不要在嵌入式系统中使用 malloc() 和 free() ,因为这样会导致内存碎片。
3.可以用 malloc() 动态的分配内存空间,但不要释放这些内存空间 。{ 就是说定义不需要释放的空间时可以使用 malloc() , 这样能使所定义的空间的利用率接近为 100%}
4.用户可以创建任意个内存分区(限制于处理器的 RAM ) 。
5.uC/OS-III 中与内存分区相关的函数都是以 OSMem???() 为前缀。
6.通过设置 OS_CFG.H 中的 OS_CFG_MEM_EN 为 1 开启内存管理服务。
7.OSMemCreate() 只能在任务级被调用, OSMemGet() 和 OSMemPut() 可以在 ISR 中使用, 因为这两个函数不会被阻塞且能快速地被执行 。
8.内存块的大小最好用 #defines 定义的宏常量代替。
创建内存分区和内存块
方法一:
方法二:
从内存分区申请内存块
应用代码通过调用 OSMemGet() 可以从内存分区中申请内存块。
释放内存块到内存分区
当用户对内存块的使用完毕后,必须将该内存块归还给对应的内分区。
调用 OSMemPut() 实现这个功能。
如何动态地分配内存
任务在内存分区被分配完时可以等待内存块 。 uC/OS-III 不支持任务等待内存分区 , 但是可以通过一个信号量用于内存分区中内存块的分配。如图:
( 1 ) 获得一个内存块时 , 先调用 OSSemPend() 获得一个信号量 ,
然后再调用 OSMemGet() 获得一个内存块。
( 2 ) 释放一个内存块时 , 先调用 OSMemPut() 释放这个内存块 ,
然后再调用 OSSemPost() 释放这个信号量。
上面的操作必须以这个顺序执行。
附录:UCOS-III API函数
任务管理
就绪列表
挂起队列
时间管理
信号量
消息队列
内存管理
主任务
主任务中创建多个子任务
您可能关注的文档
- H银行答辩PPT.ppt
- 看图说话1(低年级).ppt
- 化学品安全技术说明书,溴.doc
- TS质量手册.doc
- HZS120混凝土搅拌站安装方案.doc
- 化妆品车间环境、人员卫生及SOP培训.ppt
- 化学危险品的认知与防护.ppt
- 看听学_lesson43-44.ppt
- 化学基础知识下.doc
- IAR的使用.ppt
- 绿电2022年系列报告之一:业绩利空释放,改革推动业绩反转和确定成长.docx
- 化学化工行业数字化转型ERP项目企业信息化规划实施方案.pdf
- 【研报】三部门绿电交易政策解读:溢价等额冲抵补贴,绿电交易规模有望提升---国海证券.docx
- 中国债券市场的未来.pdf
- 绿电制绿氢:实现“双碳”目标的有力武器-华创证券.docx
- 【深度分析】浅析绿证、配额制和碳交易市场对电力行业影响-长城证券.docx
- 绿电:景气度+集中度+盈利性均提升,资源获取和运营管理是核心壁垒.docx
- 节电产业与绿电应用年度报告(2022年版)摘要版--节能协会.docx
- 2024年中国人工智能系列白皮书-智能系统工程.pdf
- 如何进行行业研究 ——以幼教产业为例.pdf
文档评论(0)